-------------------------------------------------------------------------
這篇文章的小目標:瞭解抓取開機過程systrace的步驟
-------------------------------------------------------------------------
手機開機的過程,涉及的程式碼很多,如果能用systrace來分析,事半功倍。
首先分解開機各階段的耗時,方便後續對照。
只需要在events log過濾boot_progress關鍵字,就可以得出開機各階段的耗時。
device:/ $ logcat -b events | grep boot_progress
07-17 08:33:00.241 400 400 I boot_progress_start: 4826
11-29 09:53:34.968 400 400 I boot_progress_preload_start: 7577
11-29 09:53:36.154 400 400 I boot_progress_preload_end: 8763
11-29 09:53:36.519 2072 2072 I boot_progress_system_run: 9127
11-29 09:53:37.088 2072 2072 I boot_progress_pms_start: 9697
11-29 09:53:37.238 2072 2072 I boot_progress_pms_system_scan_start: 9847
11-29 09:53:37.402 2072 2072 I boot_progress_pms_data_scan_start: 10011
11-29 09:53:37.430 2072 2072 I boot_progress_pms_scan_end: 10039
11-29 09:53:37.925 2072 2072 I boot_progress_pms_ready: 10533
11-29 09:53:39.394 2072 2072 I boot_progress_ams_ready: 12003
11-29 09:53:41.324 2072 2637 I boot_progress_enable_screen: 13933
在操作抓取systrace之前,不妨先參考 [Android systrace系列] systrace的資訊從哪裡來,來熟悉systrace log類別的掩碼,和ftrace事件的路徑。
下面來說明抓取開機systrace的步驟,這裡需要編譯手機的userdebug版本
1. 全域性搜所有rc檔案,將所有關閉trace的命令註釋,例如這一句 #write /sys/kernel/debug/tracing/instances/wifi/tracing_on 0
修改完rc檔案後,編譯手機ROM。
技巧:可以編完一次手機ROM之後,只在out資料夾搜rc檔案,縮小搜尋範圍,然後修改重編。
2. 修改build.prop,並push到手機
2.1 首先提取手機上的build.prop
adb pull /system/build.prop
2.2 新增屬性debug.atrace.tags.enableflags,數值為掩碼,使能需要的systrace category。
掩碼可參考原始碼//android/system/core/libcutils/include/cutils/trace.h中,ATRACE_TAG開頭的巨集定義。
debug.atrace.tags.enableflags可以是0x開頭的十六進位制,也可以用0開頭的8進位制,或者非0卡開頭的十進位制。
debug.atrace.tags.enableflags=0xC402A
2.3 將buid.prop重新push到手機
adb root
adb remount
adb push build.prop /system/
提示:也可以在device.mk新增屬性debug.atrace.tags.enableflags,然後編譯手機ROM
3. 修改atrace.rc,並push到手機
3.1 首先提取手機上的atrace.rc
adb pull /system/etc/init/atrace.rc
在更改buffer許可權的下一行,擴大buffer大小 ,以便容納足夠長時間的log
chmod 0666 /sys/kernel/debug/tracing/buffer_size_kb write /sys/kernel/debug/tracing/buffer_size_kb 51200
3.2 選擇需要抓取的kernel ftrace event。
可以先關閉所有開關,就是手機目錄 /sys/kernel/debug/tracing/events/ 下所有的trace,下面只列舉四行作為例子
write /sys/kernel/debug/tracing/events/power/enable 0 write /sys/kernel/debug/tracing/events/sched/enable 0 write /sys/kernel/debug/tracing/events/vmscan/enable 0 write /sys/kernel/debug/tracing/events/block/enable 0
再開啟需要的開關,可以參考atrace.cpp的陣列 k_categories
write /sys/kernel/debug/tracing/events/power/cpu_frequency/enable 1 write /sys/kernel/debug/tracing/events/power/idle/enable 1 write /sys/kernel/debug/tracing/events/sched/sched_switch/enable 1 write /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable 1 write /sys/kernel/debug/tracing/events/block/block_rq_issue/enable 1 write /sys/kernel/debug/tracing/events/block/block_rq_complete/enable 1
3.3 正如第1點所說,atrace.rc中,要註釋關閉 trace 的命令,因為開機過程的trace是預設關閉的。
#write /sys/kernel/debug/tracing/tracing_on 0 #write /sys/kernel/tracing/tracing_on 0
3.4 為了避免開機完成後繼續輸出 trace 沖掉開機 log,開機完成後停止trace,在atrace.rc的最後面加入下面兩行:
這裡注意不要在3.3所說的兩行上面加,因為on property會被認為是另一個 action 塊的開頭
on property:sys.boot_completed=1 write /sys/kernel/debug/tracing/tracing_on 0
3.5 將 atrace.rc push 到 /system/etc/init/atrace.rc
adb root
adb remount
adb push atrace.rc /system/etc/init/atrace.rc
4. 重啟開機,執行adb shell "cat /sys/kernel/debug/tracing/trace" > trace.out
這時可以嘗試在 chrome://tracing 點選Load載入 trace.out。
提示:檔案太大,或者個別log的不完整,會導致載入失敗。
如果載入出錯,請繼續下面的步驟。
5. (可選步驟)太大的 trace.out 檔案,可以以純文字方式,切割出需要分析的啟動階段,單獨儲存成part.out,再嘗試載入。
6. 因不完整 log 而載入失敗的 trace 檔案(無論切割過或未切割),可以用 trace2html.py 轉化,而不是 systrace.py,因為後者也會發生錯誤
首先下載catapult,https://github.com/catapult-project/catapult
trace2html.py路徑://catapult/tracing/bin/ trace2html.py
轉化命令是 trace2html.py trace.out
轉載請註明出處:https://www.cnblogs.com/zzcperf/p/14054555.html