科普:Android 关于Dalvik和ART
2016-03-28 11:35
281 查看
关键字:Dalvik,ART,dex,odex
(为什么叫科普呢,是尽量用通俗的语言而不是代码来阐述)
ART:即Android Runtime,google为了替代Dalvik专门为Android研发的。Android KK为开发者推出,L版本正式上线。比替代品更高效省电,执行的是本地机器码,依靠Ahead-Of-Time (AOT)机制
Java的代码实际上需要两次“转换”才可以在android设备上运行,一次发生在开发者编译打包的时候,使用开发者PC的CPU将java代码解释为JVM可执行的.class字节码(bytecode),然后通过SDK的dex工具会将该文件统一处理为Dalvik可执行的.dex文件,再将.dex文件和二进制的资源文件等统一打包为.apk文件。
第二次是在手机上,应用安装时,系统会将dex文件优化(差不多就是优化类的检索寻址去冗余啊之类的),生成odex文件(这个过程由安装服务PackageManagerService请求守护进程installd来执行的),使用手机的CPU将优化过的.odex字节码解释执行为机器码
区别在于第二步。是在安装时就执行了操作3,执行的是使用dex2oat工具提取.dex优化为.odex的机器码,也叫作预编译;而dalvik是用户安装时提取dex优化为odex的字节码(注:后缀名同样是odex,但ART和Dalvik生成并执行的分别表示不同的含义,一个是机器码,一个是字节码,这样做的意义请参照文末),每次启动都需要执行将优化过的odex字节码再转换成机器码。
App启动、运行更快
减少每次启动的编译增加电池续航
存储占用更大
安装时间更长
第一次用markdown,这篇也是我的个人笔记吧,详细的流程可参照这篇Android ART运行时无缝替换Dalvik虚拟机的过程分析
转载请注明出处,谢谢
(为什么叫科普呢,是尽量用通俗的语言而不是代码来阐述)
Pre:
Dalvik: Dalvik是Google公司自己设计用于Android平台的Java虚拟机它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。执行的是字节码,它是依靠Just-In-Time (JIT)机制去解释字节码ART:即Android Runtime,google为了替代Dalvik专门为Android研发的。Android KK为开发者推出,L版本正式上线。比替代品更高效省电,执行的是本地机器码,依靠Ahead-Of-Time (AOT)机制
简化流程
先上个图Java的代码实际上需要两次“转换”才可以在android设备上运行,一次发生在开发者编译打包的时候,使用开发者PC的CPU将java代码解释为JVM可执行的.class字节码(bytecode),然后通过SDK的dex工具会将该文件统一处理为Dalvik可执行的.dex文件,再将.dex文件和二进制的资源文件等统一打包为.apk文件。
第二次是在手机上,应用安装时,系统会将dex文件优化(差不多就是优化类的检索寻址去冗余啊之类的),生成odex文件(这个过程由安装服务PackageManagerService请求守护进程installd来执行的),使用手机的CPU将优化过的.odex字节码解释执行为机器码
区别在于第二步。是在安装时就执行了操作3,执行的是使用dex2oat工具提取.dex优化为.odex的机器码,也叫作预编译;而dalvik是用户安装时提取dex优化为odex的字节码(注:后缀名同样是odex,但ART和Dalvik生成并执行的分别表示不同的含义,一个是机器码,一个是字节码,这样做的意义请参照文末),每次启动都需要执行将优化过的odex字节码再转换成机器码。
ART优缺
系统性能大幅提升App启动、运行更快
减少每次启动的编译增加电池续航
存储占用更大
安装时间更长
注意
无论是步骤1对dex字节码进行优化,还是步骤3将dex字节码翻译成本地机器码,最终得到的结果都是保存在相同名称的一个odex文件里面的。虽然名字后缀都是odex,但是前者对应的是一个odex文件(表示这是一个优化过的dex),后者对应的是一个oat文件(实际上是一个自定义的elf文件,里面包含的都是本地机器指令)。这样保证统一后缀的作用是,原来任何通过绝对路径引用了该odex文件的代码就都不需要修改了第一次用markdown,这篇也是我的个人笔记吧,详细的流程可参照这篇Android ART运行时无缝替换Dalvik虚拟机的过程分析
转载请注明出处,谢谢
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories