文档章节

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

乐搏学院
 乐搏学院
发布于 2016/11/15 14:52
字数 833
阅读 47
收藏 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

乐搏学院
粉丝 8
博文 526
码字总数 707467
作品 0
丰台
程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.8K
7
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
706
1
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.5K
16
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22

没有更多内容

加载失败,请刷新页面

加载更多

EasyDL入驻社区果蔬店 离线识别秒级智能结算

传统收银方式高成本低效率 急需转型 500米商圈概念被越来越多的企业关注,在中国,一个社区就有可能成为一个商圈,蕴藏着巨大的商机。而在社区中,果蔬作为人们每天都要采购的高频消费商品,...

百度智能云
06/10
0
0
rabbitmq集群环境安装配置

一、主机清单 2台机器同时执行下面安装步骤 10.0.0.216 shiguang-rabbitmq-01 10.0.0.223 shiguang-rabbitmq-02 注意:请将上面内容加入2台机器 /etc/hosts (集群环境必须要加) 1、安装erlan...

caozhangming
2019/08/09
0
0
【rabbitmq-Php】-发布Publish 与订阅Subscribe

发布/订阅,使用扇型交换机(fanout) composer.json ### composer.json { "require": { "php-amqplib/php-amqplib": ">=2.9.0" }} 发布端(Publish) /** * rabbitmq......

DEPAKIN
5分钟前
0
0
如何在PHP中进行重定向? - How do I make a redirect in PHP?

问题: Is it possible to redirect a user to a different page through the use of PHP? 是否可以通过使用PHP将用户重定向到其他页面? Say the user goes to www.example.com/page.php an......

法国红酒甜
15分钟前
9
0
一周面试了 30 人,通过 2 人,面试面到我心态爆炸…

Java技术栈 www.javastack.cn 打开网站看更多优质文章 因技术团队人员调整及项目组扩编,需要招几个 Java 程序员,3~5年左右,领导要求的是能力要比现有的大部分技术人员要强,并且宁缺勿滥...

Java技术栈
05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部