Android开机速度优化

平台:android2.2
场景:电子书设备,精简系统同时需要提升开机速度。
时间:2012.2.15

主要关注当Java世界起来以后(即zygote起来之后)的开机速度优化。
从zygote到home显示的过程中,有如下几个耗时的过程:
1.preload-class。
2.scan package。
3.SystemServer进程中创建并加载系统服务。
4.home程序以及自启动的程序的启动。

对于以上四个耗时的过程,我在这里提出几个问题:
1.preload-class中关于class数目的删减对开机速度的影响如何?
2.APP数目对scan package时间消耗的影响如何?
3.CPU对preload-class以及scan package的影响如何?
4.开机启动的那些apk对home显示出来的影响如何?

Preload-class
关于preload-class的加载实现的类是在
gingerbread\frameworks\base\core\java\com\android\internal\os
下面的ZygoteInit.java文件。其具体需要预加载的类存放在
gingerbread\frameworks\base下面的preloaded-classes文件中。参考网上的说法,加载preloaded-classes中一千多个类,具体得花费13秒左右的时间。但其并没有仔细说明类的具体数量以及系统所处于的硬件环境。(一个确认的数据:Nexus1 preload 1942classes in 5360ms)我的测试数据是,RK2818的机器preload 1264个类花费的时间为8~9秒,而RK2918的机器preload 1830个类花费的时间在3.5~4.5秒。我分别对同一机器是否有preload-class过程,以及不同机器都有preload-class过程进行测试比对,得出以下结论:
对于CPU性能一般的机器来说,preload-class的花费时间较长,当删减后对开机速度有一定的提升。但home程序以及开机启动的其他一些apk的启动,以及系统service创建加载的时候依然需要加载那些使用到的类,如此以来,两者此消彼长,节约的时间就比较有限了。(项目机器上测试的结果是删减整个preload-class中的类后,节约了2~3秒)同时对于开机时不执行preload的话,是否会导致过度消耗内存等一系列的问题呢?(参考描述–preloaded-classes list中预加载的类位于dalvik zygote进程的heap中。在zygote衍生一个新的dalvik进程后,新进程只需加载heap中没有预加载的类,这些后加载进来的类成为该进程所private独有的,这样便加快了应用程序的启动速度)
同时引用网上对preload-class的看法:preloadclass是可以去掉的,因为系统最终还是会在使用这些类时去加载,但这样就破坏了android采用fork机制来创建java进程的本意,而fork机制的好处是显而易见的:(1).zygote预加载的这些class,在fork子进程时,仅需做一个复制即可。这就节约了子进程的启动时间。(2).根据fork的copy-on-write机制可知,有些类如果不做改变,甚至都不用复制,它们会直接和父进程共享数据。这样就会省去不少内存的占用。

Scan package
当PackageService起来以后,会去执行对package的描述。其具体扫描的目录为
/system/app
/system/framework
/data/app
/data/app-private等
网上的说法是此过程需要花费的时间大概为10秒。同样没有指明任何的硬件信息。(参考Nexus1 Time to scan package:8.975seconds,79个app )我的测试数据显示,在项目机器上scan package的花费1.1秒左右,此时有20个app。在RK2918机器上花费的时间为2.1s左右,此时有58个app。同时,引用一段关于scan package优化的建议—removed pre-file singature check in parseZipArchive()。作者后面也说明,total boot time was not reduced。
综合我测试数据和网上说法,得出结论:
要优化scan package的时间花费,缩减app数目是主要(好像也是唯一)的方式。

SystemServer
SystemServer是通过zygote fork出来的一个新进程。其在framework中对应实现在gingerbread\frameworks\base\services\java\com\android\server
下面的SystemServer.java文件。其中的init2()函数,实现了对于android的大部分系统服务的加载。参考网上的说法,此过程花费在9秒左右。对于不同的项目,系统服务的需求肯定是都有所不同,可以根据实际情况对SystemServer中加载的服务进行剪裁。但剪裁的过程中需要注意,关于剪裁的服务在系统中的调用也要一并消除掉,否则可能引起异常情况或者直接系统奔溃。关于几个重要的系统服务分别是:EntropyService,PowerManagerService,ActivityManagerService,PackageManagerService,BatteryService,WindowManagerService,ConnectivityService。
得出结论:
SystemServer加载过程的优化,需要根本项目不同,对其中的系统服务进行删减来减少加载时间的花费,删减的同时一定要注意将其在整个系统中的调用一并移除。

home程序以及自启动的程序的启动。
此过程在网上没有被太多的提及,但其也某些情况下也确实对开机速度造成了重大的影响。(例如项目机器。从上电到开始加载home程序的花费在12s左右,而从开始启动home程序到显示出主界面的过程花费了6s左右的时间之多!)首先,针对preloadclass有无加载类来做一下比对。在项目机器上的结果是,当preloadclass过程没有加载任何类的时候,home程序显示出来的时间大概在6.2秒左右。而preloadclass过程中有加载1264个类后,home程序显示出来的时间大概在2.6秒左右。可见,preloadclass没有加载而省下的时间在这里有了很大的抵消。另一个测试是,同样在preloadclass过程都没有加载任何类,而每次不停的删减系统随机启动的那些程序,查看其对home显示出来的影响。当删除了Library.apk后,home程序的显示时间为4.7秒左右,缩减了大概1.5秒。在此基础上,删减Settings.apk和LatinIME.apk后,显示时间为3秒左右。得出结论:
随机启动的程序对home程序显示出来的时间还是有很大的影响的。(为什么会有如此大的影响?后面我尝试解答。)应该尽量避免启动较慢的程序的随机启动。

现在尝试解答之前提出的四个问题。
1.preload-class中关于class数目的删减对开机速度的影响如何?
Prelpad-class中class数目的删减对开机速度有较大的影响。同时对其的删减可以提高开机速度。但在后面的过程中,是使用某个class的时候依然需要将其载入,还会造成具体的对象(activity,service)的启动速度的变慢。换句话说,class的加载花费的时间是不可避免的,只是需要根据需求来将其安排到合适的地方。

2.APP数目对scan package时间消耗的影响如何?
App数目对scan package时间消耗影响是成正比的。但在当前的情况下,scan package的花费已经是很少了,继续压榨app数量也没有一定的可行性。(在项目机器上尝试总共放入三个app,scan package的花费为0.4秒左右。当全部放入的时候,花费1.1秒左右)

3.CPU对preload-class以及scan package的影响如何?
CPU性能的好坏直接决定了preload-class以及scan package的时间花费。从RK2818和RK2918的机器上对比一看便知。项目机器(RK2818)preload 1264个类花费大概8.5秒,而RK2918机器preload 1830个类花费大概4秒。

4.开机启动的那些apk对home显示出来的影响如何?
开机启动的apk对home显示出来的影响还是比较大的,尤其是在项目机器这种情况下(已经优化了preload-class和app数量)。其具体可以转化为下面两个问题:
(1).为什么有些apk会开机启动?(比如,输入法,Settings,Library)
输入法启动是因为在inputmethodservice服务起来以后,bindservice(),将其调用起来。Settings启动是因为收到了关闭屏幕的广播。Library.启动也是因为收到了系统的挂载广播。这些apk启动的时候延迟了home程序的显示,应该尽量避免他们的启动或者是减少他们启动花费的时间。(输入法和Settings代码并不多,但res里面的内容较多,经过测试,缩减一部分res里面的内容,能够达到减少一定的启动时间,即精简开机会启动的程序)
(2).为什么启动的时候,需要当一部分apk启动加载后,home界面才显示出来。而不能直接就优先将home界面快速显示出来?
开机启动时,几个程序是并发执行的。但对于单核心的cpu来说,其依然是一个一个时间片的处理。Home界面显示受其他启动的程序影响,是因为其他的程序的竞争cpu时间片导致的?

PS:每次开机loaded time zone names 花费了1秒左右。有时候多达3秒。

最后,关于开机速度优化,个人认为需要根本项目的需求去进行最好的删减的优化。同时CPU性能直接影响整个开机速度,CPU性能的提高对开机速度有莫大的提升。

参考资料:
1.http://www.eoeandroid.com/thread-29953-1-3.html
2.http://blog.csdn.net/jackyu613/article/details/6044297
3.http://www.docin.com/p-204871857.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值