Android Perfetto 系列 2:Perfetto Trace 抓取

yooooooo發表於2024-06-26

使用 Perfetto 分析問題跟使用 Systrace 分析問題的步驟是一樣的:

  1. 首先你需要抓取 Perfetto 檔案
  2. 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.devRecord 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

相關文章