[Android systrace系列] 抓取開機過程systrace

zzc1024發表於2020-11-30

-------------------------------------------------------------------------

這篇文章的小目標:瞭解抓取開機過程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

相關文章