安卓的 bootchart 是如何工作的
想要分析安卓的啟動(dòng)過程中的詳細(xì)信息,比如耗時(shí)、CPU/IO占用情況,我們可以通過這樣一條命令
然后重啟安卓設(shè)備。開機(jī)之后,執(zhí)行命令
這個(gè) sh 腳本長(zhǎng)這個(gè)樣子
腳本做的事情實(shí)際上就是,把安卓上邊的 /data/bootchart 文件夾拉取下來之后,通過 tar 命令把文件夾內(nèi)的 header proc_stat.log proc_ps.log proc_diskstats.log 壓縮成一個(gè) tgz 文件,然后交給 pybootchartgui 處理成一個(gè)png。這個(gè)png圖片里面就會(huì)顯示安卓啟動(dòng)過程的信息了。
通常,你能得到這樣一張類似這樣的圖片(下圖是小米手機(jī)的示例)

bootchart 是如何工作的呢?
查看 init.rc
這里可以看到,bootchart 每次開機(jī)的時(shí)候都 start 一下,這里是做了什么事情呢?
從文件 system/core/init/bootchart.cpp 里面可以看到
從這里可以看出來,如果識(shí)別到第 1 個(gè)參數(shù)是 start,執(zhí)行了 do_bootchart_start ,do_bootchart_start 內(nèi)又判斷文件`/data/bootchart/enabled`,如果文件存在則開了一個(gè)線程執(zhí)行 bootchart_thread_main ,這個(gè)函數(shù)體內(nèi)容如下
可以看到,這里開了一個(gè)循環(huán),每過 200ms ,檢查一下 g_bootcharting_finished 是否為 true,不為 true 則讀取一邊系統(tǒng)的節(jié)點(diǎn)
state_log --> /proc/state
disk_log --> /proc/diskstats
proc_log 則是讀取一遍 /proc/pid/cmdline和stat。
bootchart 什么時(shí)候停止呢?
回到 init.rc
從這里知道,bootchart 在屬性 sys.boot_completed 變?yōu)?1 時(shí)停止記錄。
停止記錄時(shí),init 將 g_bootcharting_finished 置為 false,跳出,于是記錄log的線程停止。
那么什么時(shí)候 sys.boot_completed 變成 1 呢?
查看文件 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
安卓啟動(dòng)完成時(shí),這個(gè)屬性被設(shè)置為 1 ,于是 bootchart 停止記錄這個(gè)時(shí)候,應(yīng)用會(huì)收到開機(jī)完成的廣播。。安卓啟動(dòng)流程可以上網(wǎng)查閱,本文不再敘述。