android开机优化-framework
android開機(jī)優(yōu)化
—framework層的啟動(dòng)優(yōu)化
文章目錄
- android開機(jī)優(yōu)化
- 前言
- 一、系統(tǒng)應(yīng)用裁剪
- 二、系統(tǒng)服務(wù)裁剪
- 1.SyStemServer和SystemServiceRegistry修改
- 2.ZygoteInit優(yōu)化
- 3.開機(jī)動(dòng)畫修改
- 4.其他細(xì)節(jié)修改
 
- 總結(jié)
前言
androd開機(jī)啟動(dòng)時(shí)間優(yōu)化包括三個(gè)部分,uboot, kernel,framework啟動(dòng)優(yōu)化
 有些平臺(tái)用preloader和lk代替了uboot啟動(dòng),本質(zhì)上差不多
一、系統(tǒng)應(yīng)用裁剪
這部分相對(duì)來說最簡(jiǎn)單,就是做系統(tǒng)開發(fā)的時(shí)候,不需要的系統(tǒng)應(yīng)用可以直接裁掉,再對(duì)應(yīng)的腳本中刪掉對(duì)應(yīng)的編譯模塊就行,找找device目錄下面的PRODUCT_PACKAGES關(guān)鍵字,不需要的屏蔽掉,
 另外再build\target\product下面的mk文件中, 也有一些,如telephony_system.mk,可以找到類似的mk是再哪里添加編譯的,直接去掉
 如果有大量的app需要裁掉, 不進(jìn)行編譯,可以修改build/core/main.mk,在對(duì)應(yīng)的項(xiàng)目中新建deviceDelete.mk然后像PRODUCT_PACKAGES一樣定義DELETE_PACKAGE_LIST+=xxxxx;
 DELETE_LIB_LIST+=xxxxx;
 然后再對(duì)應(yīng)項(xiàng)目的device.mk中,把deviceDelete.mk加入編譯,如下
 $(call inherit-product, device/mediateksample/項(xiàng)目名/deviceDelete.mk)
在core/product.mk中搜索_producr_var_list ,然后把DELETE_PACKAGE_LIST和DELETE_LIB_LIST加上;注意這點(diǎn)很重要
 在build/core/main.mk中的
 ALL_DEFAULT_INSTALLED_MODULES := $(modules_to_install)這個(gè)前面添加, 有些編譯腳本不太一樣,找到這種賦值類似的地方,在前面修改即可
二、系統(tǒng)服務(wù)裁剪
1.SyStemServer和SystemServiceRegistry修改
這部分,其實(shí)就是在systemServer啟動(dòng)的時(shí)候,服務(wù)的加載,有一些不需要的服務(wù),全部屏蔽掉,當(dāng)然,裁掉之后對(duì)應(yīng)的一些app 也要全部裁掉, 不然, 會(huì)報(bào)錯(cuò),裁錯(cuò)了,開機(jī)會(huì)卡在開機(jī)動(dòng)畫那里或者一直重復(fù)開機(jī)動(dòng)畫,不要怕,adb抓log ,看哪里報(bào)錯(cuò),修改屏蔽掉就可以,盡量一個(gè)個(gè)修改驗(yàn)證,單獨(dú)mm編譯framework/base/services/是可以的, 要先刪除out\target\product\項(xiàng)目名\obj\JAVA_LIBRARIES\services_intermediates這個(gè)目錄,有一些平臺(tái)還需要?jiǎng)h除static和share的中間文件
 \STATIC_LIBRARIES\libservices.core_intermediates
 SHARED_LIBRARIES\libservices_intermediates
 一般刪除這三個(gè)文件夾,然后mm重新編譯, push 到/system/framework/service.jar,reboot重啟就能驗(yàn)證,下面是一些可以直接關(guān)掉的服務(wù)
 VibratorService 震動(dòng)器服務(wù)
 ClipboardService 粘貼板服務(wù)
 FingerprintService 指紋
 StartCountryDetectorService 檢測(cè)國家地區(qū)的
也有一些 定制系統(tǒng)不需要的服務(wù),可以裁剪掉,只是會(huì)報(bào)錯(cuò),不要急,看log 一步步修改錯(cuò)誤就行
 如
 BatteryService 電池服務(wù),當(dāng)電量不足時(shí)發(fā)廣播
 WallpaperManagerService 壁紙管理服務(wù)
 每個(gè)平臺(tái)在裁剪這些的時(shí)候,都會(huì)有一些坑, 比如MTK的裁掉壁紙服務(wù),在他們的duraspeed中,
 會(huì)用到壁紙服務(wù),也不知道是為啥。。這么其特,這個(gè)是mtk直接源碼里面的jar包, 最后生成duraspeed的apk,中文名叫快霸,為了使用時(shí)間長(zhǎng)的時(shí)候,自己清理內(nèi)存,加速優(yōu)化的,我直接裁掉了這個(gè)apk,壁紙服務(wù)才能裁掉,不然啟動(dòng)不了
 這部分自己看一下,還要一些是自己的定制系統(tǒng)用不到的服務(wù), 屏蔽掉, 不啟動(dòng),報(bào)錯(cuò)就修改代碼
 然后再SystemServiceRegistry中,關(guān)掉對(duì)應(yīng)的manager,當(dāng)然, 有一些會(huì)報(bào)錯(cuò),繼續(xù)修改
2.ZygoteInit優(yōu)化
這里其實(shí)沒有特別大的修改,下面這個(gè)屏蔽掉,直接加載systemserver,減少時(shí)間其實(shí)不明顯
 /* For child process */
 if (pid == 0) {
 //if (hasSecondZygote(abiList)) {
 // waitForSecondaryZygote(socketName);
 //}
 zygoteServer.closeServerSocket();
 return handleSystemServerProcess(parsedArgs);
 }
 下面的這個(gè)就比較神奇了,印象中android4.4的時(shí)候,再zygoteinit的preload方法中,是可以直接new thread進(jìn)行class加載和resource加載的加速的,但是再8.0上,修改的時(shí)候才發(fā)現(xiàn)會(huì)問題,因?yàn)橹苯觧ew thread會(huì)報(bào)錯(cuò),提示你不能再zygoteinit中新建線程,很奇怪,看代碼,
 // Mark zygote start. This ensures that thread creation will throw
 // an error.
 ZygoteHooks.startZygoteNoThreadCreation();這里就禁止開線程,
 ZygoteHooks.stopZygoteNoThreadCreation();這里就取消禁止,
 我如果要并行加載class和resource資源,需要屏蔽這里,然后在 preload 用線程池,或者new thread來并行操作,
 建議加上信號(hào)量的判斷,不知道信號(hào)量的,自己百度,還可以用future類來保證運(yùn)行順序,這里不并行的話,preloader是在2S左右,并行的話,可以減少1S,測(cè)試過是可以,但是沒有進(jìn)行大量的測(cè)試,哪位同學(xué)修改之后的話,測(cè)試效果如何,可以留言說一下
 也不知道8.0之后加上這個(gè)限制是什么原因,目前沒有深入研究, 沒有特別的需求可以不修改
3.開機(jī)動(dòng)畫修改
這個(gè)部分,其實(shí)每個(gè)平臺(tái)的都不一樣,以mtk的為例
 首先,要清楚開機(jī)流程,開機(jī)動(dòng)畫啟動(dòng)的時(shí)候,后臺(tái)實(shí)際上systemserver已經(jīng)是啟動(dòng)的,所以開機(jī)動(dòng)畫不能太長(zhǎng),不然就是systemserver在等待動(dòng)畫完成,其次,動(dòng)畫的分辨率要合適,簡(jiǎn)單來說就是畫質(zhì)不要太高,避免加載時(shí)間長(zhǎng),同時(shí)消耗資源,另外開機(jī)聲音,像mtk的就很坑,開機(jī)聲音的播放需要等到mediaserver起來,然后通過mediaserver播放開機(jī)聲音,等待起來要3-4s,這不是坑嗎。。。 果斷關(guān)閉開機(jī)聲音, 當(dāng)然,也可以, 直接去掉開機(jī)動(dòng)畫,如果需要的話,直接放一張圖上去
 在init.rc中start bootanim, 就是啟動(dòng)bootanim服務(wù),文件在./system/etc/init/mtkbootanim.rc中,
 這個(gè)是mtk自己修改的, 其他平臺(tái)的名字可能不叫這個(gè)
 關(guān)閉聲音,關(guān)掉開機(jī)動(dòng)畫的話,有些有定義,具體實(shí)現(xiàn)看BootAnimation中的代碼
 比如mtk關(guān)閉聲音可以修改persist.sys.mute.state=1就行
 取消開機(jī)動(dòng)畫,可以直接在inir.rc中 ,去掉start bootanim
4.其他細(xì)節(jié)修改
out目錄下的./vendor/etc/permissions/handheld_core_hardware.xml文件
 找到對(duì)應(yīng)項(xiàng)目中的整個(gè)文件,有些feature可以去掉
 如 打印服務(wù)
 桌面窗口組件
 camera服務(wù),有些不要的
init.rc 不啟動(dòng)不需要的服務(wù)。像cameraserver,一般不需要改
 查看串口啟動(dòng)的log,一些不要的 .rc的文件,全部去掉,不運(yùn)行
總結(jié)
總結(jié)
以上是生活随笔為你收集整理的android开机优化-framework的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        