Android首次启动时间长优化之预编译提取Odex
本篇博文基于第一种安装场景。在系统首次启动的场景中,系统会对/system/app、/system/priv-app、/data/app文件夹下的全部APK进行dex字节码到本地机器码的翻译,相同也会对/system/framework文件夹下的APK或者JAR文件,以及这些APK所引用的外部JAR。进行dex字节码到本地机器码的翻译。这样能够保证除了应用之外。系统中使用Java来开发的系统服务,也会统一地从dex字节码翻译成本地机器码。具体内容请移步老罗的博客Android
ART执行时无缝替换Dalvik虚拟机的过程分析。
- JVM虚拟机执行的是java字节码:
java->java bytecode(class)->java bytecode(jar)注!java虚拟机基于栈,基于栈的机器必须使用指令来加载和操作栈上的数据,所需指令相对来说比較多。
- Dalvik虚拟机解释运行的dex字节码:
java->java bytecode(class)->dalvik bytecode(dex)注:相对JVM,Dalvik基于寄存器,且经过优化并同意有限的内存中同一时候执行多个虚拟机实例。每一个Dalvik应用作为一个独立的Linxu进程执行。假设一个应用中有非常多类,编译后会对应生成非常多class文件。class文件之间也会有不少冗余信息,dex格式文件把全部classs文件内容整合到一个文件。这样能够降低总体文件占用,IO操作,同一时候也提高了类的查找速度。此外。dex格式文件添加了新的操作码支持,文件结构也相对简洁,使用等长的指令来提高解析速度。
并且dex文件会尽量扩大仅仅读结构的大小,来提高进程间数据共享的速度。
- ART虚拟机运行的本地机器码:
java->java bytecode(class)->dalvik bytecode(dex)->optimized android runtime machine code(oat)注:ART所使用的AOT(Ahead-Of-Time)编译。在应用首次安装时,字节码预编译成机器码存储在本地,也就是说在程序执行前编译。而Dalvik是典型的JIT(Just_In_Time),此模式下,应用每次执行的时候,字节码都须要即时编译器转换为机器码再执行,也就是在程序执行时编译。因此在App执行时。ART模式相对于Dalvik省去了解释字节码的过程,占用内存也对应降低,进而提高App的执行效率。
二、Odex
从上面一节中我们知道,在编译打包APK时,Java类会被编译成一个或者多个字节码文件(.class),通过dx工具CLASS文件转换成一个DEX(Dalvik Executable)文件。通常情况下,我们看到的Android应用程序实际上是一个以.apk为后缀名的压缩文件。我们能够通过压缩工具对apk进行解压,解压出来的内容中有一个名为classes.dex的文件。那么我们首次开机的时候系统须要将其从apk中解压出来保存在data/app文件夹中。
假设当前执行在Dalvik虚拟机下,Dalvik会对classes.dex进行一次“翻译”。“翻译”的过程也就是守护进程installd的函数dexopt来对dex字节码进行优化,实际上也就是由dex文件生成odex文件。终于odex文件被保存在手机的VM缓存文件夹data/dalvik-cache下(注意。这里所生成的odex文件依然是以dex为后缀名,格式如:system@priv-app@Settings@Settings.apk@classes.dex)。假设当前执行于Art模式下, Art相同会在首次进入系统的时候调用/system/bin/dexopt工具来将dex字节码翻译成本地机器码,保存在data/dalvik-cache下。那么这里须要注意的是,不管是对dex字节码进行优化,还是将dex字节码翻译成本地机器码,终于得到的结果都是保存在同样名称的一个odex文件中面的,可是前者相应的是一个dey文件(表示这是一个优化过的dex),后者相应的是一个oat文件(实际上是一个自己定义的elf文件,里面包括的都是本地机器指令)。简单来说不管是Art模式。还是DVM,优化的结果都是一个odex文件,仅仅是这两种odex文件有着本质的差别(一个是dey字节码,一个是oat机器码)。之所以这么设计。主要通过这样的方式,原来不论什么通过绝对路径引用了该odex文件的代码就都不须要改动了。能够理解为这是art与dalvik兼容的结果。
因为在系统首次启动时会相应用进行安装。那么在预置APK比較多的情况下。将会大大添加系统首次启动的时间。从前面的描写叙述可知,既然不管是DVM还是ART,对DEX的优化结果都是保存在一个同样名称的odex文件,那么假设我们把这两个过程在ROM编译的时候预处理提取Odex文件将会大大优化系统首次启动的时间。
在BoardConfig.mk中定义:WITH_DEXPREOPT := true。打开这个宏之后,不管是有源代码还是无源代码的预置apk预编译时都会提取odex文件。只是这里须要注意的是打开WITH_DEXPREOPT 宏之后,预编译时提取Odex会添加一定的空间。预置太多apk。会导致system.img 过大。而编译只是。遇到这样的情况能够通过删除apk中的dex文件、调大system.img的限制大小,或在预编译时跳过一些apk的odex提取。比如跳过helloworld应用提取的方法例如以下:
在文件夹\build\core\dex_preopt_odex_install.mk中加入红色标记的代码:
ifeq ($(LOCAL_MODULE),helloworld)
LOCAL_DEX_PREOPT:=
endif
build_odex:=
installed_odex:=
....
helloworld可替换为须要跳过提取odex的apk的LOCAL_MODULE名字,如Settings等。
Android首次启动时间长优化之预编译提取Odex的更多相关文章
- atitit.查看预编译sql问号 本质and原理and查看原生sql语句
atitit.查看预编译sql问号 本质and原理and查看原生sql语句 1. 预编译原理. 1 2. preparedStatement 有三大优点: 1 3. How to look gene ...
- 面试题--如何防止sql注入,使用PreparedStatement的预编译,传入的内容就不会和原来的语句发生任何匹配的关系,达到防止注入的方法
PreparedStatement的用法 jdbc(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发 ...
- Pch文件预编译
因为项目用到Pch文件链接宏变量,因而稍作研究怎样使用,define宏变量其实并不合适 ,static const才最适合 Pch文件听说是上古世纪存在的文件,主要是用来全局预编译文件统一在一个出口, ...
- Android NDK引用预编译的动态链接库
NDK里有个例子: android-ndk-r10/samples/module-exports/jni一看就懂了 ———————————————————————————– 从r5版本开始,就支持预编 ...
- 网站优化记录-通过命令预编译Asp.net 网站,成功优化到毫秒级别。
在去年一次项目上线时发现部署的站点首次访问跟回收后响应特别慢.(使用的是vs工具预编译的方式发布),在随后找到解决办法是通过命令预编译Asp.net 网站,成功解决站点响应在毫秒级别. 预编译 ASP ...
- android应用资源预编译,编译和打包全解析
我们知道,在一个APK文件中,除了有代码文件之外,还有很多资源文件.这些资源文件是通过Android资源打包工具aapt(Android Asset Package Tool)打包到APK文件里面的. ...
- 谷歌发布 Android 8.1 首个开发者预览版,优化内存效率
今晨,谷歌推出了 Android 8.1 首个开发者预览版,此次升级涵盖了针对多个功能的提升优化,其中包含对 Android Go (设备运行内存小于等于 1 GB)和加速设备上对机器学习的全新神经网 ...
- iOS中的预编译指令的初步探究
目录 文件包含 #include #include_next #import 宏定义 #define #undef 条件编译 #if #else #endif #if define #ifdef #i ...
- 转——Android应用开发性能优化完全分析
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...
随机推荐
- Codewars练习Python
计算一个数组的中间数,数的两边和相等,并返回index值 如:数组[1,2,3,4,6] 返回3(数组序号从0开始) def find_even_index(arr): ""&qu ...
- MySQL与MongoDB的操作对比
MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方 ...
- mongodb Shell 启动
开始运行mongodb 准备 上篇说过,通过brew安装的程序目录在 /usr/local/Cellar下面 下面,我们先看一下 mongodb的可执行程序命令 cd /usr/local/Cella ...
- 【笔记JS/HTML/CSS】ubuntu环境下的sublime text2 安装 zenCoding
刚接触web编程的时候就被老师安利了sublime text2 这个文本编辑器,后来发现它真的挺好用的,无论是windows还是ubuntu,都可以很简单地下载安装(到官网,免费哦),三分钟内就搞定了 ...
- Spring框架系列(一)--Spring MVC基础知识
Web项目开发过程中一般都是使用MVC(Model-View-Controller)模式,早先的Struts2到Spring MVC,再到现在Spring Boot,都是相似的思 路.Spring B ...
- css--小白入门篇6(终)
一.相对定位 定位有三种,分别是相对定位.绝对定位.固定定位. 相对定位: 1 position:relative; 绝对定位: 1 position:absolute; 固定定位: 1 positi ...
- <SpringMvc>入门三 参数绑定
1.get请求 <%--请求参数的绑定--%> <%--get请求参数--%> <a href="/param/testParam1?username=tom& ...
- Haoop Mapreduce 中的FileOutputFormat类
FileOutputFormat类继承OutputFormat,需要提供所有基于文件的OutputFormat实现的公共功能,主要有以下两点: (1)实现checkOutputSpecs方法 chec ...
- linux的ssh相关指令
1.安装ssh apt-get install openssh-server 2.备份ssh的配置文件 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_confi ...
- pxc增量恢复
解流 xbstream -x < fullbackup2.xbstream -C /data/fullbackup xbstream -x < fullbackup2.xbstream - ...