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

22
我希望将一个明文AndroidManifest.xml文件转换为二进制格式,以便Android将其打包到最终的APK中。我想在Java中完成这个操作,因为我需要在Android设备上执行此操作(这就是为什么这个问题不是如何将XML转换为Android二进制XML的重复)。我知道可以使用AAPT,但我需要一个Java方法。虽然有很多工具可以将二进制XML解码为可读文件,但没有关于如何执行相反操作的内容,这正是我想要的。感谢任何有关如何实现此操作的信息或提示。

1
这里有一个SO问题,作为将AXML解码为XML的资源 https://dev59.com/u3I95IYBdhLWcg3w5iY4#4761689 他很好心地评论了格式。我们所需要做的就是逆向工程未知数据的“黑客”部分,然后反向进行这个人的过程。现在已经很晚了,所以我会在明天早上研究一下;但希望在那之前有更多时间的人可以使用这个资源并提供帮助。 - MeetTitan
1
为了更清晰地解释赏金,@MeetTitan所建议的符合获得赏金的标准。像aapt、apktool等工具虽然可以“工作”,但并不能产生期望的结果。 - Gavin Miller
@Gavin 所以基本上你是在寻找一个不依赖于系统调用外部工具的代码答案,对吧? - David Rawson
@David,抱歉如果我的语气被误解为对抗性的,我只是在澄清。然而,我的建议是用Java重写aapt工具,而不是C/C++,这将是一种纯Java方法,并满足赏金的要求(使用Java进行编码而不需要本地方法)。Aapt源代码将提供有关格式化方法的重要见解,以生成一个合理的二进制Android XML文件,该文件可以移植到Java中。 - MeetTitan
1
@MeetTitan,我不会生气的,我只是希望这个有趣的问题能得到一个好的答案。 - David Rawson
显示剩余2条评论
3个回答

9
您可以找到许多命令行工具,用于编译和反编译Android的xml文件。这些工具由几个构建工具组合而成,包括aapt(Android Asset Packaging Tools),可用于查看、创建和更新Zip兼容的存档(zip、jar、apk)。由于此工具是Android SDK的一部分,因此在Java中没有本地实现。
幸运的是,self-compile-Android代码库拥有所有必要的文件,在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)));
    } 

谢谢,这是一个非常老的问题,我已经不再从事那个项目了,但我会接受它,因为它看起来非常有研究价值,我没有理由认为它不会起作用。 - Master_T
非常感谢。@Master_T - Prokash Sarkar
3
@Master_T,我认为这不应该被接受,因为问题是关于“如何将单个标准XML转换为AXML”的。 - amrezzd

2
从github发布页面这里下载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]

2
请勿在多个问题上发布相同的答案。系统可以检测到这一点,并会自动删除它们,您的帖子有可能被标记为可能的垃圾邮件。 - David Buck
这个问题与此问题类似。我在这两个问题上发布了相同的答案,因为它们都是正确的答案。我没有看到任何垃圾邮件,并且也从未有意这样做。如果您想要,我可以从这里删除我的答案。我还应该做些什么? - Talha Asghar
根据Dharman在您其他答案中的评论,现在您已经展示了产品的使用而不仅仅是指导某人查看存储库,这绝对是一个更好的答案。 - David Buck
我总是很荣幸能够有像你这样优秀的人在这里。 - Talha Asghar
太好了,兄弟,谢谢。我辛苦地工作了,但现在在安卓上它完全正常运行。 - DiLDoST

0

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

由于aapt是开源的,最好的解决方案就是自己构建!

已经有很多人这样做了 - 实际上Play商店中也有示例。请查看http://talc1.loria.fr/users/cerisara/posts/buildandroid/以获取从AIDE应用程序获得的aapt的使用说明。在Play商店中搜索会发现许多其他Android IDE也提供aapt功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接