我希望将一个明文AndroidManifest.xml文件转换为二进制格式,以便Android将其打包到最终的APK中。我想在Java中完成这个操作,因为我需要在Android设备上执行此操作(这就是为什么这个问题不是如何将XML转换为Android二进制XML的重复)。我知道可以使用AAPT,但我需要一个Java方法。虽然有很多工具可以将二进制XML解码为可读文件,但没有关于如何执行相反操作的内容,这正是我想要的。感谢任何有关如何实现此操作的信息或提示。
aapt -> Platform_Framework_Base\tools\aapt aidl -> Platform_Framework_Base\tools\aidl androidfw -> Platform_Framework_Base\include\androidfw
zipalign -> Platform_Build\tools\zipalign host -> Platform_Build\lib\host
libpng -> Platform_External_Libpng expat -> Platform_External_Expat zlib -> Platform_External_Zlib
libcutils -> Platform_System_Core\libcutils cutils -> Platform_System_Core\include\cutils
liblog -> Platform_System_Core\liblog log -> Platform_System_Core\include\log
libutils -> Platform_System_Core\libutils utils -> Platform_System_Core\include\utils
log.h -> Platform_System_Core\include\android
asset_manager.h -> Platform_Framework_Native\include\android looper.h -> Platform_Framework_Native\include\android
zopfli -> zopfli\src
ld -> Tool_Chain_Utils\binutils-2.25\ld
如果你仔细查看源代码,你会发现应用程序使用本地jni文件执行aapt命令:
private void runAapt() throws Exception {
Util.deleteRecursive(new File(S.dirRes, "drawable-xxhdpi"));
Aapt aapt = new Aapt();
int exitCode = aapt.fnExecute("aapt p -f -v -M " + S.xmlMan.getPath() + " -F " + S.ap_Resources.getPath()
+ " -I " + S.jarAndroid.getPath() + " -A " + S.dirAssets.getPath() + " -S " + S.dirRes.getPath()
+ " -J " + S.dirGen.getPath());
if (exitCode != 0) {
throw new Exception("AAPT exit(" + exitCode + ")");
}
}
private void modifyManifest() throws Exception {
Document dom = Util.readXml(S.xmlMan);
dom.getDocumentElement().getAttributes().getNamedItem("package").setNodeValue(userInput.appPackage);
Transformer t = tf.newTransformer();
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty(OutputKeys.METHOD, "xml");
t.setOutputProperty(OutputKeys.VERSION, "1.0");
t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
t.transform(new DOMSource(dom), new StreamResult(new FileOutputStream(xmlFile)));
}
xml2axml.jar
工具,然后可以使用以下命令解码axml和编码xml文件:
将xml文件编码为axml:
java -jar xml2axml e [AndroidManifest-readable-in.xml] [AndroidManifest-bin-out.xml]
将axml文件解码为xml:
java -jar xml2axml d [AndroidManifest-bin-in.xml] [AndroidManifest-readable-out.xml]
你的问题归结为如何在Android设备上运行aapt。
由于aapt是开源的,最好的解决方案就是自己构建!
已经有很多人这样做了 - 实际上Play商店中也有示例。请查看http://talc1.loria.fr/users/cerisara/posts/buildandroid/以获取从AIDE应用程序获得的aapt的使用说明。在Play商店中搜索会发现许多其他Android IDE也提供aapt功能。