dex--JIT--Odex--AOT

dex

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

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的动作,如果说得不对,还请指正。

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文件编译的更快。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值