概要
步骤1:使用apktool,解压apk
提示:不了解apktool的使用,请提前找资料学习一下,这里直接使用
为什么使用apktool工具解压apk,而不使用zip工具?
说明:
- R8 的引入与默认启用 。当 Android Gradle 插件升级至 3.4.0 或更高版本时,R8 成为默认的编译工具,负责代码缩减、混淆、优化及 DEX 文件生成等任务。
- Android Gradle 插件升级至 3.4.0 之前的版本,可以使用ziputil进行解压apk包,加固后的apk可以正常运行,但是插件升级之后的版本,如果还使用ziputil,加固后的apk,安装后会直接闪退。具体原因博主没有找到,如果有知道原因的,欢迎反馈一下,博主先表示感谢。
- 后经验证,直接使用apktool,进行解压,其实就是反编译apk,然后加固完成的apk,可以正常安装运行。
apktool 解压apk(反编译apk)
提示:这里直接放工具类了,博主使用的java语言进行的脚本化运行,如有可以优化的地方,欢迎评论区反馈。
/**
* 使用 Apktool 解压(反编译)APK
*
* @param apkPath APK 文件路径
* @param outputFolder 解压后的输出目录
* @return 是否成功
*/
public static boolean decompileApk(String apkPath, String outputFolder) {
// 构建命令
String command = "C:\\Users\\Administrator\\Desktop\\apktool\\apktool d -s " + apkPath + " -o " + outputFolder;
try {
// 创建 ProcessBuilder
ProcessBuilder processBuilder = new ProcessBuilder();
// 根据操作系统选择命令解释器
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("win")) {
// Windows 系统
processBuilder.command("cmd.exe", "/c", command);
} else {
// Linux/macOS 系统
processBuilder.command("bash", "-c", command);
}
// 启动进程
Process process = processBuilder.start();
String encoding = os.contains("win") ? "GBK" : "UTF-8";
// 读取命令输出
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), encoding));
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), encoding));
// 设置超时时间(例如 3 秒)
long timeout = 3 * 1000;
long startTime = System.currentTimeMillis();
// 读取输出和错误流
String line;
while (true) {
// 检查是否超时
if (System.currentTimeMillis() - startTime > timeout) {
System.err.println("APK 解压完成!");
process.destroy(); // 终止进程
return false;
}
// 读取标准输出
if (reader.ready()) {
line = reader.readLine();
System.out.println(line);
}
// 读取错误输出
if (errorReader.ready()) {
line = errorReader.readLine();
System.err.println(line);
}
// 检查进程是否结束
try {
int exitCode = process.exitValue();
if (exitCode == 0) {
System.out.println("APK 解压成功!");
return true;
} else {
System.err.println("APK 解压失败,退出码:" + exitCode);
return false;
}
} catch (IllegalThreadStateException e) {
// 进程仍在运行,继续等待
Thread.sleep(100); // 等待 100 毫秒
}
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
小结
提示:请提前下载好apktool,并修改代码中的cmd指令地址
ApkTool工具链接 apktool github 跳转下载
提示:
如您在尝试自己加固apk,遇到任何问题,欢迎评论区交流。

3464






