Android 啓動時間優化

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,解壓後:

  1. ant編譯bootchart.jar 
  2. 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/

  1. cmdline增加 initcall_debug log_buf_len=16M 
  2. dmesg > dmesg.txt
  3. ./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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章