首先需要把apktool放项目目录下(最新版的)
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Decompile {
// 反编译文件夹地址
private static String filePath = "";
// bat文件地址
private static String batName = "";
public static void main(String[] args) {
runbat("E:\\QQPCMgr\\Desktop\\qqq.apk");
}
public static void runbat(String apkUrl) {
try {
File directory = new File("");// 参数为空
String courseFile = directory.getCanonicalPath();
batName = courseFile + "/apktool/decompile.bat";
// 查看bat文件是否存在
File batPath = new File(batName);
if (batPath.exists()) {
batPath.delete();
}
// 查看反编译文件夹是否存在
filePath = courseFile + "/apktool/" + apkUrl.substring(apkUrl.lastIndexOf("\\") + 1, apkUrl.length() - 4);
File decPath = new File(filePath);
if (decPath.exists()) {
System.out.println("Existing deletion!");
delFolder(filePath);
System.out.println("Delete finished!");
}
// 生成bat文件
FileOutputStream out = new FileOutputStream(batName, true);
StringBuffer sb = new StringBuffer();
sb.append(Decompile.class.getResource("/").toString().substring(6).substring(0, 2));
sb.append("\r\n");
sb.append(" cd " + courseFile + "/apktool");
sb.append("\r\n");
sb.append(" apktool d " + apkUrl);
out.write(sb.toString().getBytes("utf-8"));
out.close();
// 执行反编译
Process process = Runtime.getRuntime().exec(batName);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
try {
String line = null;
while ((line = in.readLine()) != null) {
System.out.println("Decompile: " + line);
}
process.waitFor();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Decompile over!");
/*// 执行完毕删除文件
delFolder(filePath);
File batPath = new File(batName);
batPath.delete();*/
}
// 删除文件夹
public static void delFolder(String folderPath) {
try {
delAllFile(folderPath); // 删除完里面所有内容
String filePath = folderPath;
filePath = filePath.toString();
java.io.File myFilePath = new java.io.File(filePath);
myFilePath.delete(); // 删除空文件夹
} catch (Exception e) {
e.printStackTrace();
}
}
// 删除指定文件夹下的所有文件
public static boolean delAllFile(String path) {
boolean flag = false;
File file = new File(path);
if (!file.exists()) {
return flag;
}
if (!file.isDirectory()) {
return flag;
}
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (path.endsWith(File.separator)) {
temp = new File(path + tempList[i]);
} else {
temp = new File(path + File.separator + tempList[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
delFolder(path + "/" + tempList[i]);// 再删除空文件夹
flag = true;
}
}
return flag;
}
}