android art 协议,Android-ART虚拟机与JIT、AOT

Android虚拟机中JIT的使用

Android ART虚拟机中,通过使用JIT与AOT相互配合,在应用程序的安装和运行阶段进行优化

Android DMV虚拟机和早期ART虚拟机的问题

Android DVM虚拟机在应用程序每次运行时,字节码都要经常JIT即时编译器编译为机器码。而ART虚拟机早期,系统在安装应用程序的时候会进行一次AOT(预编译),将字节码转换为机器码存在本地,虽然这样不用每次运行时都进行编译,但是使用AOT的方式,会导致安装过程变得很慢。

ART虚拟机加入JIT之后

所以在Android7.0时,加入了JIT即时编译器,作为AOT的一个补充,应用程序在安装时,只会将热点代码编译成机器码存在本地,缩短应用程序安装时间节省存储空间。改变了之前在安装的时候的AOT预先编译的方式,不在安装的时候进行编译机器码,AOT只是用来编译JIT热点代码文件,编译成机器码,在下次使用时就可以直接使用。直接编译成机器码之后,应用在运行过程中,就可以直接加载机器码代码,直接运行,而不需要再去从dex寻找对应的.class进行加载

在Android7.0,ART使用了运行时编译JIT,而在运行时编译的时候,还有使用了AOT,在运行前编译,代码在执行期间,会收集热点代码,热点代码会通过JIT即时编译器编译成对应的文件保存在jit code cache,在设备空闲时或者充电时,AOT仅仅编译这部分热点代码文件,剩下的非热点代码依然是在运行时编译。

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

这样的话,热点代码是已经预编译好了,就不会被普通的热修复方案给修复,因为热点代码没有在运行时加载,这样的话,修复的代码并不会被重新加载,其实就是没有修复了。所以需要自定义一个ClassLoader来重新加载后续的所有类,来达到cache无用化的效果。

总结

最初安装应用时不进行任何 AOT 编译(安装又快了),运行过程中解释执行,对经常执行的方法进行JIT,经过 JIT 编译的方法将会记录到Profile配置文件中。

当设备闲置和充电时,编译守护进程会运行,根据Profile文件对常用代码进行 AOT 编译。待下次运行时直接使用。

这样的做法,在首次运行的时候,并不如Android7.0之前的做法,但是跑的多了,就会记录更多的热点代码,然后由AOT进行编译,这样就减少了编译执行的地方,这样在执行的时候,执行次数越多,编译执行的地方就更少了,这样就变快了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值