android 開機(jī)慢問題分析

項(xiàng)目中經(jīng)常遇到開機(jī)慢的問題,根據(jù)經(jīng)驗(yàn)總結(jié)了以下幾點(diǎn)原因(MTK 平臺):

第一時(shí)間查看log中的bootprof文件,里面清楚標(biāo)記了開機(jī)各個(gè)階段所花的時(shí)間,縮小排查范圍

1.如果僅僅是第一次開機(jī)慢,首先注意是不是WITH_DEXPREOPT沒有打開,以及跟odex有關(guān)的宏DONT_DEXPREOPT_PREBUILTS需要關(guān)閉

2.第一步操作已經(jīng)做過,或者非第一次開機(jī),正常開機(jī)就很慢的情況下,需要抓取開機(jī)log打開MTKLogger start automatically選項(xiàng),抓取開機(jī)過程log,重新開機(jī)會生成main_log.boot等文件,進(jìn)行分析:

2.1 dex opt階段慢

如果預(yù)制的客戶APK較多,則需注意是不是預(yù)置apk過多,預(yù)置apk的Android.mk對32bit和64bit的配置不準(zhǔn)確導(dǎo)致開機(jī)需要重新提取odex,log搜索dex2oat:/system/bin/dex2oat關(guān)鍵字可知,

這種情況就需要根據(jù)log中關(guān)鍵字instruction-set=arm or arm64看apk對應(yīng)的是32還是64位,在配置Android.mk里加上32或64bit的判斷,LOCAL_MULTILIB :=32 或64

2.2 PMS掃描階段慢


搜索sys_log.boot關(guān)鍵字“scan package”,如果出現(xiàn)以下log:

Line 1123: 01-01 00:10:04.465 905 905 D PackageManager: scan package: /data/app/Qunar.apk , end at: 337464ms. elapsed time = 21332ms.

Line 1595: 01-01 00:10:12.065 905 905 D PackageManager: scan package: /data/app/SogouInput.apk , end at: 345065ms. elapsed time = 7600ms.

Line 3436: 01-01 00:10:40.965 905 905 D PackageManager: scan package: /data/app/Weibo.apk , end at: 373965ms. elapsed time = 28899ms.

Line 3937: 01-01 00:10:49.036 905 905 D PackageManager: scan package: /data/app/iReader.apk , end at: 382036ms. elapsed time = 8070ms.

......

Line 7635: 01-01 00:11:30.409 905 905 I PackageManager: Time to scan packages: 372.992 seconds

這種情況是PMS 掃描時(shí)間過長,這部分時(shí)間只能從減少APK的數(shù)目,以及卸載掉非常耗時(shí)的APK去解決。例如上面的apk耗時(shí)20多秒,比較大的APK耗時(shí)更久。


2.3 Camera加載慢

在mainlog.boot里搜索關(guān)鍵字:impsearch,例如:

01-01 08:11:02.761? 263? 263 D ImgSensorDrv: [impSearchSensor]SENSOR search start

01-01 08:11:35.176? 263? 263 D ImgSensorDrv: [impSearchSensor]SENSOR search end: 0x3 /[0x841][0]/[0xffffff][255]/[0x2508][1]

看到開始到結(jié)束時(shí)間間隔為33秒

對應(yīng)到kernellog.boot會報(bào)出timeout

Line 14320: 01-01 00:11:24.988 <3>[? 11.732933]<2> (0)[263:mediaserver][mt-i2c]ERROR,481: id=0,addr: 3c, transfer timeout

Line 14355: 01-01 00:11:26.988 <3>[? 13.732941]<0> (1)[263:mediaserver][mt-i2c]ERROR,481: id=0,addr: 3c, transfer timeout

Line 14828: 01-01 00:11:34.988 <3>[? 21.732979]<0> (1)[263:mediaserver][mt-i2c]ERROR,481: id=0,addr: 3c, transfer timeout

這種情況是camera加載慢,可以讓驅(qū)動(dòng)檢查上電文件kd_camera_hw.c,有的IC會在上電判斷條件中加pinSetIdx做判斷,需要拿掉或者加上類似pinSetIdx == 1或者pinSetIdx == 0這些判斷條件再測試


3.如果恢復(fù)出廠設(shè)置慢,可以查看恢復(fù)出廠設(shè)置開機(jī)時(shí)間是不是跟第一次開機(jī)時(shí)間差不多,如果是就可以采用以上辦法分析,需要使用adb pull /cache/recovery/last_log導(dǎo)出恢復(fù)出廠設(shè)置log

PS:對于低配置機(jī)器,盡管打開了WITH_DEXPREOPT之后,已經(jīng)生成了odex文件,但是第一次開機(jī)的時(shí)候,android會去做patchoat的動(dòng)作,會將odex文件重新簡單修改,并放到/data/dalvik/$isa/目錄下面。 可以添加:WITH_DEXPREOPT_PIC := true這樣修改之后既可以減小data分區(qū)的空間,又可以加快開機(jī)速度,但風(fēng)險(xiǎn)就是安全性降低。

在升級到M版本之后,谷歌在camera新增了一個(gè)叫“media.camera.proxy”的service,在開機(jī)過程中會去連接該service。 當(dāng)連接不上時(shí)會try 5次,持續(xù)5秒左右。影響開機(jī)的performance。 如下是連接不上的Log:01940 01-01 08:35:59.563987? 222? 222 I ServiceManager: Waiting for service media.camera.proxy... 02086 01-01 08:36:00.564399? 222? 222 I ServiceManager: Waiting for service media.camera.proxy... 02294 01-01 08:36:01.564777? 222? 222 I ServiceManager: Waiting for service media.camera.proxy... 02387 01-01 08:36:02.565194? 222? 222 I ServiceManager: Waiting for service media.camera.proxy... 02494 01-01 08:36:03.565630? 222? 222 I ServiceManager: Waiting for service media.camera.proxy...可以打開/frameworks/av/services/camera/libcameraservice/CameraService.cpp找到pingCameraServiceProxy這個(gè)函數(shù) 將sp binder = sm->getService(String16("media.camera.proxy"));改為sp binder = sm->checkService(String16("media.camera.proxy"));

導(dǎo)致開機(jī)慢的原因可能還有很多,這里只是撿出一些常見的問題分析,不足之處歡迎補(bǔ)充。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容