和你一起终身学习,这里是程序员Android
本篇文章主要介绍 Android
开发中 开关机 重启时间 部分知识点,通过阅读本篇文章,您将收获以下内容:
一、zygote,预加载class、resources
二、开机动画进程 bootanimation
三、SystemServer.java 代码逻辑
四、非必要服务请放在system_server进程外启动
五、kernel init 时间过长
六、排查驱动设备初始化是否完成
七、apk dex2oat时间过长
八、尽量少把APP设置为persist
九、定频定核,调高CPU频率,会带来一定的功耗
十、PackageManagerService 扫描apk 优化
十一、关机时间优化
十二、优化第三apk 后台服务
十三、谷歌官方参考资料
开机性能是使用功能和其它因素多方面平衡的结果,片面追求单方面的性能没有太大意义;
有些产品设计开机动画非常酷炫,动画图片过多、高帧率会影响开机速度,这时就需要看是开机速度优先还是体验优先;
具体开机优化方案如下:
一、zygote,预加载class、resources
zygote
预加载多了,会影响开机时间,所以需要优化预加载内容。
MTK
平台 开机时间信息保存在 /proc/bootprof
下,或mtklog/mobilelog/Aplog
下。
1.bootprof 举例
<< /proc/bootprof >>:
----------------------------------------
0 BOOT PROF (unit:msec)
----------------------------------------
1612 : preloader
1915 : lk (Start->Show logo: 981)
----------------------------------------
34.132076 : ON
88.563768 : 1-swapper/0 : initcall: of_init 17.915384ms
131.311461 : 1-swapper/0 : initcall: customize_machine 24.395769ms
164.462461 : 1-swapper/0 : initcall: param_sysfs_init 16.619385ms
228.096692 : 1-swapper/0 : initcall: event_trace_init 30.488846ms
297.817461 : 1-swapper/0 : initcall: populate_rootfs 53.605462ms
353.950769 : 1-swapper/0 : initcall: mt_i2c_init 16.164154ms
2367.197389 : 1-swapper/0 : probe: probe=i2c_device_probe drv=mt6311(c0e57f6c) 1998.596236ms
2367.745697 : 1-swapper/0 : initcall: mt6311_init 1999.229312ms
2385.294389 : 1-swapper/0 : probe: probe=platform_drv_probe drv=musb-hdrc(c0e5876c) 16.914000ms
2385.426543 : 1-swapper/0 : initcall: musb_init 17.640462ms
2503.717235 : 1-swapper/0 : probe: probe=platform_drv_probe drv=mtk-msdc(c0ea070c) 36.834692ms
2540.662159 : 1-swapper/0 : probe: probe=platform_drv_probe drv=mtk-msdc(c0ea070c) 36.847000ms
2542.779389 : 1-swapper/0 : initcall: mt_msdc_init 76.216231ms
2852.160621 : 6-kworker/u8:0 : probe: probe=i2c_device_probe drv=fts_ts(c0e9b9cc) 234.830693ms
2855.127621 : 6-kworker/u8:0 : probe: probe=platform_drv_probe drv=mtk-tpd(c0e78d4c) 238.288846ms
2869.938159 : 1-swapper/0 : initcall: battery_init 253.557308ms
2879.950852 : 1-swapper/0 : Kernel_init_done
... ...
29772.775531 : 727-system_server : AMS:systemReady
29786.000916 : 727-system_server : AMS:AMS_READY
30075.941840 : 727-system_server : AP_Init:[service]:[com.google.android.inputmethod.latin]:[com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME]:pid:975
30116.813224 : 727-system_server : AP_Init:[service]:[com.android.systemui]:[com.android.systemui/.ImageWallpaper]:pid:986:(PersistAP)
30244.397225 : 919-system-server-i : AP_Init:[]:[WebViewLoader-armeabi-v7a]:pid:1011
... ...
31891.278382 : 727-system_server : Android:SysServerInit_END
32461.362615 : 763-ActivityManager : AMS:ENABLE_SCREEN
32463.281768 : 770-android.display : AP_Launch: com.android.settings/.FallbackHome 665ms
36239.598547 : 763-ActivityManager : AP_Init:[broadcast]:[com.android.dialer]:[com.android.dialer/.app.voicemail.LegacyVoicemailNotificationReceiver]:pid:1524
38411.551244 : 325-Binder:300_1 : BOOT_Animation:END
38411.595629 : OFF
----------------------------------------
================ END of FILE ===============
1.预加载Class
因为少加载类会影响APP
启动速度,开机过程会涉及到APP
启动,此地没有优化空间;
预加载Class
类路径 /frameworks/base/config/preloaded-classes
2.预加载资源
/frameworks/base/core/res/
下的资源文件会被打包成 framework-res.apk
。
此时需要确保没有冗余的 资源图片,可以挨个检查图片、XML
是否在系统中有用到。
二、开机动画进程 bootanimation
开机动画保存在手机system/media
下,
开机动画要求:
图片越少越好,不宜占用过大的内存空间,否则系统会浪费在加载开机动画图片上,这样导致开机时间慢,就不好了。
两种开机动画
1.播放开机声音
开机动画需要等待开机铃声播放完,动画才能退出,开机才能完成;
所以 开机铃声的mp3文件不能过长,最好不要超过system_server
启动时间;
通过查看bootprof
文件可以大致确定system_server
启动时间。
system_server 启动时间举例如下:
23340.916362 : 727-system_server : Android:SysServerInit_START
24217.928364 : 727-system_server : Android:PackageManagerService_Start
....
31891.278382 : 727-system_server : Android:SysServerInit_END
2.不播放开机声音
不播放开机声音,不会影响开机时间,bootanimation.zip
中图片越少越好。
三、 SystemServer.java 代码逻辑
不建议更改SystemServer
代码逻辑,修改风险较大,除非对开机速度有特别严苛的要求才修改:
/frameworks/base/services/java/com/android/server/SystemServer.java
可以优化的Service
举例如下:
1.DropBoxManagerService
和调试相关,可以异步加载或者直接阉割掉
2.PinnerService
没有配置相关则可以去除;
其他Service
需要通过查看耗时挨个排查,耗时log
查看如下:
Line 126: 07-12 18:01:14.616410 1024 1024 I SystemServer: InitBeforeStartServices
Line 127: 07-12 18:01:14.616637 1024 1024 I SystemServer: Entered the Android system server!
Line 128: 07-12 18:01:14.881713 1024 1024 D SystemServerTiming: InitBeforeStartServices took to complete: 265ms
Line 129: 07-12 18:01:14.881877 1024 1024 I SystemServer: StartServices
Line 130: 07-12 18:01:14.881922 1024 1024 I SystemServer: Reading configuration...
Line 131: 07-12 18:01:14.881945 1024 1024 I SystemServer: ReadingSystemConfig
Line 132: 07-12 18:01:14.882617 1024 1024 D SystemServerTiming: ReadingSystemConfig took to complete: 1ms
Line 133: 07-12 18:01:14.882714 1024 1024 I SystemServer: StartInstaller
Line 135: 07-12 18:01:14.883365 1024 1091 D SystemServerInitThreadPool: Started executing ReadingSystemConfig
Line 136: 07-12 18:01:14.887243 1024 1024 D SystemServerTiming: StartInstaller took to complete: 5ms
Line 137: 07-12 18:01:14.887310 1024 1024 I SystemServer: DeviceIdentifiersPolicyService
Line 139: 07-12 18:01:14.889138 1024 1024 D SystemServerTiming: DeviceIdentifiersPolicyService took to complete: 2ms
Line 140: 07-12 18:01:14.889247 1024 1024 I SystemServer: StartActivityManager
Line 144: 07-12 18:01:14.954297 1024 1091 D SystemServerInitThreadPool: Finished executing ReadingSystemConfig
Line 162: 07-12 18:01:15.720682 1024 1024 D SystemServerTiming: StartActivityManager took to complete: 831ms
Line 163: 07-12 18:01:15.720717 1024 1024 I SystemServer: StartPowerManager
Line 165: 07-12 18:01:15.737378 1024 1024 D SystemServerTiming: StartPowerManager took to complete: 17ms
Line 166: 07-12 18:01:15.737495 1024 1024 I SystemServer: InitPowerManagement
Line 167: 07-12 18:01:15.739204 1024 1024 D SystemServerTiming: InitPowerManagement took to complete: 2ms
Line 168: 07-12 18:01:15.739280 1024 1024 I SystemServer: StartRecoverySystemService
Line 170: 07-12 18:01:15.742151 1024 1024 D SystemServerTiming: StartRecoverySystemService took to complete: 3ms
Line 172: 07-12 18:01:15.750585 1024 1024 I SystemServer: StartLightsService
Line 174: 07-12 18:01:15.752248 1024 1024 D SystemServerTiming: StartLightsService took to complete: 2ms
Line 175: 07-12 18:01:15.752348 1024 1024 I SystemServer: StartSidekickService
Line 176: 07-12 18:01:15.752405 1024 1024 D SystemServerTiming: StartSidekickService took to complete: 0ms
Line 177: 07-12 18:01:15.752434 1024 1024 I SystemServer: StartDisplayManager
Line 179: 07-12 18:01:15.778824 1024 1024 D SystemServerTiming: StartDisplayManager took to complete: 26ms
Line 180: 07-12 18:01:15.778955 1024 1024 I SystemServer: WaitForDisplay
Line 184: 07-12 18:01:15.798983 1024 1024 D SystemServerTiming: WaitForDisplay took to complete: 20ms
Line 185: 07-12 18:01:15.799476 1024 1024 I SystemServer: StartPackageManagerService
Line 216: 07-12 18:01:18.624952 1024 1131 D SystemServerInitThreadPool: Started executing prepareAppData
Line 217: 07-12 18:01:18.834938 1024 1131 D SystemServerTimingAsync: AppDataFixup took to complete: 209ms
Line 226: 07-12 18:01:19.226578 1024 1024 D SystemServerTiming: StartPackageManagerService took to complete: 3427ms
Line 227: 07-12 18:01:19.226960 1024 1024 I SystemServer: StartOtaDexOptService
Line 229: 07-12 18:01:19.230308 1024 1024 D SystemServerTiming: StartOtaDexOptService took to complete: 3ms
Line 230: 07-12 18:01:19.230339 1024 1024 I SystemServer: StartUserManagerService
Line 232: 07-12 18:01:19.231780 1024 1024 D SystemServerTiming: StartUserManagerService took to complete: 1ms
Line 233: 07-12 18:01:19.231879 1024 1024 I SystemServer: InitAttributerCache
Line 234: 07-12 18:01:19.232738 1024 1024 D SystemServerTiming: InitAttributerCache took to complete: 1ms
四、非必要服务请放在system_server进程外启动
system_server
特定的服务导致开机变慢,比如:指纹系统;
非必要的服务可以放在system_server
进程外启动;
五、kernel init 时间过长
kernel init
需要先看一下客户的版本上init.rc
文件相对Driver only
版本是否有添加新的init
,这些是否都是必须添加的。
在uartlog
中,需要查关键字 cut here ,找到在kernel init
过程中,频繁打出的这些call stack
,看这些call stack
,排查一下贵司所客制化的点。
六、排查驱动设备初始化是否完成
在uartlog
中排查驱动设备初始化是否有完成或延时较长。
比如之前驱动代码异常问题,耗时8s
,这个有很大优化空间。
七、apk dex2oat时间过长
如果是刷机后第一次因为对apk进行dex2oat
导致的开机慢:
bootprof
文件中包含 PMS:performDexOpt,说明在编译时没有打开dex2oat
选项;
可以按照下面修改
在/device
和/build
目录下,修改下面的宏,具体下面3
个宏的位置可以在代码中搜索一下:
build/core/dex_preopt.mk
WITH_DEXPREOPT := true
WITH_DEXPREOPT_PIC := true
DONT_DEXPREOPT_PREBUILTS := false //或者注释掉
1.Log 举例
67720.299622 : 1211-system_server : PMS:performDexOpt:com.mediatek.ims
67727.107469 : 1211-system_server : PMS:performDexOpt:com.google.android.ext.services
67732.884007 : 1211-system_server : PMS:performDexOpt:com.android.providers.telephony
67740.281545 : 1211-system_server : PMS:performDexOpt:com.micromaxinfo.coreupdater
67750.098776 : 1211-system_server : PMS:performDexOpt:com.touchtype.swiftkey
82794.094658 : 1211-system_server : PMS:performDexOpt:com.mediatek.fwk.plugin
82798.845812 : 1211-system_server :
.......
116880.481509 : 1211-system_server : PMS:performDexOpt:com.android.keychain
116884.277509 : 1211-system_server : PMS:performDexOpt:com.android.chrome
116901.748740 : 1211-system_server : PMS:performDexOpt:com.android.gallery3d
116909.980047 : 1211-system_server :
126659.802071 : 1211-system_server : PMS:performDexOpt:com.google.android.syncadapters.calendar
126665.240840 : 1211-system_server : PMS:performDexOpt:com.android.managedpr
134272.287243 : 1211-system_server : PMS:performDexOpt:com.jio.adc.embedded
134581.037782 : 1211-system_server : PMS:performDexOpt:com.android.wallpaperbackup
134583.934936 : 1211-system_server : PMS:performDexOpt:com.android.providers.blockednumber
134589.891166 : 1211-system_server :
137465.599866 : 1211-system_server : PMS:performDexOpt:com.android.captiveportallogin
八、尽量少把APP设置为persist
1. 优化每一个有源码的persist APP
使他们启动尽可能快
比如以下persist APP
请尽量优化。
- 1.com.android.systemui(PersistAP)
- 2.com.mediatek.ims(PersistAP)
- 3.com.android.phone(PersistAP)
- 4.com.android.settings
2. 精简apk
包
(1)删除没有用到的,图片、资源文件、没有用到的 jar
包文件、不需要使用的so
文件;
(2)预置自己的APP
,假如设备只会加载drawable-xxhdpi
中的资源,那么可以在drawable
包 重复的资源可以直接删除;
(3)预置自己的APP
,假如设置只支持英文,values-da、values-fa
这样的多语言支持资源都 可以删除;
(4)apk
中只保留和系统适配的so
文件,比如:armv7
和arm64
的so
文件;
3. App
的onCreate
方法中不要用耗时的代码片段。
4. 修改app
的启动模式
通过修改--compiler-filter
为 speed、quick、speed-profile
来提高apk
的启动速度;
speed 模式优化的类较多,这时优化后的vdex、odex
的文件较大,应用启动过程包括映射apk
文件的过程,文件偏大导致有一定的时间损耗;
但speed
模式优化后,Java
类执行更快;所以这个需要针对具体的应用多次验证,没有普适性;
九、 定频定核,调高CPU频率,会带来一定的功耗
1.以6763
的O1
版本代码为例:
在Init
进程中进行如下修改。
/system/core/rootdir/init.rc
on early-init
#mtk begin
write /proc/ppm/policy/ut_fix_core_num "4 4"
write /proc/ppm/policy/ut_fix_freq_idx "0 0"
#mtk end
on property:sys.boot_completed=1
bootchart stop
#mtk begin
write /proc/ppm/policy/ut_fix_core_num "-1 -1"
write /proc/ppm/policy/ut_fix_freq_idx "-1 -1"
#mtk end
十、PackageManagerService 扫描apk 优化
1.scanDirTracedLI
(1)减少预置APP
的数量(对开机速度会有较为明显的提升);
(2)删除没有必要的apk
包;
(3)单线程scan
分区里面的apk
并不一定能充分使用IO
资源,尝试改为多线程异步scan
;(部分手机厂商有做出此种修改,且效果较为明显,但修改需谨慎);
(4)精简系统,把系统中用不到的apk
包、有重复功能的apk
移除(比如:我司代码默认包含 有计算器APP
,如果贵司有自己单独的计算器APP
则可以移除我司apk
),这样既可以使系统有更大的剩余存储空间又可以减少scan
的时间,加快开机;
十一、关机时间优化
1.以MTK6763
为例:
[ro.mediatek.version.branch]: [alps-mp-o1.mp1]
可以把下面这个时间改为1s
(贵司可以自己测试找一个最优值),然后关机音频控制在1s
(否则音频播放不完整),或者关机时不播放铃声,把这个值设置为10ms
;
/frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java
149 // Shutdown Animation
150 private static final int MIN_SHUTDOWN_ANIMATION_PLAY_TIME = 1 * 1000;
十二、优化第三apk 后台服务
关机时间长的另外一个原因有可能是后台应用乱跑;
尤其国内一些有保活的APP
,在后台都在积极抢占CPU
,在手机系统资源紧张时对系统的性能影响是非常大的;
手机使用过程中,适当的限制后台进程的数量,会一定程度提高系统性能和更快的关机;
还有些APP
一直保持有1
个像素的悬浮窗,使自己一直为可见进程,可见进程能更多的占用系统资源,手机系统可以增加悬浮窗的权限管控开关只有获取到了才允许悬浮,可以更加合理的非配系统资源。
13.谷歌官方参考资料
谷歌官方启动时间优化链接
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!