環境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