在纯Java的环境下解析apk文件的内容,这篇博客只说明一下解决这个问题需要注意的地方:
1、工具选择:
熟悉android的同学都知道,sdk中有一个软件叫aapt.exe,我所选择的解析工具就是它,之前我也从网上找过用AXMLPrinter2.jar+jdom.jar的方式来反编译XML文件,并解析它;具体可去网上搜查一下,但是这种方法只能满足我的一部分需求,在获取图标Icon文件的时候不行了,我不知道是我代码的问题还是什么,反正纠结了好久,最后只好寻求另外的方法;
所以,我使用了android自带的aapt工具来解析
2、注意事项:
(1)aapt工具在windows环境是aapt.exe文件,在linux环境是aapt文件,具体可去官网下载
(2)linux和windows环境使用的命令是不同的,这里我只简单贴一下代码,并没有封装
private Process mBuilder;
Runtime rt = Runtime.getRuntime();
private static final String SPLIT_REGEX = "(: )|(=')|(' )|'";
private static final String FEATURE_SPLIT_REGEX = "(:')|(',')|'";
/**
* aapt所在的目录。
*/
private String mAaptPath = "D:\\App\\";//winOS
//private String mAaptPath = "/app/upa/tools/";//linux
/***
* apkPath
*/
static String apkPath = "D:/laiwang_4.5.2.apk";
//static String apkPath = "";
/**
* 返回一个apk程序的信息。
*
* @param apkPath
* apk的路径。
* @return apkInfo 一个Apk的信息。
*/
public ApkInfo getApkInfo(String apkPath) throws Exception {
String order = mAaptPath + "aapt.exe" + " d badging \"" + apkPath
+ "\"";
/*String order = mAaptPath + "aapt" + " d badging \"" + apkPath
+ "\"";
String[] cmds = new String[]{"sh","-c",order};
System.out.println(order);*/
Process proc = rt.exec(order);
//Process proc = rt.exec(cmds);
InputStream is = null;
is = proc.getInputStream();
BufferedReader br = new BufferedReader(
new InputStreamReader(is, "utf8"));
String tmp = br.readLine();
try {
if (tmp == null || !tmp.startsWith("package")) {
throw new Exception("参数不正确,无法正常解析APK包。输出结果为:\n" + tmp + "...");
}
ApkInfo apkInfo = new ApkInfo();
do {
setApkInfoProperty(apkInfo, tmp);
} while ((tmp = br.readLine()) != null);
return apkInfo;
} catch (Exception e) {
throw e;
} finally {
proc.destroy();
closeIO(is);
closeIO(br);
}
}
(3) 对于获取apk文件的icon图标,这里使用io流,写入文件
IconUtil.extractFileFromApk(apkPath, apkInfo.getApplicationIcon(),
"D:\\icon.png");
下面贴上信息摘要,而且在D盘根目录下会有icon.png图标生成