使用 Perfetto 分析問題跟使用 Systrace 分析問題的步驟是一樣的:
- 首先你需要抓取 Perfetto 檔案
- 在ui.perfetto.dev 中開啟 Trace 檔案進行分析或者使用命令列來進行分析
這篇文章就簡單介紹一下使用 Perfetto 抓取 Trace 檔案的方法,個人比較推薦使用命令列來抓取,不管是自己配置的命令列還是官方的命令列抓取工具,都非常實用。
1. 使用命令列來抓取 Perfetto(推薦)
基本命令 - adb shell perfetto
對於之前一直用 Systrace 工具的小夥伴來說,命令列抓取 Trace 非常方便。同樣,Perfetto 也提供了簡單的命令列來抓取,最簡單的使用方法與 Systrace 基本一致。你可以直接連到你的 Android 裝置上使用/system/bin/perfetto
命令來啟動跟蹤。例如:
//1. 首先執行命令
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
// 2. 操作手機,復現場景,比如滑動或者啟動等
// 3. 將 trace 檔案 pull 到本地
adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace
這個命令會啟動一個 20 秒鐘的跟蹤,收集指定的資料來源資訊,並將跟蹤檔案儲存到/data/misc/perfetto-traces/trace_file.perfetto-trace
。
執行 adb pull 命令把 trace pull 出來,就可以直接在ui.perfetto.dev 上開啟了。
進階命令 adb shell perfetto with config file
這裡就是 Perfetto 與 Systrace 不同的地方,Perfetto 可以抓取的資訊非常多,其資料來源也非常多,每次都用命令列加一大堆配置的話會很不方便。這時候我們就可以使用一個單獨的配置檔案(Config),來儲存這些資訊,每次抓取的時候,指定這個配置檔案即可。
對於在 Android 12 之前和之後版本上使用 Perfetto 的配置檔案傳遞,以下是詳細的指南和對應的命令列示例。
在 Android 12 及之後的裝置上
從 Android 12 開始,可以直接使用/data/misc/perfetto-configs
目錄來儲存配置檔案,這樣就不需要透過 stdin 來傳遞配置檔案了。具體命令如下:
adb push config.pbtx /data/misc/perfetto-configs/config.pbtx
adb shell perfetto --txt -c /data/misc/perfetto-configs/config.pbtx -o /data/misc/perfetto-traces/trace.perfetto-trace
在這個例子中,首先將配置檔案config.pbtx
推送到/data/misc/perfetto-configs
目錄中。然後,直接在 Perfetto 命令中透過-c
選項指定配置檔案的路徑來啟動跟蹤。
在 Android 12 之前的裝置上
由於 SELinux 的嚴格規則,直接透過檔案路徑傳遞配置檔案在非 root 裝置上會失敗。因此,需要使用標準輸入(stdin)來傳遞配置檔案。這可以透過將配置檔案的內容cat
到 Perfetto 命令中實現。具體命令如下:
adb push config.pbtx /data/local/tmp/config.pbtx
adb shell 'cat /data/local/tmp/config.pbtx | perfetto -c - -o /data/misc/perfetto-traces/trace.perfetto-trace'
這裡,config.pbtx是你的 Perfetto 配置檔案,首先使用adb push命令將其推送到裝置的臨時目錄中。然後,使用cat命令將配置檔案的內容傳遞給 Perfetto 命令。
Config 的來源
Config 我建議使用 ui.perfetto.dev 的 Record new trace 這裡進行選擇定製,然後再儲存到本地的檔案裡面,不同的場景就載入不同的 Config 即可,文章最後一部分有詳細講到這部分,感興趣的可以看一下。
官方也提供了 share 按鈕,你可以把你自己的 config share 給其他人,非常方便。同時我也會建了一個 Github 的庫,方便大家在分享(進行中)。
官方程式碼庫也有一些已經配置好的,各位可以下下來自己使用:https://cs.android.com/android/platform/superproject/main/+/main:external/perfetto/test/configs/
注意事項
-
確保 adb 正常:在使用這些命令之前,請確保你的裝置已經啟用了 USB 除錯,並且已經透過adb devices命令確認裝置已經正確連線。
Ctrl+C 中斷: 當使用adb shell perfetto命令時,如果你嘗試使用 Ctrl+C 來提前結束跟蹤,這個訊號不會透過 ADB 傳播。如果你需要提前結束跟蹤,建議使用一個互動式的 PTY-based session 來執行adb shell。 -
SELinux 限制: 在 Android 12 之前的非 root 裝置上,由於 SELinux 的嚴格規則,配置檔案只能透過cat config | adb shell perfetto -c -的方式傳遞(其中-c -表示從標準輸入讀取配置)。從 Android 12 開始,可以使用/data/misc/perfetto-configs路徑來儲存配置檔案。
-
在 Android 10 之前的版本, adb 沒法直接把 /data/misc/perfetto-traces pull 出來. 你可以使用 adb shell cat /data/misc/perfetto-traces/trace > trace 來替代
2. 使用 Perfetto 提供的官方指令碼抓取(強烈推薦)
Perfetto 團隊還提供了一個便捷的指令碼tools/record_android_trace,它簡化了從命令列記錄跟蹤的流程。這個指令碼會自動處理路徑問題,完成跟蹤後自動拉取跟蹤檔案,並在瀏覽器中開啟它。本質上這個指令碼還是使用的 adb shell perfetto 命令,不過官方幫你封裝好了,使用示例:
On Linux and Mac:
curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/record_android_trace
chmod u+x record_android_trace
./record_android_trace -o trace_file.perfetto-trace -t 10s -b 64mb \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
On Windows:
curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/record_android_trace
python3 record_android_trace -o trace_file.perfetto-trace -t 10s -b 64mb \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory