前言
Apktool 是一个常用的Android APK反编译工具,它可以将资源解码为几乎原始的形式,并在进行一些修改后重新构建它们。多用于逆向工程和SDK方向。
声明
本文讲解内容均来自Apktool官网 对内容进行翻译与解释,请勿纠结。
1.Apktool的安装
1.1 安装前的检查
1.需要安装JAVA 1.8
2.命令提示符下执行 java -version 查看jdk版本是否是JAVA 1.8
3.如果不是JAVA 1.8 会有一些莫名其妙的问题
1.2 安装Apktool
官网上分步骤说的有点啰嗦,单针对window系统简述一下:
1.可以通过find newest here 或者Current Version: 2.4.1链接下载不同版本的apktool的jar包。
(下载下来的文件名称apktool_2.x.x.jar,为了演示方便命名为apktool.jar)
2.写一个批脚本(详细看目录1.2.1)把批脚本apktool.bat和apktool.jar两个文件放在
C:\Windows\System32下(这种方式不需要单独配置环境变量)
- 将两个文件(apktool.bat和apktool.jar)放在任何位置,然后将该目录添加到您的环境变量系统PATH变量中(与上面不需要单独配置2选1即可,3.这种方式需要单独配置环境变量)
说明 -批脚本(apktool.bat)不是必需的,但很有用,因为你不需要java -jar apktool.jar一遍又一遍地敲。官网说两个文件建议放到C://Windows下,我个人习惯是放到C:\Windows\System32下。
我是按简述步骤2来的 ,可以在window任意盘符下执行 apktool 命令行,如下图所示:
1.2.1 apktool.bat批处理脚本
@echo off
java -jar "%~dp0\apktool.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9
说明:apktool.bat和apktool.jar 一定在同一路径下 ,如果的apktool 格式是apktool_2.4.1.jar需要改下脚本如下:
@echo off
java -jar "%~dp0\apktool_2.4.1.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9
2.手动构建Apktool源码
Apktool是1个项目的集合,其中包含子项目和一些依赖项。
- brut.apktool.lib(主程序入口)
- brut.apktool.cli程序的命令行接口
- brut.j.dir工具库
- brut.j.util工具库
- brut.j.common工具库
Apktool项目git地址 : https://github.com/iBotPeaches/Apktool
2.1 构建步骤(基于Window系统)
- 我们使用gradle构建。很简单 clone 仓库 命令如下:
git clone https://github.com/iBotPeaches/Apktool
- cd Apktool 进入Apktool文件夹
-
window执行gradlew.bat脚本,其他基于unix的系统执行./gradlew
-
构建Apktool生成jar包,生成的jar包含所有的依赖
gradlew.bat build shadowJar (Window系统)
./gradlew build shadowJar (基于Unix的系统) -
构建一个混淆过的Apktool.jar(可选项)
gradlew.bat build shadowJar proguard (Window系统)
./gradlew build shadowJar proguard (基于Unix的系统)
- window输出目录路径(我把Apktool项目 clone 到了我的桌面):
C:\Users\Administrator\Desktop\Apktool\brut.apktool\apktool-cli\build\libs\apktool-cli-all.jar
生成出来的新的apktool-cli-all.jar 查看apktool 版本
注意:没有开vpn或者翻墙软件 大概率会导致构建失败,构建失败应该考虑使用vpn 科学上网
2.2 Windows上的限制
Windows在最大文件路径方面有一些限制,不能超过255个字符。Apktool项目中本身有218个字符的目录路径,这也就意味着apktool项目的存放路径不能超过37个字符!!!
这样以来,官方建议我们将此项目克隆到该位置:
C:/Users/Administrator/Desktop/Apktool (我的存放的项目路径也是该位置)
3. 最新两个版本Apktool的变化
v2.4.2(暂未对外发布)
2020.xx.xx
- gradle升级到 6.4.1
- 添加了JAVA_HOME对Windows环境的支持(如果已定义)。
- 更新许可证标题以反映开始版权日期并删除javadoc样式。
- 修复了多线程环境中二进制名称冲突的问题。
- 解决了resources.arsc在框架文件中压缩文件的问题。
- 解决了压缩空文件破坏应用程序的问题。
- 修复了在使用aapt2时使用调试模式进行处理的问题。
- 如果参数无效,则正确返回非零错误。
- 支持的新compileSdkVersion属性SdkInfo
v2.4.1
2019.11.19
- 将baksmali / smali更新为2.3.4版
- 升级到 gradle 5.6.2
- 添加了对Android Q(10)Final的支持。
- 修复了由于jmod更改而导致的JDK9 +构建问题。
- 修复了通过目录遍历将资产解压缩到意外位置的安全问题。
- 修复了api级命令在高级文档中未显示的问题。
- 修复了未创建框架目录时目录创建警告的问题。
- 解决了缺少Q速记属性映射的问题。
- 解决了复制资产时输出目录与初始结构不匹配的问题。
- 解决了反序列化期间属性值为空的NPE的问题。
- 修复了删除META-INF /服务的问题。
- 固定支持“ attr”类型。
- 修复了AOSP / Android4Me文件的擦拭许可证标头。
- 为Windows添加了增强的包装器文件。
- 添加了Advance命令,以跳过非root dex软件包的反汇编。
- 修复了MIUI包名称被重命名的问题。
- 解决未压缩文件列表中大型9patch路径垃圾邮件的问题。
- 修复了NPE注释的问题
- 解决了乱码属性的问题
- –only-main-classes修正了回归
- 修复了Window aapt / aapt2构建的32位二进制问题。
- 修复了JVM在某些情况下不了解Windows位数的问题。
- 解决了由于记录压缩导致长路径命令的问题。
结语
记录下自己的学习和工作经验,分享给有需要的人。如果有那里写的不对,说的不理解,欢迎大家的指正。