安卓的 bootchart 是如何工作的
想要分析安卓的启动过程中的详细信息,比如耗时、CPU/IO占用情况,我们可以通过这样一条命令
然后重启安卓设备。开机之后,执行命令
这个 sh 脚本长这个样子
脚本做的事情实际上就是,把安卓上边的 /data/bootchart 文件夹拉取下来之后,通过 tar 命令把文件夹内的 header proc_stat.log proc_ps.log proc_diskstats.log 压缩成一个 tgz 文件,然后交给 pybootchartgui 处理成一个png。这个png图片里面就会显示安卓启动过程的信息了。
通常,你能得到这样一张类似这样的图片(下图是小米手机的示例)

bootchart 是如何工作的呢?
查看 init.rc
这里可以看到,bootchart 每次开机的时候都 start 一下,这里是做了什么事情呢?
从文件 system/core/init/bootchart.cpp 里面可以看到
从这里可以看出来,如果识别到第 1 个参数是 start,执行了 do_bootchart_start ,do_bootchart_start 内又判断文件`/data/bootchart/enabled`,如果文件存在则开了一个线程执行 bootchart_thread_main ,这个函数体内容如下
可以看到,这里开了一个循环,每过 200ms ,检查一下 g_bootcharting_finished 是否为 true,不为 true 则读取一边系统的节点
state_log --> /proc/state
disk_log --> /proc/diskstats
proc_log 则是读取一遍 /proc/pid/cmdline和stat。
bootchart 什么时候停止呢?
回到 init.rc
从这里知道,bootchart 在属性 sys.boot_completed 变为 1 时停止记录。
停止记录时,init 将 g_bootcharting_finished 置为 false,跳出,于是记录log的线程停止。
那么什么时候 sys.boot_completed 变成 1 呢?
查看文件 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
安卓启动完成时,这个属性被设置为 1 ,于是 bootchart 停止记录这个时候,应用会收到开机完成的广播。。安卓启动流程可以上网查阅,本文不再叙述。