DEX、ODEX、OAT文件&Dalvik和ART虚拟机

https://www.jianshu.com/p/389911e2cdfbandroid

https://www.jianshu.com/p/a468e714aca7git

 

ODEX是安卓上的应用程序apk中提取出来的可运行文件,即将APK中的classes.dex文件经过dex优化过程将其优化生成一个·odex文件单独存放,原APK中的classes.dex文件会保留。github

优化是依据当前ROM的特性进行的,会减小不少冗余信息,和当前ROM强相关,优化后,文件减少不少。加载快,运行快。优化发生在手机从出产状态到第一次启动的过程。app


这样作能够加快软件的启动速度,预先提取,减小对RAM的占用,由于没有odex的话,系统要从apk包中提取dex再运行。(只有dex,也是只有在第一次程序运行时,启动会慢些;由于要解压获得dex文件,解压出来的dex文件会存储下来,系统应用和普通应用存储位置不一样。然后再加载到内存。后面再启动时,会直接将存储的dex文件加载到内存中)。框架

 

odex , vdex ,art 文件区别

1.vdex(Android O开始加入的)编辑器

package 直接转化的 可执行二进制码 文件:函数

1.第一次开机就会生成在/system/app/<packagename>/oat/ 下;优化

2.在系统运行过程当中,虚拟机将其 从 “/system/app” 下  copy  到 “/data/davilk-cache/” 下spa

 

2.odex 调试

odex 是从vdex 这个文件中 提取了部分模块生成的一个新的 可执行二进制码 文件 , odex 从vdex 中提取后,vdex 的大小就减小了。

1.第一次开机就会生成在/system/app/<packagename>/oat/ 下

2.在系统运行过程当中,虚拟机将其 从 “/system/app” 下  copy  到 “/data/davilk-cache/” 下

3.odex + vdex = apk 的所有源码 (vdex 并非独立于odex 的文件 odex + vdex 才表明一个apk )

 

3.art

odex 进行优化 生成的 可执行二进制码 文件,主要是apk 启动的热点函数相关地址的记录,方便寻址相关; 

1.第一次开机不会生成在/system/app/<packagename>/oat/ 下,之后也不会;

2.odex 文件在运行时,虚拟机会计算函数调用频率,进行函数地址的修改;

3.最后在/data/davilk-cache/ 由虚拟机生成;

4.生成art 文件后,/system/app 下的odex 和 vdex 会无效,即便你删除,apk也会正常运行

5.push 一个新的apk file 覆盖以前/system/app 下apk file ,会触发PKMS 扫描时下发force_dex flag ,强行生成新的vdex 文件 ,覆盖以前的vdex 文件,因为某种机制,这个新vdex 文件会copy到/data/dalvik-cache/下,因而art 文件也变化了。

 

反编译vdex文件

华为mate10使用了最新的android o,并进行了预编译,而后baksmali如今还不支持androido,致使反编译困难,因而本身动手diy一、adb pull /system/framework,把整个框架的代码pull 出来,特别是arm64目录下的vdex文件二、从vdex文件扣出dex文件,并构成jar文件,这一步可使用16进制编辑器,找到dex\n035开头的magic,并把日后的内容导出成一个classes.dex文件,而后并压缩到jary谁的中,注意,boot-framework.vdex里,包括两个dex文件三、adb pull /system/app/iaware/oat/arm64/base.vdex,pull出预编译后的vdex代码,并扣出dex文件四、下载baksmali源码,编译并调试执行baksmali d –x base.vdex –d <2中生成的framework的.jar目录>五、哪里错了改哪里,还要把华为的bootclasspath替换掉本来的bootclasspath,或者直接使用https://github.com/lcweik/smali六、再执行一下baksmali d –x base.vdex –d<2中生成的framework的.jar目录>,所有都反编译出来了,保存在out目录,再 smali a out –o base.dex,就好了。

相关文章
相关标签/搜索