1.bootchart的启动过程

bootchart的启动时在init.rc中被解析,然后在on post-fs-data阶段data分区挂载之后开启,当收到sys.boot_completed属性置1之后,结束采集bootchart。

1
2
3
4
5
6
7
8
9
10
on post-fs-data
......
# Start bootcharting as soon as possible after the data partition is
# mounted to collect more data.
mkdir /data/bootchart 0755 shell shell
bootchart start

# 这里由于系统车机系统定制了,采集的bootchart时间只有20s左右特别短,需要自定义一个属性,开发早期需要看到launcher起来了,手动设置一个属性关闭bootchart
on property:sys.boot_completed=1
bootchart stop

2.采集bootchart开关

1
2
3
4
5
6
7
8
9
10
11
12
static Result<Success> do_bootchart_start() {
// We don't care about the content, but we do care that /data/bootchart/enabled actually exists.
// 只要/data/bootchart/enabled文件存在,就开启一个线程开始统计bootchart
std::string start;
if (!android::base::ReadFileToString("/data/bootchart/enabled", &start)) {
LOG(VERBOSE) << "Not bootcharting";
return Success();
}

g_bootcharting_thread = new std::thread(bootchart_thread_main);
return Success();
}

3.制作bootchart图片

采集结束之后,会在/data/bootchart目录生成header,proc_diskstats.log,proc_ps.log,proc_stat.log这四个文件,将这四个文件从车机pull出来导入服务器。

1
2
3
# 使用tar -czf bootchart.tgz *,打包所有文件成bootchart.tgz
jieou@gxatek-fw-no:/work/jieou/tools/bootchart$ ls
bootchart.tgz enabled header proc_diskstats.log proc_ps.log proc_stat.log
1
2
# 使用bootchart 工具生成图片
bootchart bootchart.tgz

4.生成结果

从结果里面看到其实还有很多服务都没有启动结束,而且launcher都没有启动起来。因此就需要第一小节中提到的,需要修改bootchart采集结束的属性,通过手动结束结束bootchart

bootchart.png

5.修改之后的bootchart

bootchart.png