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