转自:http://ticktick.blog.51cto.com/823160/1677216

在做Android内核开发的过程中,我们会发现,每次编译完系统源码,烧录到设备/手机中后,第一次启动都会很慢很慢,要好几分钟甚至十几分钟,为什么会出现这样的现象呢?系统刷机后第一次启动与后面再次启动有什么不同呢?


要解答这个问题,首先我们需要了解一下Android Dalvik虚拟机,以及Dalvik-cache。


由于嵌入式设备内存有限、CPU处理器不够强大、功耗敏感等原因,Google没有使用标准的JVM虚拟机,而是为Android单独开发了Dalvik虚拟机。


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目录中


(4) 用户点击应用图标后,直接从dalvik-cache目录中快速加载优化过的DEX字节码,这样程序就可以很快的启动了。


理解了上述原理,本文探讨的问题也就迎刃而解了,Android系统刷机后第一次启动时,需要扫描所有预装的apk文件,提取dex字节码,优化并且拷贝到/data/dalvik-cache缓存目录中,因此,第一次启动耗时会明显更高。


扩展阅读: 《Dalvik Optimization and Verification With dexopt》

Android内核开发:为什么刷机后系统第一次启动会很慢?相关推荐

  1. Android系统刷机后第一次启动很慢的原因

    转自:Android系统刷机后第一次启动很慢的原因 - 走看看 在做Android内核开发的过程中,我们会发现,每次编译完系统源码,烧录到设备/手机中后,第一次启动都会很慢很慢,要好几分钟甚至十几分钟 ...

  2. android 刷机 备份,安卓刷机后如何还原以前ROM和系统备份

    核心提示:本教程为大家介绍刷机后如何还原到以前的ROM和系统备份. 很多人,看到了好多新的rom,包括测试版的新rom,心里痒痒的.想刷一刷.尝尝鲜,结果刷完.感觉新的rom 还没有我现在用的rom好 ...

  3. Android内核开发:系统分区与镜像文件的烧写

    本文是<Android内核开发>系列的第五篇文章,本文重点介绍如何把编译输出的镜像文件烧写到Android设备中. 玩过刷机的朋友肯定对fastboot这个工具并不陌生,它是Android ...

  4. Android内核开发:学会分析系统的启动log

    本文是<Android内核开发>系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点. 要学会分析系统 ...

  5. Android内核开发:系统编译输出的镜像文件

    本文是<Android内核开发>的第四篇文章,主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟Android系 ...

  6. Android内核开发:系统启动速度优化

    在学习新知识的过程中,我一直很推荐结合实战任务去学习,只有经历实战,才能加深对理论知识的理解.<Android内核开发>系列已经写了八篇了,本文就结合前面的内容,给大家布置一个实战任务:  ...

  7. Android内核开发:图解Android系统的启动过程

    本文是<Android内核开发>系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载.版本和分支介绍.编译和烧写等等,从本文起就要开始 ...

  8. Android内核开发:如何统计系统的启动时间

    转自:http://ticktick.blog.51cto.com/823160/1660996 本文是<Android内核开发>系列的第七篇文章,通过上一篇文章<Android内核 ...

  9. android 刷机后熄屏断网

    情况说明 我的黑鲨1代刷机后,部署了Linux系统,但是只要熄屏后过一会儿就无法访问网络了.尝试了修改电量管理.关闭省电模式等,均无效. 经过很久很久的测试,终于找到了原因.Android6.0或更高 ...

最新文章

  1. HTML特殊转义字符对照表
  2. Windows域内的时间同步
  3. boost::mpl::aux::msvc_is_class相关用法的测试程序
  4. 建议 Solr 用户更新 Apache POI
  5. 【Heritrix基础教程之2】Heritrix基本内容介绍
  6. jsp java注释_jsp注释方式
  7. 10个遥远但近在人间的天堂...
  8. oracle exception 循环,Oracle Exception In Loop
  9. mybatis SqlMapConfig.xml typeAliases
  10. 高光谱和图像特征相融合的生菜病害识别
  11. 完美仿MSN右下角弹出广告代码并可自动消失,附带关闭按钮
  12. 【转】彻底删除打印机
  13. 2022最新微信小程序商城搭建教程(附源码)
  14. 需求分析报告模板(免费)
  15. KeyMob移动广告聚合平台飙升您的移动广告收益
  16. Python 爬虫--网站下载器
  17. python你已经是个成熟的软件了_支付宝改自己还花呗表情包_你已经是个成熟的软件系列表情包大全_游戏吧...
  18. 华为最新5G手机供应商名单来了。。。
  19. 使用ffmpeg读取本地文件,进行推流
  20. 夜神安卓(android)模拟器 摇一摇

热门文章

  1. OC高效率52之“方法调配技术”调试“黑盒方法”
  2. 善于从错误中总结,而且还要持之以恒地达到目标
  3. Javascript第五章切换层效果、复选框的全选十三课
  4. 使用element-ui中的container布局容器
  5. idea lombok插件安装_开发效率不高?墙裂推荐这十款精选 IntelliJ IDEA 插件
  6. i3处理器能运行python吗_老cpu(10年前的core i3 不支持avx指令集)安装tensorflow2.0...
  7. sql 日期和当前日期时间差_SQL基础进阶16日期处理
  8. mysql 计算天数去除第二和第四个周日_123走起,MySQL每秒57万的写入
  9. go语言学习相关资料
  10. Linux make menuconfig打开失败