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

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

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

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

这样做可以加快软件的启动速度,预先提取,减少对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/” 下

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
1、adb pull /system/framework,把整个框架的代码pull 出来,特别是arm64目录下的vdex文件
2、从vdex文件扣出dex文件,并构成jar文件,这一步可以使用16进制编辑器,找到dex\n035开头的magic,并把往后的内容导出成一个classes.dex文件,然后并压缩到jary谁的中,注意,boot-framework.vdex里,包括两个dex文件
3、adb pull /system/app/iaware/oat/arm64/base.vdex,pull出预编译后的vdex代码,并扣出dex文件
4、下载baksmali源码,编译并调试执行baksmali d –x base.vdex –d <2中生成的framework的.jar目录>
5、哪里错了改哪里,还要把华为的bootclasspath替换掉原本的bootclasspath,或者直接使用https://github.com/lcweik/smali
6、再执行一下baksmali d –x base.vdex –d<2中生成的framework的.jar目录>,全部都反编译出来了,保存在out目录,再 smali a out –o base.dex,就行了。

DEX、ODEX、OAT文件&Dalvik和ART虚拟机的更多相关文章

  1. Android odex,oat文件的反编译,回编译

    现在,许多Android手机的ROM包在生成过程中都启用优化,把jar文件抽空,生成odex/oat和vdex文件,以在运行时省掉编译时间.如果想对这些jar进行修改,就要修改它们所对应的odex或者 ...

  2. Android内存优化(一)Dalvik虚拟机和ART虚拟机对比

    1.概述 Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀. 2.D ...

  3. Android执行时ART载入OAT文件的过程分析

    在前面一文中,我们介绍了Android执行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包括有从DEX文件翻译而来的本地机器指令.还包括有原来的DEX文件内容 ...

  4. DexHunter在ART虚拟机模式下的脱壳原理分析

    本文博客地址: http://blog.csdn.net/qq1084283172/article/details/78494620 DexHunter脱壳工具在Dalvik虚拟机模式下的脱壳原理分析 ...

  5. Dalvik虚拟机和Art虚拟机

    Dalvik虚拟机 DVM是Dalvik Virtual Machine的缩写,是Android4.4及以前使用的虚拟机,所有android程序都运行在android系统进程里,每个进程对应着一个Da ...

  6. JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

    1.什么是JVM?   JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是, ...

  7. JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对照

    1.什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才干够运行Java程序,JAVA在编译后会生成相似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编 ...

  8. Android里的Dalvik、ART、JIT、AOT有什么关系?

    JIT,Just-in-time,即时编译,边运行边编译: AOT,Ahead Of Time,提前编译,指运行前编译. 区别 这两种编译方式的主要区别在于是否在“运行时”进行编译 优劣JIT优点: ...

  9. art虚拟机介绍

    Android 4.4提供了一种与Dalvik截然不同的运行环境ART(Android runtime)支持,ART源于google收购的Flexycore的公司.ART模式与Dalvik模式最大的不 ...

随机推荐

  1. 桌面面板和内部窗体JDeskPane、JInternalFrame

    桌面面板和内部窗体JDeskPane.JInternalFrame,内部窗体必须在桌面面板里. import javax.swing.*; import java.awt.*; public clas ...

  2. Linux 查看进程的线程数

    三种方法: 1. 使用top命令,具体用法是 top -H 加上这个选项,top的每一行就不是显示一个进程,而是一个线程. 2. 使用ps命令,具体用法是 ps -xH 这样可以查看所有存在的线程,也 ...

  3. beego 实现API自动化文档

    安装beego和bee工具 1.beego安装 go get -u github.com/astaxie/beego 2.安装bee工具 go get -u github.com/beego/bee ...

  4. MyBatis-获取 xxxMapper

    Main 方法,mybatis 版本为 3.5.0 使用 MapperProxyFactory 创建一个 MapperProxy 的代理对象 代理对象里面包含了 DefaultSqlSession(E ...

  5. 转: Linux 系统调用sysconf 获取系统配置信息

    1.前言 linux提供了sysconf系统调用可以获取系统的cpu个数和可用的cpu个数. 2.sysconf  函数 man一下sysconf,解释这个函数用来获取系统执行的配置信息.例如页大小. ...

  6. 解析ArcGis的字段计算器(三)——文本型字段计算,编号那些事儿

    实际操作中我们一般会将编号字段定义为文本型,因为编号不是序号,序号是一个递增数值,而编号往往是一个数字串代码. 本篇无说明的均使用VBScript语句1.怎么编号?最简单的编号—>直接在编号字段 ...

  7. range和xrange的区别

    range和xrange的区别 python3里面只有range,返回结果是一个生成器,官方文档是这样描述的 class range(object): """ range ...

  8. int、bool和str

    int bit_length 返回以二进制表示的最短长度 print(int.bit_length(10)) 结果 4 Process finished with exit code 0 int() ...

  9. HanLP 关键词提取算法分析

    HanLP 关键词提取算法分析 参考论文:<TextRank: Bringing Order into Texts> TextRank算法提取关键词的Java实现 TextRank算法自动 ...

  10. svn 在show log 时候出现 want to go offline

    今天终于把SVN服务器给配置好了,可以正常显示log信息了. 这周以来一直都在想着怎样解决svn log 显示 no date 这一问题,一时间不知道是怎么回事,上网都没能找到很好的解决方法.今天在使 ...