溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android內(nèi)核開發(fā):如何統(tǒng)計系統(tǒng)的啟動時間

發(fā)布時間:2020-08-05 12:14:37 來源:網(wǎng)絡(luò) 閱讀:13592 作者:Jhuster 欄目:移動開發(fā)

本文是《Android內(nèi)核開發(fā)》系列的第七篇文章,通過上一篇文章《Android內(nèi)核開發(fā):圖解Android系統(tǒng)的啟動過程》我們大致了解了Android系統(tǒng)的啟動過程,那么本文就從實(shí)踐的角度,簡單介紹一下如何統(tǒng)計Android系統(tǒng)的啟動時間。


這里所說的統(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ù),例如:


$ 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信息:


Android內(nèi)核開發(fā):如何統(tǒng)計系統(tǒng)的啟動時間


“boot_progress_start”代表著Android屏幕點(diǎn)亮,開始顯示啟動動畫,即15.492s開始閃爍Android字樣。


“boot_progress_enable_screen”代表著整個系統(tǒng)啟動結(jié)束,即用了29.986s,用這個總時間減去Linux Kernel的啟動時間即可得到Android OS部分的時間。


3.  小結(jié)


由于本文重點(diǎn)關(guān)注如何統(tǒng)計Android系統(tǒng)的啟動時間,因此,很多啟動log文件的分析就不做詳細(xì)展開了,下一篇文章將會對系統(tǒng)啟動的log做稍微詳細(xì)的分析。有任何疑問或者建議歡迎留言或者來信lujun.hust@gmail.com交流,或者關(guān)注我的新浪微博 @盧_俊 獲取最新的文章和資訊。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI