我们如果从安卓系统中提取应用,就会发现有的apk是被优化过的,生成了odex文件,直接安装apk会报错缺少DEX文件【INSTALL_FAILED_DEXOPT】,缺少什么就给他补充什么,我们虽然没有dex文件,但是我们可以拿到odex文件,只要转码一下补充进去不就OK了?说干就干。

1. 准备必要的工具(baksmali-2.4.0.jar、smali-2.4.0.jar、oat2dex.jar[art虚拟机才需要])

前两个可以在这里下载:https://bitbucket.org/JesusFreke/smali/downloads/
oat2dex.jar在这下载:https://github.com/testwhat/SmaliEx

下载完成后,将上述三个文件和提取出来的apk以及odex文件都放在同一级目录中,命令进入该目录
例如:
目录示意图

2. 如果是art虚拟机,需要执行这一步,否则可以直接执行3

java -jar oat2dex.jar odex <oat file>

例如:
java -jar oat2dex.jar odex Dialer.odex

这一步执行完会在当前目录生成一个文件夹 名称为 Dialer.odex-odex,里面放的就是我们需要的dex文件,名称为Dialer.dex

3. 反编译dex

java -jar [baksmali jar包路径] d [dex路径] -o [输出目录]

例如:
java -jar baksmali-2.4.0.jar d Dialer.dex -o dial

执行完此步骤,会在当前目录下生成一个文件夹 dial

4. 编译classes.dex

java -Xmx512M -jar [smali jar包路径] assemble [回编smali目录,对应上面的输出目录] -o [输出路径]

例如:
java -Xmx512M -jar smali-2.4.0.jar assemble dial -o classes.dex

执行完此步骤,会在当前目录下生成一个文件classes.dex

5. 将classes.dex直接拖到之前提取出来的apk中

6.将apk重新签名即可安装

apk可以成功安装,但是打开闪退