Android:将标准XML转换为Android二进制XML格式(AXML)

Android: converting standard XML to Android Binary XML format (AXML)

我想将纯文本 AndroidManifest.xml 文件转换为二进制格式 Android 用于将其打包到最终 APK 中。

我想在 Java 中执行此操作,因为我需要在 android 设备本身上执行此操作(这就是为什么这个问题 NOT How to convert XML to Android Binary XML 的副本。我知道你可以使用 AAPT,但我需要一个 java 方法)

有很多工具可以将二进制 xml 解码为可读文件,但没有关于如何做相反的事情的方法,这正是我想要的。

如有任何关于如何实现这一点的信息或提示,我们将不胜感激。

您可能会发现许多命令行工具可用于为 Android 编译和反编译 xml 文件。这些工具结合了多个构建工具,包括 aapt (Android Asset Packaging Tools),用于查看、创建和更新 Zip 兼容的存档(zip、jar、apk)。由于此工具是 Android SDK 的一部分,因此 Java 中没有它的本地实现。

幸运的是,self-compile-Android repository has all the necessary files in Java Native Interface (JNI)。它们已准备好在 Android 应用程序内部使用,并且能够自编译、变异和病毒传播。

这里是应用程序中可用本机模块的列表:

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)));
    } 

您的问题归结为如何在 Android 设备本身上 运行 aapt。

既然 aapt 是开源的,最好的解决方案就是自己构建它!

很多人已经这样做了 - Play 商店中确实有这样的例子。有关如何使用从 AIDE 应用程序获取的 aapt 的说明,请参阅 http://talc1.loria.fr/users/cerisara/posts/buildandroid/。在 Play 商店中搜索会发现许多其他 Android 也提供 aapt 功能的 IDE。

从 github 发布页面 here 下载 xml2axml.jar 工具,然后您可以使用以下命令解码 xml 并编码 xml 个文件:

将 xml 个文件编码为 xml:

java -jar xml2axml e [AndroidManifest-readable-in.xml] [AndroidManifest-bin-out.xml]

解码一个xml个文件到xml:

java -jar xml2axml d [AndroidManifest-bin-in.xml] [AndroidManifest-readable-out.xml]