Android 开机速度优化

开机速度经常被用来做为竞品比较的一个参数,开机快容易给用户一种机器运行较快的错觉。以致于MTK开发出快速开机的功能,是一个假关机的功能,SystemServer并没有挂掉,从而达到快速开机的功能(大概可在5秒内开机)。但其还是存在耗电的。
本文着力于Android上开机速度的优化。

从开机的流程上来耗时较长的有以下几点:

==preload classes和resource==
所有的Android应用程序都是从Zygote进程fork出来的,所以为了共享一些class和resourse资源,Zygote进程初始化过程中,会预先加载一些常用的java class和资源文件到进程的内存中,这样其他应用fork出来后就不用再次加载了,从而提高了应用的启动速度。

这个过程是可以精简和优化的,你可以减少一些classes和resource的加载,也可以启用多线程来进行加载,从而加快系统的启动速度。

本过程涉及到的文件

/system/etc/preloaded-classes

frameworks/base/core/res/res/values/arrays.xml

==PMS 加载application==
在systemServer中会先启动PMS,然后让其加载应用,默认会去搜索system/app/,system/priv-app/,等,会读取它的AndroidManifest.xml,获取信息,还会判断其是否有odex优化,如果没优化,会对其进行优化。

这个过程也是非常耗时的,预装的apk文件越少,系统启动速度也就越快,因此,精简预装apk也是优化系统启动速度最重要的手段之一。要想减少预装的apk文件,则需要分析系统的build文件,将不需要的apk编译选项删除掉

==启动相关service==
Android OS的启动本质上就是启动一系列的本地服务和Java服务,Android系统的所有功能都是通过这些服务间接提供的。

这些服务有很多并不是必须启动的,根据业务需求可以去掉一些,本过程涉及到的文件:

system/core/rootdir/init.rc

frameworks/base/services/java/com/android/server/SystemServer.java

==Bootanimation 消失==
在所有的service都起来了之后,会通知surfaceflinger去关掉bootanimation.在通知之前会判断其是否要显示壁纸,锁屏,要等这些需要显示的应用都准备好了之后才会通知surfaceflinger关掉bootanimation.所以可以通过先把需要显示的应用所涉及的service先进行启动,如需要等待壁纸,则可先将wallpaperService进行systemRunning()。

在SurfaceFlinger去关掉bootanimation时,可以观察其是否立即停止。在HiCam的项目中,就发现在通知停止之后会等待280ms左右才消失,最后发现是在停止是会等待动画的2帧的时间才去停止动画。

PS: 优化启动动画,降低帧率和图片尺寸,也可以达到优化开机速度的效果。

你可能感兴趣的:(Android 开机速度优化)