4.5.2 开机速度优化
Android的开机速度慢这一现象一直受人诟病,Google好像也没有要做这方面优化的意向,那么,在实际工作中又可以在哪些地方做一些优化呢?根据我目前所掌握的资料来看,开机时有三个地方耗时比较长:
ZygoteInit的main函数中preloadClasses加载了一千多个类,这耗费了不少时间。
开机启动时,会对系统内所有的apk文件进行扫描并收集信息,这个动作耗费的时间非常长。
SystemServer创建的那些Service,会占用不少时间。
我们这里讨论第一个问题,如何减少preloadClasses的时间。其实,这个函数是可以去掉的,因为系统最终还是会在使用这些类时去加载,但这样就破坏了Android采用fork机制来创建Java进程的本意,而fork机制的好处是显而易见的:
zygote预加载的这些class,在fork子进程时,仅需做一个复制即可。这就节约了子进程的启动时间。
根据fork的copy-on-write机制可知,有些类如果不做改变,甚至都不用复制,它们会直接和父进程共享数据。这样就会省去不少内存的占用。
开机速度优化是一项比较复杂的研究,目前有人使用Berkeley Lab Checkpoint/Restart(BLCR)技术来提升开机速度。这一技术的构想其实挺简单,就是对系统做一个快照,将系统当前信息保存到一个文件中,当系统重启时,直接根据文件中的快照信息来恢复重启之前的状态。当然想法很简单,实现却是很复杂的,这里就不做进一步的讨论了,读者可自行展开深入的思考和研究。
提示 我在VMWare虚拟机上使用过类似的技术,它叫Snapshort。开机速度的问题我更希望Google自己能加以重视并推动解决之。