之前一直使用systrace的同學(xué)強烈建議嘗試下這個工具
一筛欢、perfetto介紹及特點
在Android 9.0(API級別28)或更高版本的設(shè)備上晃听,可以使用 systrace 在設(shè)備上記錄系統(tǒng)跟蹤。Perfetto 工具是Android下一代全新的統(tǒng)一的 trace 收集和分析框架介却,可以抓取平臺和app的 trace 信息谴供,是用來取代 systrace 的,但 systrace 由于歷史原因也還會一直存在齿坷,并且 Perfetto 抓取的 trace 文件也可以同樣轉(zhuǎn)換成 systrace 視圖桂肌,如果習(xí)慣用 systrace 的,可以用 Perfetto UI 的 Open with legacy UI 轉(zhuǎn)換成 systrace 視圖來看
1.1功能
功能分析:
·? 系統(tǒng)分析(適用于Linux和Android的系統(tǒng)范圍分析)Linux內(nèi)核跟蹤:捕獲高頻ftrace數(shù)據(jù):調(diào)度活動永淌,任務(wù)切換延遲崎场,CPU頻率等等用戶空間分析器和額外的探針:本機堆分析,Java堆分析遂蛀,/ proc狀態(tài)文件的輪詢器內(nèi)置于Android:自Android 9 Pie以來該平臺的一部分谭跨,也可在Linux上運行
·? 應(yīng)用追蹤高效的跟蹤點儀器:以高吞吐量,低開銷的跟蹤點記錄C ++應(yīng)用程序的活動結(jié)構(gòu)化和可配置的事件:定義自定義protobuf消息以表示強類型的應(yīng)用程序特定信息李滴,僅跟蹤您需要的信息與系統(tǒng)范圍的跟蹤集成:在同一時間線上將應(yīng)用程序的狀態(tài)與系統(tǒng)范圍內(nèi)的分析數(shù)據(jù)相關(guān)聯(lián)
·? 跟蹤查看器交互式痕跡探索:使用Perfetto UI記錄螃宙,查看和處理跟蹤數(shù)據(jù)支持流行的跟蹤格式文件:TraceEvent JSON,Android systrace所坯,ftrace文本輸出完全在您的瀏覽器中運行:不涉及服務(wù)器交互谆扎,即使您離線也可以工作
·? 痕量分析基于SQL的跟蹤模型:跟蹤處理器提取跟蹤并公開基于SQLite的接口以通過外殼和UI訪問跟蹤的內(nèi)容大痕量分析:支持高達數(shù)十GB的跟蹤可互操作的:可以導(dǎo)入和導(dǎo)出流行的跟蹤格式:Chromium JSON跟蹤格式,Android Systrace芹助,ftrace堂湖,CSV
1.2 Perfetto主要特點
<1>可以在線抓取長時間的 trace,可以長達一個小時状土,另外抓取的文件size也可以達到GB級別无蜂,這樣就可以在后臺開啟,讓它一直抓取trace了声诸,特別適用于那種復(fù)現(xiàn)概率很低酱讶,又比較嚴重的性能問題
<2>Perfetto具有很好的可擴展性,它除了提供標準的 tracepoints 之外彼乌,例如CPU調(diào)度信息泻肯,內(nèi)存信息等渊迁,還可以通過 atrace HAL 層擴展,在 Android P當(dāng)中灶挟,Google新增加了一個 atrace HAL 層琉朽,atrace 進程可以調(diào)用這個HAL的接口來獲取當(dāng)前的擴展信息,相關(guān)代碼可見 Google 提交稚铣,這樣如果需要擴展 tracepoints 的話箱叁,就可以按照 graphic 的示例添加即可
<3>提供全新的 Perfetto UI 網(wǎng)站,可以在上面通過選取開關(guān)的方式惕医,自動生成抓取 trace 的命令耕漱,同時可以打開 trace 文件。另外還集成了幾種預(yù)定義的 trace 分析統(tǒng)計工具抬伺,詳情可見它的 Metrics and auditors 選項
Perfetto本身是一個框架螟够,關(guān)于它的架構(gòu)和模塊的詳細介紹,可以參考它的 doc網(wǎng)站峡钓,它的源碼可以參考 Android Source Tree 的 /external/perfetto 目錄妓笙,里面有很多的tools和腳本,可以拿來直接使用
doc網(wǎng)站:https://docs.perfetto.dev/#/?id=perfetto-performance-instrumentation-and-tracing
二能岩、抓取trace
2.1? UI操作抓取trace[推薦]
2.1.1打開操作界面
方式1:在開發(fā)者選項中打開:
我的手機沒有找到這個選項寞宫。所以我自己寫了個應(yīng)用,啟動這個界面:
方式2:通過命令打開
adb shell am start com.android.traceur/com.android.traceur.MainActivity拉鹃,界面如下:
選中顯示“凱捷設(shè)置”圖塊辈赋,則會在控制中心中顯示快速抓取trace圖標:如下
那么下次要抓trace,直接點擊這個圖標可以了
2.1.2開始錄制
2.1.3數(shù)據(jù)保存位置 /data/local/traces
導(dǎo)出trace文件:
2.1.4如何查看trace文件
2.2命令行工具抓取trace
perfetto是一個命令行工具,在shell環(huán)境下執(zhí)行毛俏,同時在手機端也有兩個進程: traced 和 traced_probes,這兩個進程運行在手機端炭庙,可能需要執(zhí)行如下命令才會開啟這兩個進程饲窿,開啟這兩個進程之后煌寇,才能正常抓取trace信息
adb shell setprop persist.traced.enable 1
如果只是使用這個工具的話,只要懂得perfetto命令行工具的用法就可以了
參數(shù)使用
--out用來指定 trace 輸出文件逾雄,
--config用來指定配置阀溶,例如抓多長時間,間隔多久把內(nèi)存數(shù)據(jù)寫回文件鸦泳,抓取哪些 tracepoints 等等银锻,config 文件內(nèi)容,可以自己手動編寫做鹰,也可以用Perfetto UI網(wǎng)站生成击纬,另外在 Perfetto 里面默認集成了一個 test 配置,可以使用如下命令抓取一個使用 test config 的 trace 文件
//使用內(nèi)置的test配置钾麸,然后輸出到/data/misc/perfetto-traces/trace
$ adb shell perfetto --config :test --out /data/misc/perfetto-traces/trace
抓取完后更振,把/data/misc/perfetto-traces/trace文件內(nèi)容 pull 出來炕桨,然后使用 Perfetto UI 網(wǎng)站打開
adb shell chmod 777? /data/misc/perfetto-traces/trace
adb pull? /data/misc/perfetto-traces/trace .
2.3自定義Config[推薦]
目前最方便的配置文件生成方式是使用Perfetto UI網(wǎng)站來幫助生成,點擊 Record new trace 會看到有很多的配置界面
方式1:通過上面的步驟献宫,從而自動生成命令姊途,然后執(zhí)行
選擇想要的tracepoints之后负敏,點擊 Show Command友扰,將命令內(nèi)容拷貝出來直接在終端就可以執(zhí)行,完成之后把 /data/misc/perfetto-traces/trace 這個文件拷貝出來進行分析
adb shell perfetto \ -c - --txt \ -o /data/misc/perfetto-traces/trace \ <<EOF buffers: { size_kb: 8960 fill_policy: DISCARD } buffers: { size_kb: 1280 fill_policy: DISCARD } data_sources: { config { name: "linux.process_stats" target_buffer: 1 process_stats_config { scan_all_processes_on_start: true } } } data_sources: { config { name: "linux.sys_stats" sys_stats_config { stat_period_ms: 1000 stat_counters: STAT_CPU_TIMES stat_counters: STAT_FORK_COUNT } } } data_sources: { config { name: "linux.ftrace" ftrace_config { ftrace_events: "block/*" ftrace_events: "sched/sched_switch" ftrace_events: "power/suspend_resume" ftrace_events: "sched/sched_wakeup" ftrace_events: "sched/sched_wakeup_new" ftrace_events: "sched/sched_waking" ftrace_events: "power/cpu_frequency" ftrace_events: "power/cpu_idle" ftrace_events: "power/gpu_frequency" ftrace_events: "sched/sched_process_exit" ftrace_events: "sched/sched_process_free" ftrace_events: "task/task_newtask" ftrace_events: "task/task_rename" buffer_size_kb: 2048 drain_period_ms: 250 } } } duration_ms: 10000 EOF
復(fù)制到dos框梭域,進行執(zhí)行
方式2:網(wǎng)頁中直接連接設(shè)備,然后開始抓取
2.4 trace無法抓取解決方案:
<1>啟動跟蹤服務(wù)
由于Perfetto基于服務(wù)的體系結(jié)構(gòu) ,因此必須運行traced和traced_probes服務(wù)來記錄跟蹤。
自Android 9(Pie)起囊颅,這些服務(wù)默認情況下在Android系統(tǒng)映像中附帶先鱼,但默認情況下并非始終啟用串远。在Android 9(P)和10(Q)上伸但,這些服務(wù)默認情況下僅在Pixel手機上啟用,并且必須在其他手機上手動啟用。從Android 11(R)開始彪标,默認情況下当船,大多數(shù)設(shè)備上都啟用了perfetto服務(wù)苍息。
要啟用perfetto服務(wù),請運行:
# Will start both traced and traced_probes.
adb shell setprop persist.traced.enable 1
三铃肯、打開trace
3.1使用默認窗口打開trace[推薦步藕,畢竟是google推崇的]
3.2使用命令將perfetto的trace轉(zhuǎn)換為systrace分析
3.3使用舊版systrace界面分析
四立润、trace界面使用詳解
4.1快捷鍵
4.1放大
W鍵放大或者ctrl+滾輪
4.1 shift+m選中區(qū)域
4.1文字顯示線程的運行狀態(tài)丛晦,取締舊版的線程顏色
4.2選中框的含義
當(dāng)我們選中一段時間內(nèi)的幾個線程時仲器,還需要加入其他線程辆沦。就可以通過選擇復(fù)選框,來添加需要分析的線程或進程肢扯。然后整體查看這些線程的運行信息
4.3搜索
4.4關(guān)注的線程可用收藏號進行標記妒茬,便于上下翻動時快速找到
4.5查看Runnable被誰喚醒的方法
Perfetto查看runnable的喚醒方法和systrace不一樣,如下:
點擊runnable蔚晨,看不到是誰喚醒的乍钻。需要緊接著點擊:running