什么是ODEX?
Android应用程序中有一个叫做classes.dex的文件,这是Java源码经过ADT的编译后会转换出来的。
它是Android系统中可以在Dalvik虚拟机上直接运行的文件格式,而odex则是由classes.dex生成的。
ODEX优化有什么用?
ODEX的用途是分离程序资源和可执行文件、以及做预编译处理,达到加快软件加载速度和开机速度的目的。
一般来说,厂商的原厂系统都会为自己的ROM做ODEX优化处理以提高性能。
棒棒糖与ART带来的疑问?
很多人会有疑问,Android 5.0开始,默认已经使用ART,弃用Dalvik了。
应用程序会在安装时被编译成OAT文件,(ART上运行的格式)ODEX还有什么用呢?
这里我们引用Google权威的回答:
[indent]
Dex file compilation uses a tool called dex2oat and takes more time than dexopt. The increase in time varies, but 2-3x increases in compile time are not unusual. For example, apps that typically take a second to install using dexopt might take 2-3 seconds.
[/indent]
DEX转换成OAT的这个过程是5.0/6.0以上系统用户在安装程序或是刷入ROM、增量更新后首次启动时必然执行的。
按照Google的说法,相比做过ODEX优化,未做过优化的DEX转换成OAT要花费更长的时间,比如2-3倍。
比如安装一个odex优化过的程序假设需要1秒钟,未做过优化的程序就需要2~3秒。
由此可见,虽然dalvik被弃用了,但ODEX优化在Android 5.0/6.0系统以上依旧起着作用。
ODEX优化事实上是由一个叫做WITH_DEXPREOPT的参数控制的,开启该参数后,会对APK、JAR以及内核镜像进行优化。
其中,针对APK和JAR的最直观的优化体现就是,程序的dex被转换成odex。
是否是这样子,本人抛砖引玉,希望大神解惑