jason--liu/Blog

Android开机优化回顾

Opened this issue · 0 comments

bootloader

1.开启dcache,icache可以加快读内核时间
2.eMMC使用DMA读取,读取速度能提升一倍,但由于我们的内核已经裁剪的非常小了,所以对读内核时间影响不大。

Kernel

可以设置init/main.c中initcall_debug=1,这样内核启动的时候每个驱动模块的初始化函数所需时间都会打印出来,需要重点关注那些时间在10000us上的模块。
截取部分较长驱动模块如下

initcall customize_machine+0x0/0x30 returned 0 after 39062 usecs
initcall mxc_cpufreq_driver_init+0x0/0x48 returned 0 after 24593 usecs
initcall mipi_csi2_init+0x0/0x48 returned 0 after 29296 usecs
alsa_sound_init+0x0/0xb0 returned 0 after 9765 usecs
initcall bt_init+0x0/0x9c returned 0 after 29296 usecs
initcall inet_init+0x0/0x274 returned 0 after 47955 usecs
initcall logger_init+0x0/0x58 returned 0 after 13786 usecs
initcall regulator_init_complete+0x0/0x138 returned 0 after 28946 usecs
initcall imx_sgtl5000_init+0x0/0xc0 returned 0 after 173235 usecs
initcall ehci_hcd_init+0x0/0xd4 returned 0 after 402382 usecs
initcall imx_serial_init+0x0/0x50 returned 0 after 36970 usecs

customize_machine 这个函数运行非常早,也是board相关的,里面有大量board相关的初始化,需要去掉不必要的初始化,比如这个项目没有用的WiFi,就可以把WiFi相关(WiFi初始化其实是很耗时的)的初始化去掉。
然后发现一些驱动模块耗时也有点长,比如声卡,USB方面的,可以尝试编译成ko文件在内核启动完后加载,但这里面有些驱动模块依赖较多,需要花费一些调试功夫。

Android

将Launcher启动尽量提前。还有就是SystemServer里面的一些服务Ready方法在Launcher起来过后在调用,那怎么实现呢?
SystemServer native层注册一个信号处理函数,这个函数通过JNI回调SystemServer的DelayLoad方法,在这个函数中将initLoop方法中的一些服务搬进来。那信号处理函数什么时候调用呢?换句话说,什么时候发送这个信号呢,我们采用的方式是在Launcher起来过后,执行一个可执行程序给SystemServer发送信号。

Launcher优化

我们的项目是会在启动Launcher后,不到1S钟马上又启动收音机界面,测试发现Launcher启动时间较长,所以决定让Launcher先显示一张图片,然后再后台启动,这样比启动完整Launcher要快很多。
优化前Launcher启动时间大概需要4~5S,而优化后只需要不到2S。

参考资料

Android 启动性能优化 - uboot篇
Android 启动性能优化 - kernel篇
android系统恢复出厂设置和升级界面的修改方法