本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
Android里的 ART、JIT、AOT、Dalvik之间有什么关系?
iamitnan · 521浏览 · 发布于2019-07-22 +关注

JIT,即Just-in-time,动态(即时)编译,边运行边编译;AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式

区别

这两种编译方式的主要区别在于是否在“运行时”进行编译

优劣

JIT优点:

  • 可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译)

  • 可以根据当前程序的运行情况生成最优的机器指令序列

  • 当程序需要支持动态链接时,只能使用JIT

  • 可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用


缺点:

  • 编译需要占用运行时资源,会导致进程卡顿

  • 由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡

  • 在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能


AOT优点:

  • 在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗

  • 可以在程序运行初期就达到最高性能

  • 可以显著的加快程序的启动


缺点:

  • 在程序运行前编译会使程序安装的时间增加

  • 牺牲Java的一致性

  • 将提前编译的内容保存会占用更多的外


Dalvik

Dalvik使用JIT

使用.dex字节码,是针对Android设备优化后的DVM所使用的运行时编译字节码

.odex是对dex的优化,deodex在系统第一次开机时会提取所有apk内的dex文件,odex优化将dex提前提取出,加快了开机的速度和程序运行的速度


ART

ART 使用AOT

在安装apk时会进行预编译,生成OAT文件,仍以.odex保存,但是与Dalvik下不同,这个文件是可执行文件

dex、odex 均可通过dex2oat生成oat文件,以实现兼容性

在大型应用安装时需要更多时间和空间

 


JIT与Dalvik

JIT是"Just In Time Compiler"的缩写,就是"即时编译技术",与Dalvik虚拟机相关。


怎么理解这句话呢?这要从Android的一些特性说起。

JIT是在2.2版本提出的,目的是为了提高Android的运行速度,一直存活到4.4(kitkat)版本,因为在4.4之后的ROM中,就不存在Dalvik虚拟机了。


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

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


Dalvik虚拟机可以看做是一个Java VM,他负责解释dex文件为机器码,如果我们不做处理的话,每次执行代码,都需要Dalvik将dex代码翻译为微处理器指令,然后交给系统处理,这样效率不高。

为了解决这个问题,Google在2.2版本添加了JIT编译器,当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行编译,经过编译后的代码,会被优化成相当精简的原生型指令码(即native code),这样在下次执行到相同逻辑的时候,速度就会更快。

当然使用JIT也不一定加快执行速度,如果大部分代码的执行次数很少,那么编译花费的时间不一定少于执行dex的时间。Google当然也知道这一点,所以JIT不对所有dex代码进行编译,而是只编译执行次数较多的dex为本地机器码。

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

另外,Dalvik虚拟机从Android一出生一直活到4.4版本,而JIT在Android刚发布的时候并不存在,在2.2之后才被添加到Dalvik中。


ART与AOT

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

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

在4.4版本上,两种运行时环境共存,可以相互切换,但是在5.0+,Dalvik虚拟机则被彻底的丢弃,全部采用ART。

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

当然ART与Dalvik相比,还是有缺点的。ART需要应用程序在安装时,就把程序代码转换成机器语言,所以这会消耗掉更多的存储空间,但消耗掉空间的增幅通常不会超过应用代码包大小的20%。由于有了一个转码的过程,所以应用安装时间难免会延长。但是这些与更流畅的Android体验相比而言,不值一提。

总结

通过前面背景知识的介绍,我终于可以更简单的介绍这四个名词之间的关系了:

JIT代表运行时编译策略,也可以理解成一种运行时编译器,是为了加快Dalvik虚拟机解释dex速度提出的一种技术方案,来缓存频繁使用的本地机器码

ART和Dalvik都算是一种Android运行时环境,或者叫做虚拟机,用来解释dex类型文件。但是ART是安装时解释,Dalvik是运行时解释

AOT可以理解为一种编译策略,即运行前编译,ART虚拟机的主要特征就是AOT


Android N引入的混合编译

在Android N中引入了一种新的编译模式,同时使用JIT和AOT

新的ART在安装程序时使用JIT,在JIT编译了一些代码后将这些代码保存到本地,等到设备空闲的时候将保存的这些代码使用AOT编译生成可执行文件保存到本地,待下次运行时直接使用,并且不断监视代码的更新,在代码有更新后重新生成可执行文件。 

相关推荐

android下vulkan与opengles纹理互通

talkchan · 1180浏览 · 2020-11-23 10:37:39
Android 使用RecyclerView实现轮播图

奔跑的男人 · 2176浏览 · 2019-05-09 17:11:13
微软发布新命令行工具 Windows Terminal

吴振华 · 870浏览 · 2019-05-09 17:15:04
Facebook 停止屏蔽部分区块链广告

· 754浏览 · 2019-05-09 17:20:08
加载中

0评论

评论
分类专栏
小鸟云服务器
扫码进入手机网页