Android系统刷机后第一次启动很慢的原因
2015-08-27 11:17
591 查看
在做Android内核开发的过程中,我们会发现,每次编译完系统源码,烧录到设备/手机中后,第一次启动都会很慢很慢,要好几分钟甚至十几分钟,为什么会出现这样的现象呢?系统刷机后第一次启动与后面再次启动有什么不同呢?
要解答这个问题,首先我们需要了解一下Android Dalvik虚拟机,以及Dalvik-cache。
由于嵌入式设备内存有限、CPU处理器不够强大、功耗敏感等原因,Google没有使用标准的JVM虚拟机,而是为Android单独开发了Dalvik虚拟机。
Dalvik虚拟机与JVM虚拟机有很大不同,它运行的是经过优化和压缩的DEX字节码,与标准的JAR字节码并不一样,占用空间更小,而且还可以进一步优化,Android SDK中专门提供了dx工具把传统的Java字节码转换为Dalvik虚拟机可以运行的DEX字节码,这个转换过程是在程序编译的时候就完成了,这就是为什么我们可以用Java来编写能运行于Android Dalvik虚拟机的程序的原因了。关于这个过程,下面这张示意图比较直观:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/15/6a64e54459c0efe2d2ee5e5855fc2865.jpg)
为了便于传播,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目录中
(4) 用户点击应用图标后,直接从dalvik-cache目录中快速加载优化过的DEX字节码,这样程序就可以很快的启动了。
理解了上述原理,本文探讨的问题也就迎刃而解了,Android系统刷机后第一次启动时,需要扫描所有预装的apk文件,提取dex字节码,优化并且拷贝到/data/dalvik-cache缓存目录中,因此,第一次启动耗时会明显更高。
要解答这个问题,首先我们需要了解一下Android Dalvik虚拟机,以及Dalvik-cache。
由于嵌入式设备内存有限、CPU处理器不够强大、功耗敏感等原因,Google没有使用标准的JVM虚拟机,而是为Android单独开发了Dalvik虚拟机。
Dalvik虚拟机与JVM虚拟机有很大不同,它运行的是经过优化和压缩的DEX字节码,与标准的JAR字节码并不一样,占用空间更小,而且还可以进一步优化,Android SDK中专门提供了dx工具把传统的Java字节码转换为Dalvik虚拟机可以运行的DEX字节码,这个转换过程是在程序编译的时候就完成了,这就是为什么我们可以用Java来编写能运行于Android Dalvik虚拟机的程序的原因了。关于这个过程,下面这张示意图比较直观:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/15/6a64e54459c0efe2d2ee5e5855fc2865.jpg)
为了便于传播,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目录中
(4) 用户点击应用图标后,直接从dalvik-cache目录中快速加载优化过的DEX字节码,这样程序就可以很快的启动了。
理解了上述原理,本文探讨的问题也就迎刃而解了,Android系统刷机后第一次启动时,需要扫描所有预装的apk文件,提取dex字节码,优化并且拷贝到/data/dalvik-cache缓存目录中,因此,第一次启动耗时会明显更高。
相关文章推荐
- 美团Android DEX自动拆包及动态加载简介
- 使用ScrollView属性fillViewport解决android布局不能撑满全屏的问题
- Android 在一个程序中启动另一个程序
- android pcm
- 来到CSDN的第一篇文章——有关android开发
- android 在一个应用中启动另一个应用
- android:src=""与android:background=""区别
- 解决 Android sdk content loader 0%【亲测】
- android studio功能键
- image loader 加载本地图片
- Android开发之简单的聊天室(客户端与服务器进行通信)
- Android 自定义View:TopBar
- android静态库链接顺序问题
- Android常见度量单位
- Android--SharedPreferences
- 轻松实现支付功能之Android alipay、wxpay实现。
- Android Toolbar样式定制详解
- Android学习【3】Android开发问题记录
- Android github上开源项目集合
- Android---如何提高模拟器的速度