Jollen 的 Android Booting 解析, #3: 製作 Android Bootchart

jollen 發表於 August 3, 2010 11:15 AM

前一則日記提到的 Bootchart 是典型的開機量測工具,主要能進行開機過程以及開機時間的量測。由於 Bootchart 的原理是取代 init process 或是內建在 init process 裡,所以只能取得 initial script 的開機過程報告。不過,這已經很有幫助了。

關於 Android Bootchart

以下是一份使用 Bootchart 所製作的 Android 開機流程圖。過去有一些以 C 重寫 Bootchart 的專案,而 Android 也有一份 C re-implementation,放置於 [system/core/init/bootchart.c]。由此可知,Android init 已經內建一份 C re-implement 的 Bootchart。

android bootchart
圖一:使用 Bootchart 製作的 Android 開機流程圖

以下說明如何製作 Android Bootchart。

1. 編譯 Android Bootchart

Android 的 init process 雖然已內建 Bootchart,但編譯系統預設並不會將 Bootchart 編譯至 init 裡。因此,需要重新編譯 init.c 才能加入 Bootchart:

jollen@android:~/try/mokoid_elcair-20100511$ touch system/core/init/init.c
jollen@android:~/try/mokoid_elcair-20100511$ . build/envsetup.sh 
including vendor/aosp/vendorsetup.sh
jollen@android:~/try/mokoid_elcair-20100511$ m INIT_BOOTCHART=true PRODUCT-dma6410xp-eng -j 8
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=dma6410xp
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ECLAIR
============================================

完成後,使用 Android 模擬器開啟製作好的 image file。

2. 設定 Bootchart Timeout 時間

要讓 Bootchart 在「下一次開機」時開始運作,以進行取樣並紀錄開機過程,需要指定 Timeout 時間:

$ adb shell 'echo 120 > /data/bootchart-start'
$ adb shell 'mkdir /data/bootchart'

重新啟動模擬器。對 /data 目錄進行的變動,「可以」寫回 userdata.img 裡。這裡指定 Timeout 時間為 '120' 秒;實際測試時,可以視情況自由調整。

3. 取得 Bootchart 紀錄檔

在 Android 系統裡的 /data/bootchart 取得開機紀錄檔:

linux@android:~/android/mokoid$ adb shell
# ls -l /data/bootchart
-rw-rw-rw- root     root          389 2010-07-28 11:06 header
-rw-r--r-- root     root            0 2010-07-28 11:06 kernel_pacct
-rwxr-xr-x root     root       589824 2010-07-28 11:08 proc_diskstats.log
-rwxr-xr-x root     root      2293760 2010-07-28 11:08 proc_ps.log
-rwxr-xr-x root     root       196608 2010-07-28 11:07 proc_stat.log
# 

接下來,必須取出這幾個檔案,並製作成漂亮的統計圖檔。貼心的 Android 已經幫我們準備好一個 script 檔了,因此,先切換到 system/core/init 目錄下,直接執行 grab-bootchart.sh:

linux@android:~/android/mokoid$ cd system/core/init/
linux@android:~/android/mokoid/system/core/init$ ./grab-bootchart.sh 
7 KB/s (389 bytes in 0.048s)
1439 KB/s (405771 bytes in 0.275s)
2014 KB/s (3861856 bytes in 1.872s)
1936 KB/s (979391 bytes in 0.493s)
look at bootchart.tgz

最後的統計報告存放於 /tmp/android-bootchart/bootchart.tgz。

4. 製作精美 Bootchart 報告

Bootchart 包含一個以 Java 寫成的圖表製作工具,因此,還是必須取得原始的 Bootchart 套件。在 Ubuntu 環境下,可以用 apt 直接安裝:

$ sudo apt-get install bootchart

接著,將 bootchart.tgz 製作成圖檔:

$ java -jar /usr/share/bootchart/bootchart.jar /tmp/android-bootchart/bootchart.tgz
Parsing /tmp/android-bootchart/bootchart.tgz
Wrote image: ./bootchart.png

最後,得到如圖一的精美報告。接下來的工作,就是對 Bootchart 的內容進行分析。

延伸閱讀

2010.07.28: Jollen 的 Android Booting 解析, #1: 整體開機流程
2010.07.29: Jollen 的 Android Booting 解析, #2: 關於開機的評估
分享您的 Android Bootchart 筆記:Build Android Bootchart

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw