Android bootchart 开机启动优化

环境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: <br>  
                interval = 1

修改完毕后重新执行bootchart bootchart.tgz

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章