文档章节

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

乐搏学院
 乐搏学院
发布于 2016/11/15 14:52
字数 833
阅读 7
收藏 0

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

 

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

 

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

 

Dalvik虚拟机与JVM虚拟机有很大不同,它运行的是经过优化和压缩的DEX字节码,与标准的JAR字节码并不一样,占用空间更小,而且还可以进一步优化,Android SDK中专门提供了dx工具把传统的Java字节码转换为Dalvik虚拟机可以运行的DEX字节码,这个转换过程是在程序编译的时候就完成了,这就是为什么我们可以用Java来编写能运行于Android Dalvik虚拟机的程序的原因了。关于这个过程,下面这张示意图比较直观:

 

wKiom1WvhK7wHsGpAAF7ouliy5I318.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缓存目录中,因此,第一次启动耗时会明显更高。

 

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

 

关于Android系统刷机后第一次启动的特点就简单介绍到这里了,有任何疑问或者建议欢迎留言或者来信lujun.hust@gmail.com交流

 

结束语

 

免费学习更多精品课程,登录乐搏学院官网http://h.learnbo.cn/

或关注我们的官方微博微信,还有更多惊喜哦~

 

本文出自 “Jhuster的专栏” 博客,请务必保留此出处http://ticktick.blog.51cto.com/823160/1677216

© 著作权归作者所有

共有 人打赏支持
乐搏学院
粉丝 7
博文 526
码字总数 707467
作品 0
丰台
程序员
私信 提问
全面认识Android手机教程

MIUI今天开始发布MIUI ROM的适配教程,这是第一篇,概述Android的分区与架构,个人认为对理解Android有帮助,故转帖。 原帖地址 :http://www.miui.com/thread-402322-1-1.html http://www.m...

zungyiu
2012/01/11
0
0
摩托罗拉:想解锁Bootloader找运营商

新闻来源:驱动之家 前段时间HTC CEO周永明公开表示旗下终端中将永不锁定Bootloader,对此许多厂商也都纷纷跟进,但是惟独摩托罗拉没有表明,今天摩托罗拉市场部资深总监唐之杰表示,摩托罗拉...

红薯
2011/06/09
2.3K
7
BlackHole开发日志-尝试基于Android的DNS服务器

2013-1-2 今天白天出门了,晚上把Android公开课看了两集。虽然这个课程是比较浅,不过详略还算得当,总得来说还算是不错的,而且只有3个小时,博主对这种速成式的比较感兴趣。后来浏览了几个...

黄亿华
2013/01/03
0
0
Sailfish 将能安装到 Android 设备上

芬兰创业公司Jolla开发的Sailfish操作系统兼容Android应用,也兼容Android设备。公司CEO Tomi Pienimäki接受芬兰杂志采访时证实,Sailfish 很容易安装到Android设备上。Pienimäki称,芬兰可...

oschina
2013/12/02
3.3K
23
第一行Android代码(1)

学习Android《第一行代码》 作为一名PHP程序员,又想多了解一些App开发的事,就看起了这本书。 Android系统是怎么工作的呢? Android 大致可分为四层。 1.Linux内核层 2.系统运行库层 3.应用...

phpervip
07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

正则表达式匹配不包含

^((?!xxx).)*$

安小乐
8分钟前
1
0
python Windows tkinter应用开发3 列出目录的所有文件

在本章中,我们将编写程序来执行此操作。 1)选择文件夹。 2)在UI的标签部分打印该文件夹中的所有文件名(带文件扩展名)。 首先,修改selectFile函数以打开文件夹。主文件如下: from tki...

python测试开发人工智能安全
9分钟前
1
0
使用Laya引擎开发微信小游戏(上)

  使用一个简单的游戏开发示例,由浅入深,介绍了如何用Laya引擎开发微信小游戏。      img      作者:马晓东,腾讯前端高级工程师。      微信小游戏的推出也快一年时间了,...

SEOwhywhy
14分钟前
1
0
react程序开发问题记录

1、webpack.config.dev.js文件的publicpath配置

teamlog
26分钟前
2
0
javascript 值转换为布尔值

任意javascript 的值都可以转换为布尔值。 特别是在 if() 等判断中使用的时候: 下面这些值会被转换为 false undefined , null , 0 , -0 , NaN , "" 空字符串 来自 JavaScript 权威指南 书籍...

之渊
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部