Android Boot timing properity
Init records some boot timing information in system properties.
`ro.boottime.init`
> Time after boot in ns (via the CLOCK\_BOOTTIME clock) at which the first stage of init started.
`ro.boottime.init.selinux`
> How long it took the first stage to initialize SELinux.
`ro.boottime.init.cold_boot_wait`
> How long init waited for ueventd's coldboot phase to end.
`ro.boottime.<service-name>`
> Time after boot in ns (via the CLOCK\_BOOTTIME clock) that the service was first started.
Android 啓動時間分析工具
- bootchart工具
在Android O當中,bootchart已經默認集成在Init當中。所以收集數據可以用以下步驟:
- 只需要你通過開關打開即可生效:adb shell 'touch /data/bootchart/enabled'
- 重啓設備
- $ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh抓取數據生成一張png圖片,即可進行分析。
但是如果碰到bootchart工具不能使用的情況,就需要自己下載bootchart源碼:http://www.bootchart.org/download.html,解壓後:
- ant編譯bootchart.jar
- java -jar bootchart.jar bootchart.tgz 生成分析結果的PNG圖片
- compare-bootcharts.py腳本
這個腳本用來對比兩個bootchart圖。
通過compare-bootcharts.py腳本對比所選兩個進程的開始結束時間點,從而得到對應進程之間的耗時差距。
當我們使用grab-bootchart.sh腳本獲取對應的bootcahrt圖時,會在PC的/tmp/android-bootchart目錄下留下bootchart.tgz壓縮包.
然後將所要比較的兩個bootchart的壓縮包放在兩個不同的目錄base_bootchart_dir, exp_bootchart_dir.
執行如下命令: system/core/init/compare-bootcharts.py base_bootchart_dir exp_bootchart_dir
就可以得到如下信息:
process: baseline experiment (delta) - Unit is ms (a jiffy is 10 ms on the system)
------------------------------------
/init: 50 40 (-10)
/system/bin/surfaceflinger: 4320 4470 (+150)
/system/bin/bootanimation: 6980 6990 (+10)
zygote64: 10410 10640 (+230)
zygote: 10410 10640 (+230)
system_server: 15350 15150 (-200)
bootanimation ends at: 33790 31230 (-2560)
可以看到開機動畫一個結束時間爲33790ms , 一個爲31230ms ,兩者相差2560ms
- analyze_boot.py
腳本位置: $KERNEL/tools/power/pm-graph/
- cmdline增加 initcall_debug log_buf_len=16M
- dmesg > dmesg.txt
- ./analyze_boot.py -dmesg dmesg.txt
最後會生成 bootgraph.html 用chrome打開查看
- perfboot
perfboot工具是個Python的腳本,在AOSP/system/core/init/目錄下,通過運行./perfboot.py -h
可以看到相關參數,運行perfboot需要在編譯環境下,因爲perfboot的運行需要依賴AOSP/development/python-packages/adb/目錄下的相關模塊。
獲取記錄開機時間點的文件:./perfboot.py --iterations=2 --interval=30 -v --output=/tmp/data.tsv
,相關參數的意思可以參考說明,腳本執行結束後,可以打開文件進行分析。
如果出現報錯說明找不到adb模塊,此時在AOSP/system/core/init/目錄下執行命令無法找到AOSP/development/python-packages/adb/目錄的依賴,解決辦法可以使拷貝adb目錄和perfboot.py放到同級目錄下,然後執行命令。
Traceback (most recent call last):
File "./perfboot.py", line 55, in <module>
import adb
ImportError: No module named adb
或者工程先lunch一下,否則有可能出現ImportError: No module named adb
釋義:
name | description |
---|---|
boot_progress_start | 代表着Android屏幕點亮,開始顯示啓動動畫. 系統進入用戶空間,標誌着kernel啓動完成 |
boot_progress_preload_start | Zygote啓動 |
boot_progress_preload_end | Zygote結束 |
boot_progress_system_run | SystemServer ready,開始啓動Android系統服務,如PMS,APMS等 |
boot_progress_pms_start | PMS開始掃描安裝的應用 |
boot_progress_pms_system_scan_start | PMS先行掃描/system目錄下的安裝包 |
boot_progress_pms_data_scan_start | PMS掃描/data目錄下的安裝包 |
boot_progress_pms_scan_end | PMS掃描結束 |
boot_progress_pms_ready | PMS就緒 |
boot_progress_ams_ready | AMS就緒 |
boot_progress_enable_screen | AMS啓動完成後開始激活屏幕,從此以後屏幕才能響應用戶的觸摸,它在WindowManagerService發出退出開機動畫的時間節點之前,而真正退出開機動畫還會花費少許時間,具體依賴animation zip 包中的desc.txt。wm_boot_animation_done纔是用戶感知到的動畫結束時間節點 |
sf_stop_bootanim | SF設置service.bootanim.exit屬性值爲1,標誌系統要結束開機動畫了,可以用來跟蹤開機動畫結尾部分消耗的時間 |
wm_boot_animation_done | 開機動畫結束,這一步用戶能直觀感受到開機結束 |
根據以上log可以清楚的計算出每個步驟所用時間:
- Kernel part : boot_progress_start
- Zygote time : boot_progress_preload_end - boot_progress_preload_start
- /system Scan time : boot_progress_pms_data_scan_start - boot_progress_pms_system_scan_start
- /data Scan time : boot_progress_pms_scan_end- boot_progress_pms_data_scan_start
- Home activity start time : boot_progress_enable_screen- boot_progress_ams_ready