vdex、odex与deodex

我们知道,安卓系统的软件为apk格式,把apk文件用解压缩软件打开后,会看到有个classes.dex,dex(Dalvik VM Excutors)是安卓dalvik虚拟机的可执行文件,程序的执行代码就存储在classes.dex中。


odex与deodex

      所谓odex(optimized dex),顾名思义就是优化过的dex。Dalvik虚拟机第一次执行程序的dex文件前,系统会对dex文件做优化,生成可执行文件odex,保存到data/dalvik-cache目录,最后把apk文件中的dex文件删除,这样就没必要每次加载应用时都进行优化。但仍有缺点,就是应用第一次加载耗时较长,尤其是更新系统后,需要对内置的几十甚至上百App进行odex,用户需要等很久才能进入桌面。因此,可以在编译完ROM后即对其 进行odex化,即将odex的过程由用户手机转移到开发者的编译服务器上,用户更新系统后可直接使用,无需再次odex化,大大减少了初次进入桌面的时间。这也是目前各个品牌手机原厂ROM所采用的方式。
      odex也有一定的缺点,一来是会增大体积,二来不利于发烧友们进行反编译修改(odex文件是跟随系统环境变化的,改变环境会无法运行;而apk文件中又不包含dex文件,无法独立运行)。所以民间开发者们会对原厂ROM进行deodex(即反odex——将odex还原为dex),以便进行修改。

vdex

      vdex是Android 8.0开始新增的格式包,由dex代码直接转化得到的可执行二进制码文件:

  1. 第一次开机就会生成在/system/app/<packagename>/oat/ 下
  2. 在系统运行过程中,虚拟机将其 从 “/system/app” 下 copy 到 “/data/davilk-cache/” 下

在Android 8.0之后,odex是从vdex这个文件中提取了部分模块生成的一个新的可执行二进制码文件,从vdex中提取出odex后,vdex的体积就大大减小了。而此时odex + vdex = apk的全部源码(vdex并不是独立于odex的文件,odex + vdex才代表一个apk)。

声明: 本文由(九面相柳)原创编译,转载请保留链接: vdex、odex与deodex

vdex、odex与deodex:等您坐沙发呢!

发表评论