一、
JIT 是just In time compile的缩写,就是“即时编译技术”,用于Davlik虚拟机
AOT “Ahead of Time”的缩写,提前编译,运行前编译,一般在安装时就将字节码翻译成机器码
dalvik这个大家肯定很熟悉 Dalvik是Google公司设计用于Android平台的Java虚拟机 ,使用dex,odex(优化后)
Art是(Android runtime) 在Android系统4.4提出 在5.0之后完全弃用dalvik 全部采用art为执行环境,使用ota文件
文件格式 oat dex和odex
dex(Dalvik Executable)格式是专门为Dalvik设计的一种压缩格式,
(javac) (dx工具)
.java——>.class——->.dex
.java文件经过javac编译器生成.class字节码 再经过。dx工具生成.dex
odex(optimized dex)即优化的dex
对于在dalvik环境中 使用dexopt来对dex字节码进行优化 生成odex文件 最终存在手机的data/dalvik-cache目录下
对于art环境,使用dex2oat工具来对dex字节码生成oat文件
二、
使用Java开发Android ,在编译打包apk时,要经过以下过程
java源码->class文件->通过dx工具转换成dex文件->经过签名,对齐等操作变成apk
Davlik相当于更上一层的Java VM,负责将dex解释成机器码,如果不做处理的话,每次执行代码,都需要重新解释一遍
Google2.2之后,引入了JIT,遇到新类时,JIT编译器就会对它进行编译,优化成精简的原生型机器码(native code),下次遇到相同的类时不需要再次解释,速度会更快
如果大部分代码执行次数很少,JIT编译带来的消耗可能大于执行dex的时间,所以JIT不会编译所有代码,只会编译执行次数较多的代码
三、
但是,dex字节码翻译成本地机器码是发生在应用运行过程中,如果应用重启启动,需要重新做这个翻译工作(JIT),于是AOT和
ART应运而生,ART是用来代替Dalvik的,4.4引入,5.0以上,全部采用ART
ART的 策略和Davlik不同,在ART环境中,应用在第一次安装时就会将字节码编译成机器码,使其成为真正的本地应用,之后打开app的时候,不需要额外的翻译工作,直接使用本地机器码运行,提高运行速度
四、
ART缺点:
1、ART会消耗更多的存储空间,一般不会超过原来代码包20%
2、安装应用世间会边长
五、Android N引入了一种新的编译模式,同时使用JIT和AOT
包含了一种混合模式的运行时,应用安装时不做编译,而是解释字节码,所以可以快速启动。
ART中有一种新的,更快的解释器,通过一种新的JIT完成,但是这种JIT信息不是持久化的,取而代之的是,代码执行期间
被分析,分析结果保存起来,然后,当设备空转和充电的时候,ART会执行鍼对“热代码”进行的基于分析的编译,其他代码不做
编译
为了得到更优的代码,ART采用了几种技巧包括深度内联。
对同一个应用可以编译数次,或者找到变“热”的代码路径或者对已经编译的代码进行新的优化,这取决于分析器在随后的执行中的分析数据。这个步骤仍被简称为AOT,可以理解为“全时段的编译”(All-Of-the-Time compilation)。
这种混合使用AOT、解释、JIT的策略的全部优点如下。
- 即使是大应用,安装时间也能缩短到几秒
- 系统升级能更快地安装,因为不再需要优化这一步
- 应用的内存占用更小,有些情况下可以降低50%
- 改善了性能
- 更低的电池消耗
https://blog.csdn.net/u011326979/article/details/50748181
https://www.jianshu.com/p/de695c2d4a42
https://source.android.google.cn/devices/tech/dalvik/jit-compiler?hl=zh-cn