本文针对Android系统Bootchart部分源码进行了分析,并给出了Android-5、6-7、8+版本的参数差异,解释了8+以上的时长无法手动控制的原因,并对bootchart源码进行了分析
研究背景
主要是网上的资料,关于如何控制采集bootchart时长的方法不一,且尝试过几种方法均无法控制后,遂看了下Android中bootchart源码,分析了生成header、proc_diskstats、proc_ps、proc_stat的过程。
已有的时长控制的方法:
echo $TIME_OUT > /data/bootchart/start
其中的$TIME_OUT
为时长,比如采集50s,echo 50 > /data/bootchart/start
echo $TIME_OUT> /data/bootchart-start
与方法1一致,$TIME_OUT
为时长。
测试了下,针对我的手机+虚拟机,两种方法均无法控制时长,所以看了下Android源码,分析了下原因。
采集时长控制
通过查看Android源码,发现针对Android-5、6-7、8+版本中bootchart生成变化较多,针对差异较大的时长进行了分析。
Android 5
先上源码链接bootchart.c,bootchart.h,挑出关于时间控制的源码。
- 宏定义文件名
#define LOG_STARTFILE "/data/bootchart-start"
- 如果
/data/bootchart-start
文件中有数值,且不为0,设置timeout
buff[0] = 0;
proc_read( LOG_STARTFILE, buff, sizeof(buff) );
if (buff[0] != 0) {
timeout = atoi(buff);
}
- 如果
/data/bootchart-start
文件中timeout超过10*60,则设置timeout为10*60。再将timeout转化为具体的count,通过采集的index去跳出采集。
# define BOOTCHART_MAX_TIME_SEC (10*60) /* max polling time in seconds */
# define BOOTCHART_POLLING_MS 200 /* polling period in ms */
if (timeout == 0)
return 0;
if (timeout > BOOTCHART_