在作Android内核开发的过程当中,咱们会发现,每次编译完系统源码,烧录到设备/手机中后,第一次启动都会很慢很慢,要好几分钟甚至十几分钟,为何会出现这样的现象呢?系统刷机后第一次启动与后面再次启动有什么不一样呢?html
要解答这个问题,首先咱们须要了解一下Android Dalvik虚拟机,以及Dalvik-cache。java
因为嵌入式设备内存有限、CPU处理器不够强大、功耗敏感等缘由,Google没有使用标准的JVM虚拟机,而是为Android单独开发了Dalvik虚拟机。android
Dalvik虚拟机与JVM虚拟机有很大不一样,它运行的是通过优化和压缩的DEX字节码,与标准的JAR字节码并不同,占用空间更小,并且还能够进一步优化,Android SDK中专门提供了dx工具把传统的Java字节码转换为Dalvik虚拟机能够运行的DEX字节码,这个转换过程是在程序编译的时候就完成了,这就是为何咱们能够用Java来编写能运行于Android Dalvik虚拟机的程序的缘由了。关于这个过程,下面这张示意图比较直观:缓存
为了便于传播,Android SDK将程序编译后的DEX字节码文件、资源文件、lib库、AndroidManifest.xml等文件一块儿打包压缩为apk文件(其实就是一个zip压缩文件),所以,apk的安装与卸载其实就是对这个zip压缩包里面的文件进行解压分析拷贝和优化的过程。微信
因为DEX字节码位于apk压缩包中,所以,若是程序启动的时候,每次都要从apk文件中解压提取DEX字节码,明显效率不高,所以,Android系统设计了以下策略:工具
(1) 建立一个"dalvik-cache"文件夹,专门存放DEX字节码,具体位于/data/dalvik-cache学习
(2) 系统第一次启动时,扫描全部的预装apk文件,提取程序的DEX字节码,通过优化后,存放到dalvik-cache目录中优化
(3) 每次安装新的apk的时候,也一样提取DEX字节码,优化后放入dalvik-cache目录中.net
(4) 用户点击应用图标后,直接从dalvik-cache目录中快速加载优化过的DEX字节码,这样程序就能够很快的启动了。设计
理解了上述原理,本文探讨的问题也就迎刃而解了,Android系统刷机后第一次启动时,须要扫描全部预装的apk文件,提取dex字节码,优化而且拷贝到/data/dalvik-cache缓存目录中,所以,第一次启动耗时会明显更高。
扩展阅读: 《Dalvik Optimization and Verification With dexopt》
关于Android系统刷机后第一次启动的特色就简单介绍到这里了,有任何疑问或者建议欢迎留言或者来信lujun.hust@gmail.com交流
结束语
免费学习更多精品课程,登陆乐搏学院官网http://h.learnbo.cn/
或关注咱们的官方微博微信,还有更多惊喜哦~
本文出自 “Jhuster的专栏” 博客,请务必保留此出处http://ticktick.blog.51cto.com/823160/1677216