赞
踩
硬件平台:高通msm8953_64
系统平台:Android 7.1.2
编译平台:Ubuntu 14.04.2 LTS(64bit)
从接触Android系统驱动开始,就有一个需求,怎样提高android系统的启动速度。所以也在网上搜索了很多资料,看了很多优质的博客。很多文章都有提到:Zygote进程预加载类的时候是比较耗时间的
Android系统中preloaded-classes的文件路径:frameworks/base/preloaded-classes
Zygote进程预加载的那一部分比较耗时,这是一种用空间换取时间的优化方法。在预加载的过程中,有一部分是预加载Class。它的主要逻辑就是从一个preloaded-classes的文件中读取Class加载到内存中。preloaded-classes里面都是各个进程常用的类,所以很多人的建议是,不要去动这一部分的代码,也有建议是删掉一些加载时间比较长的Class,来缩短开机时间。
那么这里就有三个问题,我们先将问题提列出来,然后在来一一解决。
问题一:能否在系统启动过程中不加载preloaded-classes类
问题二:加载preloaded-classes类是按照什么逻辑标准来加载的
问题三:如何重新生成preloaded-classes类文件
说实话,这个疑问还真是我最开始的时候的想法。既然目的是为了加快系统启动,那么我们让系统在启动过程中不加载preloaded-classes类,那岂不是最快的方法了。然后就开始着手验证:我将源码中的preloaded-classes文件全部删除
方法如下:
rm -f frameworks/base/preloaded-classes
rm -f out/target/product/msm8953_64/system/etc/preloaded-classes
然后重新编译整个工程文件:make -j12
或者
只编译system.image文件:make systemimage -j12
然后重新烧入android的所有系统固件,发现android系统在启动过程中运行到开机动画之后就卡死了,无法正常的进入到系统launcher桌面。 经过查看系统启动信息发现,Zygote进程在ZygoteInit类的main()函数中,创建完Socket服务端后还不能立即孵化新的进程,因为这个"卵"中还缺少必要的"核酸",这个"核酸"就是预装的Framework大部分类及资源。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。