环境ubuntu 14.04 + android 4.3/5.1
1. bootchart编译:
bootchart 源代码位于:\system\core\init\bootchart.c,查看Android.mk:
INIT_BOOTCHART := true
ifeq ($(strip $(INIT_BOOTCHART)),true)
LOCAL_SRC_FILES += bootchart.c
LOCAL_CFLAGS += -DBOOTCHART=1
endif
INIT_BOOTCHART设置为true,表示将其编译至img中。
2. bootchart启动:
BOOTCHART控制init进程初始启动bootchart_init,因此需要将该变量置为1
#if BOOTCHART
queue_builtin_action(bootchart_init_action, "bootchart_init");
#endif
在bootchart.h中定义了此变量:
#ifndef BOOTCHART
# define BOOTCHART 1
#endif
编译boot.img:
make bootimage
烧写完毕,或者dd命令写入boot分区:
dd if=/mnt/media_rw/udisk1/boot.img of=/dev/block/mmcblk0p7
boot分区查看方式,mtk芯片:
ll /dev/block/platform/mtk-msdc.0/by-name/
lrwxrwxrwx root root 2010-01-01 08:00 boot -> /dev/block/mmcblk0p7
lrwxrwxrwx root root 2010-01-01 08:00 cache -> /dev/block/mmcblk0p21
lrwxrwxrwx root root 2010-01-01 08:00 expdb -> /dev/block/mmcblk0p10
关于bootchart_init:
proc_read( LOG_STARTFILE, buff, sizeof(buff) );
...
int fd = open( LOG_ACCT, O_WRONLY|O_CREAT|O_TRUNC,0644);
其中:
/data/bootchart-start:bootchart记录信息从开启到结束的持续时间。
/data/bootchart:记录信息的存储位置
烧写完毕,启动机器后:
echo 50 > /data/bootchart-start
记录开机50s的启动情况。
拷贝/data/bootchart下的所有文件至ubuntu系统。
3.Android 5.1的修改:
上述修改后不能生成bootchart数据,原因在于data分区挂载时机慢于bootchart保存数据,导致数据没有保存成功。需要修改bootchart.c,将保存数据的目录修改为dev目录,该目录的挂载时间靠前。修改如下:
#define VERSION "0.8"
#define SAMPLE_PERIOD 0.2
#define LOG_ROOT "/data/bootchart"
—>#define LOG_ROOT "/dev/bootchart"
……
proc_read( "/proc/cmdline", cmdline, sizeof(cmdline) );
s = strstr(cmdline, KERNEL_OPTION);
//将记录时间写死180s,添加以下赋值:
timeout = 180;
4. bootchart输出:
ubuntu安装bootchart:
sudo apt-get install bootchart
进入bootchart的记录信息目录,执行压缩:
tar zcvf bootchart.tgz *
执行bootchart输出图片:
bootchart bootchart.tgz
这里会提示出错,这是因为安装bootchart有bug,需要修正:
修改ubuntu下/usr/share/pyshared/pybootchartgui/目录的draw.py,parsing.py,samples.py三个文件,分别修改如下:
draw.py:
将200,201行由:
xscale = float(chart_bounds[2]) / max(x for (x,y) in data)
yscale = float(chart_bounds[3]) / max(y for (x,y) in data)
改为:
xscale = float(chart_bounds[2]) / max(0.00001, max(x for (x,y) in data))
yscale = float(chart_bounds[3]) / max(0.00001, max(y for (x,y) in data))
parsing.py:
在156行后添加:
if interval == 0:
interval = 1
修改后如下:
sums = [ a - b for a, b in zip(sample1.diskdata, sample2.diskdata) ]
if interval == 0:
interval = 1
samples.py:
在81行后添加:
if interval == 0:
interval = 1
修改后如下:
def calc_load(self, userCpu, sysCpu, interval):
if interval == 0:
interval = 1
修改完毕后重新执行bootchart bootchart.tgz