一篇文章带你了解 Android的 JIT 、AOT、Dalvik、ART ,不再傻傻分不清

为了解释以上概念,我们得从Android 编译过程说起。

     我们使用Java开发android,在编译打包APK文件时,会经过以下流程:

    Java编译器将应用中所有Java文件编译为class文件,dx工具将应用编译输出的类文件转换为Dalvik字节码,即dex文件之后经过签名、对齐等操作变为APK文件。

科普了概念之后,要开始聊一聊编译打包的前世今生。

   在apk运行在手机上的时候,JAVA虚拟机需要将dex文件转换成机器能识别的的机器码,如果每次执行一段代码都执行这个过程,将dex转换成机器能识别的语言的过程(微处理器指令),然后交给系统处理,这样的效率不是很高。
为了解决这个问题,Google在2.2版本添加了JIT编译器,当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行编译,经过编译后的代码,会被优化成相当精简的原生型指令码(即native code),这样在下次执行到相同逻辑的时候,速度就会更快。

   那么什么是JIT呢?JIT是"Just In Time Compiler"的缩写,就是"即时编译技术",与Dalvik虚拟机相关。当然,如果你的“这段代码”被重复执行的次数非常少,那么JIT的效果会不太明显。

   有一点需要注意,那就是dex字节码翻译成本地机器码是发生在应用程序的运行过程中的,并且应用程序每一次重新运行的时候,都要做重做这个翻译工作,所以这个工作并不是一劳永逸,每次重新打开App,运行代码的时候,都需要JIT编译。

   JIT是在2.2版本提出的,目的是为了提高Android的运行速度,一直存活到4.4版本,因为在4.4之后两种运行时环境共存(JIT 和 ANR),可以相互切换,但是在5.0+,Dalvik虚拟机则被彻底的丢弃,全部采用ART.

   ART是啥,为了便于大家的理解,可以先把它想象成Dalvik。AOT 可以理解成JIT的存在。

   AOT是"Ahead Of Time"的缩写,指的就是ART(Anroid RunTime)这种运行方式。

   推出AOT的其中原因之一是JIT即时编译的缺陷。前面介绍过,JIT是运行时编译,这样可以对执行次数频繁的dex代码进行编译和优化,减少以后使用时的翻译时间,虽然可以加快Dalvik运行速度,但是还是有弊病,那就是将dex翻译为本地机器码也要占用时间,所以Google在4.4之后推出了ART,用来替换Dalvik。

   ART的策略与Dalvik不同,在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。之后打开App的时候,不需要额外的翻译工作,直接使用本地机器码运行,因此运行速度提高。

当然ART与Dalvik相比,还是有缺点的。

(1)ART需要应用程序在安装时,就把程序代码转换成机器语言,所以这会消耗掉更多的存储空间,但消耗掉空间的增幅通常不会超过应用代码包大小的20%

(2)由于有了一个转码的过程,所以应用安装时间难免会延长

但是这些与更流畅的Android体验相比而言,不值一提。

你可能感兴趣的:(Android高级)