轉(zhuǎn)自:https://my.oschina.net/learnbo/blog/789645并表示感謝拱撵!
這里所說的統(tǒng)計系統(tǒng)的啟動時間逢防,并不是簡單地用秒表和肉眼來統(tǒng)計犀农,而是通過分析系統(tǒng)輸出的log信息來統(tǒng)計龄广,這樣才顯得更加專業(yè)硫眯。
首先了解2個概念:
(1)Android是基于Linux內(nèi)核的系統(tǒng),因此Android的啟動過程是分為兩個階段的择同,第一個階段就是Linux內(nèi)核的啟動两入,第二個階段就是Android框架的啟動(包括核心服務(wù)和程序)。
(2)Android的log系統(tǒng)是獨(dú)立于Linux內(nèi)核的log系統(tǒng)的敲才。Linux內(nèi)核通過printk打印的log信息裹纳,這些log寫入到了/dev/kmsg文件中,在Shell終端可以通過dmesg命令查看這些log信息紧武。Android框架則是通過Logger驅(qū)動打印log信息剃氧,這些log并沒有歸并到kmesg文件中,而是單獨(dú)存儲的阻星,位于/dev/log目錄下朋鞍,在Shell終端可以通過logcat命令來查看。
下面我們分別從兩種log信息中找到如何統(tǒng)計系統(tǒng)啟動時間的方法妥箕。
1. ?通過dmesg信息統(tǒng)計系統(tǒng)啟動時間
首先番舆,我們通過dmesg命令抓取Linux內(nèi)核的log信息(部分系統(tǒng)可能需要先執(zhí)行 adb root):
$ adb shell dmesg > dmesg.txt
Linux內(nèi)核啟動完成,一般都有如下的標(biāo)準(zhǔn)輸出信息:
<6> [ 6.613861] Freeing init memory: 176K
因此矾踱,只要我們在dmesg.txt文件中找到“Freeing init memory”這一行即可恨狈,從上面的log可以看出,Linux內(nèi)核啟動只用了6.613861s呛讲。
那么禾怠,如何找到Android系統(tǒng)啟動完成的標(biāo)志呢?
很多Android設(shè)備在系統(tǒng)啟動完成后贝搁,會在內(nèi)核log中打印如下信息:
<6>[ 29.913726] init: processing action 0x96bb8 (property:sys.boot_completed=1)
因此吗氏,找到“boot_completed”這一行也就得到了整個系統(tǒng)的啟動時間了,從這一行可以看出雷逆,整個系統(tǒng)啟動用了29.913726s弦讽。
當(dāng)然,并不是所有的Android設(shè)備都會打印出這條log,因此往产,我們一般用下面介紹的方法來專門統(tǒng)計Android系統(tǒng)的啟動時間被碗,
2. ?通過logcat統(tǒng)計系統(tǒng)的啟動時間
文章開頭我們已經(jīng)介紹過,Android的log系統(tǒng)是獨(dú)立于Linux內(nèi)核log系統(tǒng)的仿村,通過在終端輸入adb shell 進(jìn)入Android系統(tǒng)锐朴,cd到/dev/log目錄,你會發(fā)現(xiàn)里面有四個文件蔼囊,分別是:events焚志,main,radio畏鼓,system.
Android系統(tǒng)把Log分為了四類酱酬,不同的類別記錄不同的Log信息:
main - 主要的Log信息,大部分應(yīng)用級別的Log信息都在這里
events - 系統(tǒng)事件相關(guān)的Log信息
radio ? - 無線/電話相關(guān)的Log信息
system - 低級別的系統(tǒng)調(diào)試Log信息
默認(rèn)通過logcat抓取的是main信息云矫,如果想抓取指定類別的log信息的方法岳悟,在logcat命令后加-b參數(shù),例如:
1
2
3
4
$?adb?logcat?-d?-v?time-b?"main">??main.txt
$?adb?logcat?-d?-v?time-b?"events">??events.txt
$?adb?logcat?-d?-v?time-b?"system">??system.txt
$?adb?logcat?-d?-v?time-b?"radio">??radio.txt
關(guān)于Android Log系統(tǒng)的分類泼差,你可以訪問如下頁面詳細(xì)了解:《Android Logging System》
那么,如何統(tǒng)計Android系統(tǒng)的啟動時間呢呵俏?
我們可以重點(diǎn)關(guān)注events類別的log信息堆缘,通過如下命令:
$ adb logcat -d -b events | grep "boot"
如圖所示,這是我在高通的APQ8064開發(fā)板上抓取的log信息:
“boot_progress_start”代表著Android屏幕點(diǎn)亮普碎,開始顯示啟動動畫吼肥,即15.492s開始閃爍Android字樣。
“boot_progress_enable_screen”代表著整個系統(tǒng)啟動結(jié)束麻车,即用了29.986s缀皱,用這個總時間減去Linux Kernel的啟動時間即可得到Android OS部分的時間。