文档章节

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

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

© 著作权归作者所有

共有 人打赏支持
乐搏学院
粉丝 6
博文 526
码字总数 707467
作品 0
丰台
程序员
一个时代的落幕,Chainfire 宣布停止开发所有 Root 应用

Android 大神 Chainfire 昨日发文宣布,将停止开发所有 Root 相关的应用。而且由于自己目前正在研究一个与 Android 无关的项目,占用了大部分的时间,所以其它跟 Root 权限无关的应用也会停掉...

王练 ⋅ 05/07 ⋅ 9

浅入浅出 Android 安全:第一章 Android

第一章 Android 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 Android 安全架构的理解不仅帮助我了解 Android 的工作原理,而且为我开启了如何构建移动操作系...

apachecn_飞龙 ⋅ 2016/11/27 ⋅ 0

Android系统源码分析团体项目BeesAndroid正式上线啦

嗨,BeesAndroid开源技术小组正式成立啦,Bees,即蜜蜂,取义分享、合作与奉献的意思,这也是BeesAndroid小组的宗旨,我们第一个团体项目BeesAndroid也于2018年3月6日同步上线,该项目的前 ...

郭孝星 ⋅ 03/08 ⋅ 0

android:X5WebView首次初始化X5内核耗时,会产生卡顿现象的解决办法

集成腾讯的X5,一般都是在application中进行初始化,不过有一个现象就是第一次启动都睡有一小会产生了UI卡顿,一开始利用IntentService进行后台线程进行初始化,但还是会产生卡顿现象,不过官...

胜_弟 ⋅ 05/22 ⋅ 0

谷歌自研Fuchsia OS将兼容安卓:亦可在x86体系运行

谷歌正在开发一款神秘的跨设备操作系统Fuchsia。近期,谷歌似乎正在给该系统添加一项功能,使其可以更好地被用户接受。 和甲骨文在Java方面的纠缠让谷歌郁闷良久,好在巨头所做的不是法律方面...

codeGoogle ⋅ 05/08 ⋅ 0

揭密针对Android设备的物理取证方法(二)

目前市面上流行着许多类型的Android设备提取方法,且有些公司或个人号称,他们的方法支持数以万计的运行环境。这给人一种印象,似乎只要你愿意,就有人能破解你的Android设备。 在揭密针对A...

技术小能手 ⋅ 06/06 ⋅ 0

Android 渗透测试学习手册 第一章 Android 安全入门

第一章 Android 安全入门 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 Android 是当今最流行的智能手机操作系统之一。 随着人气的增加,它存在很多安全风险,这些风险不可避免地被...

apachecn_飞龙 ⋅ 2016/12/06 ⋅ 0

详解 Android 是如何启动的

系统分区划分 Android 达人都经历过刷机的体验,如果通过 fastboot 来进行刷机的话,会在刷机界面看到如下的几个步骤。这些步骤是做什么用的?就是通过 fastboot 协议更新和烧录到 Android ...

雨中人X ⋅ 2016/07/07 ⋅ 0

如何让你的app在后台被干掉后优雅的启动。

作为一名Android开发师,肯定在处理用户的体验上下一定的功夫。有这么一个场景,在用户用着你开发的app的时候,突然某个聊天工具来消息了,切换到聊天工具后长时间停留,并且可能做了一些你不...

她的梦z ⋅ 04/11 ⋅ 0

浅入浅出 Android 安全:第三章 Android 本地用户空间层安全

第三章 Android 本地用户空间层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 本地用户空间层在 Android 操作系统的安全配置中起到重要作用。 不理解在该...

apachecn_飞龙 ⋅ 2016/12/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

线程池

一、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。 二、线程池的体系结构: java.util.concurrent.Executor : 负责线程的使用...

stars永恒 ⋅ 29分钟前 ⋅ 0

你值5K还是15K?实战案例,测测你的分析功力

本文源自陈老师遇到的真实案例。 老板说:“我们今年准备参加展会,做一年。以前我没参加过,没关系,这里有一份展会数据,你回去分析下哪些有价值,后边组织的时候有个指导”。现在你收到任...

加米谷大数据 ⋅ 31分钟前 ⋅ 0

中文转英文功能

package com.sysware.task.util;import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;import net.sourceforge.pinyin4j.for......

AK灬 ⋅ 32分钟前 ⋅ 0

JNI Java层类关联C/C++层的类

Android开发时,因为要实现某某功能,需要集成算法公司的算法库(so库),这就需要自己编写JNI。 通常这些库提供的接口可以概况成1、初始化 2、算法处理 3、释放 4、打印版本号 初始化后会返...

国仔饼 ⋅ 35分钟前 ⋅ 0

maven下载jar包改为阿里云的maven库

一:修改maven安装路径中conf文件夹下的setting.xml文件 <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/......

夜醒者 ⋅ 36分钟前 ⋅ 0

电商用户行为分析大数据平台相关系列10-基础数据结构分析

电商用户行为分析大数据平台相关系列1-环境介绍 电商用户行为分析大数据平台相关系列2-HADOOP环境搭建 电商用户行为分析大数据平台相关系列3-HIVE安装 电商用户行为分析大数据平台相关系列4...

xiaomin0322 ⋅ 36分钟前 ⋅ 0

使用readLine()方法遇到的坑

下午玩 TCP/IP 的 Socket 通信时,使用 BufferedReader 的 readLine() 遇到了一个坑,现在终于解决了,特此记录下来。 程序很简单,客户段从控制台读取用户输入,然后发送至服务器端,主要代...

孟飞阳 ⋅ 37分钟前 ⋅ 0

基于Hadoop集群的Hive安装配置(Derby数据库)

Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据,提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行(具体的Hive架构大家自行搜索)。接下来主要讲下Hadoop集群下...

海岸线的曙光 ⋅ 38分钟前 ⋅ 0

CoreOS裸机iso安装和相关配置

裸机通过iso安装CoreOS,个人趟了很多坑,以下就是完整的从零开始部署和配置的过程,希望对大家有用。 一、安装CoreOS到硬盘 1. 准备Live iso镜像,制作好usb启动盘 Live iso下载地址 2. 搭建...

ykbj ⋅ 43分钟前 ⋅ 0

jquery控制表格锁列(转)

表格已经完成后新加的需求,要实现锁表格的第一列。很多带这种效果的都是js封装的框架或者具体某种框架的组件,不适用解决当前问题。作为后端开发又实在不熟样式,搜到了一个可以用的,虽然样...

刘昌鑫 ⋅ 45分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部