反编译
- apk 文件实际上就是一个 zip 压缩包,可以直接修改后缀再解压
|-- AndroidManifest.xml 被编译成二进制的配置文件,无法阅读
|-- classes.dex Android 可以执行文件
|-- resources.arec 被编译成二进制的主资源文件
|-- assets/ 不需要编译的原始资源文件目录
|-- lib/ 库文件,.so
|-- res/ 资源文件目录
|-- META-INF/ 签名信息
使用 dex2jar 工具将 classes.dex 反解成 jar 文件,然后使用 jd-gui.exe 工具打开即可看到 Java 代码,如果没有混淆代码可读性极强
//将 classes.dex 复制到 dex2jar 的根目录下,执行如下命令就会生成对应的 jar 文件
dex2jar.bat classes.dex
- apktool 工具
apktool d -f game.apk
使用 apktool 反编译 apk 文件,会在根目录下生成 game 文件夹, -f 覆盖 game 文件夹
命令输出如下信息
反编译的几个阶段
a) 二进制配置文件 AndroidManifest.xml 反编译
b) 根据 framework 资源列表反编译二进制资源文件
c) dex 文件 baksmali 反汇编过程
d) copy 不需要反编译的资源和库文件
game 目录如下
|-- AndroidManifest.xml 配置文件可以阅读
|-- apktool.yml 反编译生成的文件,apktool 使用
|-- assets/ 不需要编译的原始资源文件目录
|-- lib/ 库文件,.so
|-- original/ 签名信息和二进制配置文件
|-- res/ 资源文件目录
|-- smali/ 反汇编生成的 smali 源码文件目录
再打包
apktool b game
编译的几个阶段
a) 汇编 smali 源码成 dex 文件
b) 使用 aapt 把资源文件编译成二进制文件
c) 复制不需要编译的库文件和目标目录
d) 打包成 apk 文件
打包后的目录
发现多了 build,dist 文件夹
|-- build/ 打包过程中的工作目录,存放对应的文件
|-- dist/ 存放生成的 apk 文件
这个时候 apk 文件是不能安装的,反编译后破坏了其签名,需要重新签名
jarsigner -verbose -keystore keystoreFile -storepass password -signedjar game\dist\game_pack.apk game\dist\game.apk keystoreFileAliasName
最后进行一个四字节对齐优化(google推荐)
zipalign -f 4 source.apk target.apk