浅谈JIT&AOT

1218496450.jpg

这是一篇给自己脑补的笔记!

想必很多Android用户已经在自己各种设备上使用Android L了。自己年初在淘宝上¥1200进了nexus5,系统早早的升级到Android L,不得不说Nexus是一个非常非常棒的手机。

Android L与之前Android KK的对比,Dalvik虚拟机已经在L中移除,ART(Android run time)在kk的时候作为Optional,现在已经正式代替Dalvik。讲到这些转变的时候,疑问就来了而且还根本停不下来,我不知道Dalvik之前是怎么做的,Java于我只是大学一个学期的课程,Java虚拟机,我当时在课堂上绞尽脑汁也想不出一个具体样子出来,然后浑浑噩噩,大学就过去了,好吧我想知道java在传统JVM中是如何运行的,在DVM中又是如何运行的,什么是dex,什么是odex,什么是JIT,什么是AOT,什么是oat,什么是ART...?有时想想,想这么多真的好嘛!?不过没办法,有时脑子蹦蹦出来这么多疑问,实在憋不下去就会觉得有必要抽个时间脑补一下。

dex

本质上java文件编译后都是字节码ByteCode,不管是传统的JVM,还是Google Dalvik DVM。只是这两种虚拟机环境下ByteCode有所差异,最直观的是在JVM运行的是.class文件,而DVM是.dex文件,DVM专门对移动操作系统(尤其是Android)的特性进行了优化,并且DVM的设计是基于寄存器的,指令集有非常大的不同(具体未研究),还有等等等等...,好吧,到这步,了解到.dex是字节码,至于dex文件format构成,脑补阶段暂时略过吧XD~~。

JIT

接下来Android2.2的时候引入了JIT(JUST-IN-TIME)技术,JIT技术准确来讲应该是JIT Compiler,那JIT之前是怎么一回事?最早的时候,java是由解释器(Interpreter),将每个java指令转译为对等的微处理器指令,并根据转译后的指令先后次序依序执行,一个java指令可能对应十几或者几十个对等微处理指令,运行的时候还要先解释,在硬件条件差的情况下,执行速度是可想而知有多慢的。为了解决这个问题,JIT就来了,当java执行runtime环境时,每遇到一个class,JIT就会对这个类进行编译,生成相当精简的二进制码,花费少许的编译时间来换取后续的执行速率,这个效率提高还是比较大的,但这并没有达到顶尖的效能,因为某些java文件是极少执行的,编译它们的时间有可能远远长于转译器转译执行的时间,整体下来,花费的时间并没有减少。基于JIT的经验,又出来了动态编译器(dynamic compiler),动态预判哪些需要compile哪些需要转译,所以动态编译器是既包含了转译器&编译器的。尚不确定Android的JIT技术是否为这种dynamic compiler。另外,说到这里,我们第一次执行APP速度慢一些应该是因为在做一些Compile的动作,如果说得不对,还请指正。google当时说,JIT技术的引入速度提升3-5倍,后来发现我们华丽丽的又被骗了。

Odex

讲了dex、JIT,接下来讲讲Odex,Odex即Optimize Dex对dex文件的优化,最直观的好处:

  • deodex在系统第一次开机时,需要提取所有apk里的dex文件,而odex优化是提前提取出来了,开机速度&运行速度都有提高。
  • Odex优化后,APK里可以没有dex文件,而未Odex在APK包里有一份dex文件,在/data/dalvik-cache下还有提取出来的一份,浪费存储空间。
  • 一定程度上保护了厂商自己的APK,因为apk里只有资源文件,反汇编没有意义,直接拷贝到别处无法安装运行...。

AOT

技术随着时间之轮毫不停歇前行。Android kitkat 4.4,新的Android Runtime(ART)出现了,做为一个可选项,供一些愿意的用户测试使用,当然这个时候Dalvik还是作为默认的虚拟机环境。ART采取了AOT(Ahead-Of-Time)技术,简单一点理解就是,在APK安装的时候就会做预先编译动作,编译好的文件是OAT文件,该文件本质上是一个ELF文件,这里与dex(Odex)文件最大的区别是OAT文件不再是字节码文件,而是一个可执行文件,可以更底层的与硬件接触,运行时也省去了预编译和转译的时间。在Android L中我们找不到OAT文件,其实oat文件依旧以.odex作为后缀,通过file命令或者UE打开可以看到ELF头部。另外ART设计是考虑兼容性的,即在Dalvik可以运行的APP,在系统升级到5.0、5.1(Dalvik->ART)这些APP依旧可以运行,这个是通过dex2oat做到的,dalvik下的dex、odex文件均可以通过这个工具转化为oat文件,并且odex文件将比dex文件编译的更快。

脑补暂告一段落,欢迎客官拍砖、指正。

References:

http://www.importnew.com/596.html
http://bbs.mfunz.com/thread-1007717-1-1.html
http://source.android.com/devices/tech/dalvik/configure.html
http://source.android.com/devices/tech/dalvik/index.html
http://www.th7.cn/Program/Android/201401/168089.shtml

推荐阅读更多精彩内容