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

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