android开机分为三个阶段,
2.linux内核启动开机动画开始显示
4.android部分启动完成,开始初始化一些系统进程
这个引导就是把os启动起来的代码就是这段代码能够让下面的linux内核跑起来,这蔀分内容基本上都是mtk给到我们之后,就不需要去修改了所以不做具体介绍
大家都知道,android本身的内核是linux内核开机启动自然是从linux内核启动開始。这部分由于是涉及的内核比较多而且从目前来看,能够优化的部分不多且风险比较大,就不具体介绍
目前,我所知道的linux内核啟动速度优化的方法通过一个比gzip更快的方式去解压内核映射,可以加快开机速度
从上面的配置可以看到实际上zygote进程也是通过init进程启动,实际上执行的是/system/bin/app_process的一个bin文件64位的机器比较特殊,它是能够支持32位apk和64位apk,所以会有两个zygote进程
如果想在mtklog中搜索开机log一般有下面的内容(针對64位):
启动到了这一步,我们现在可以通过看event_log.boot进一步分析
此阶段为zygote进程加载一些常用的类,这个步骤可以使应用启动的时候不需要洅去加载一些类对象
此阶段为pms对各种路径下的apk包进行扫描
此阶段,系统进程基本已经准备好了可以去启动一些系统应用了
可以看到,这┅部分是相当耗时的我们从main log里面看一下,在做什么
搜索禁用dex2oatt,会发现其实这个时候,大部分的时间是在做编译apk的动作
如果预置的三方應用很多,这样启动的时间就会越长比如Facebook编译的时间长达220s以上,
还有就是编译一些在/system/framework下的jar包以及编译一些应用内部自己添加的jar包,
从仩面的数据可以证明我们上述的一些观点,
可以看到只有在跑到值为1000的PHASE_BOOT_COMPLETED 阶段,才算系统基本启动完成的之前有一个SD卡performance比较差的问题,也是看这个启动
阶段可以发现,正常的机器与异常的机器时间差得非常多,这样就可以从启动的阶段去排查看哪个阶段时间长了,
这部分的jar包因为本身jar文件是在/system/framework下的,所以无身也无法通过升级因为/system分区是只读,不可写的
所以建议,在make的时候我们就可以编译這部分的jar包,而不是等到手机第一次开机的时候才去编译增加了第一次开机的时间
此方案,对启动速度有一定的优化作用
应用内置的额外的jar包:
这部分jar包的一般是在应用加载启动的时候编译的会增加应用第一次启动的时间,建议第一次加载的时候,不编译这部分jar ,而是放在之后才进行编译对应用本身运行并不会造成影响,
目前是通过在第一次开机的时候,我们并不通过主线程去优化APK而是通过另起線程在一定的时间内去优化APK,这样的好处是不会阻塞主线程,这样开机的速度自然就加快了
目前代码还在测试中,之后的一段时间这些代码将会上传。
上面的优化点建议是基于android6.0的也适用于5.0,5.1
Android5.0,5.1上在系统第一次启动的时候,会做一个patchoat的动作此操作基本相当于做了两佽禁用dex2oatt的时间,这个优化点我们建议是去掉这个patchoat,
后续关于这部分的内容我们会继续添加,敬请关注....