# Android ODEX优化在Android 5.0/6.0版本

**URL:** <https://bbs.ixmoe.com/t/android-odex-android-5-0-6-0/18226>\
**Category:** 开发技术分享\
**Created:** [2016 年9 月 5 日 04:35 UTC](https://bbs.ixmoe.com/t/android-odex-android-5-0-6-0/18226 "2016-09-05T04:35:55Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![希尔瓦娜斯](https://bbs.ixmoe.com/user_avatar/bbs.ixmoe.com/%E5%B8%8C%E5%B0%94%E7%93%A6%E5%A8%9C%E6%96%AF/32/537_2.png) [@希尔瓦娜斯](https://bbs.ixmoe.com/u/%E5%B8%8C%E5%B0%94%E7%93%A6%E5%A8%9C%E6%96%AF)\
发布日期： [2016 年9 月 5 日 04:35 UTC](https://bbs.ixmoe.com/t/android-odex-android-5-0-6-0/18226/1 "2016-09-05T04:35:55Z")

</div>

什么是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。

是否是这样子，本人抛砖引玉，希望大神解惑
