android · 2022年6月15日 1

odex apk合并成单个apk

前言

如果rom是odex化的,这时候从rom中提取出的apk中是不包含classes.dex的,也就是不包含逻辑代码,只有一些资源文件,如下图所示

odex就是原来的classes.dex生成的,并且是设备关联的,不能跨设备使用,手动生成odex文件可以参考这篇文章

这样的apk是不能单独安装的,需要把odex文件合并回apk中并且重新签名才能正常安装,操作步骤如下

准备工具

下载smali工具

baksmali是用来把odex还原成smali语法的源文件,想要对apk修改可以直接手动修改smali代码即可

smali是用来把smali文件编译成classes.dex文件的,有了这个文件就可以合并apk了

反编译odex

首先把想要提取的apk文件放到一个文件夹内

把rom中的/system/framework 目录下的文件都提取出来放到apk文件夹内如下图所示

使用如下命令行反编译odex文件

java -jar ./baksmali-2.5.2.jar deodex ./oat/arm/BluetoothService.odex -d ./framework/arm 

执行完成后会生成out目录,这个目录就是反编译好的smali代码

合并apk

接下来使用smali把反编译出来的smali代码编译成classes.dex

java -jar ./smali-2.5.2.jar assemble ./out

编译成功后会输出out.dex文件 这个就是原来的classes.dex文件

接下来把apk文件改成zip后缀名,然后使用压缩软件打开,把classes.dex文件放进去

原始的apk如下

把改好名字的classes.dex放进去如下图

apk签名

接下来需要使用另外一个工具了 dex-tools 下载下来如下所示

使用dex-tools提供的签名工具进行签名

➜  BluetoothService ./dex-tools-2.1/d2j-apk-sign.sh -t ./BluetoothService.zip 
sign ./BluetoothService.zip -> BluetoothService-signed.apk

这样apk就合并完成了,这个apk就可以通过android studio进行 debug了