【问题标题】:How to package files into an APK archive programmatically如何以编程方式将文件打包到 APK 存档中
【发布时间】:2023-12-31 22:12:01
【问题描述】:

我想以编程方式创建一个从给定路径到目录(包含 Java 源代码)的 APK 文件。我知道这可以使用 android 工具从命令行完成,但是如何使用 Java 代码完成呢?

【问题讨论】:

  • 你想完成什么?您不能从 JAVA 创建 APK。
  • 如果您知道可以通过命令行完成,那么请尝试在 Java 中调用命令行。
  • 您也可以构建像 ANT 脚本这样的脚本,它们可能正是您正在寻找的,但它不在 java 中
  • @Pawan 性能可以忽略不计。有人已经提到过蚂蚁。如果你真的想的话,你可以在 Ant 命令上创建一个 Java 包装器,但我看不出在 Java 中这样做有什么意义。请参阅mkyong.com/java/how-to-execute-shell-command-from-java,您可以将其与运行 Ant 命令结合使用。
  • "从给定路径到目录" -- 什么的目录? Java源代码? HTML 文件?猫的照片? “它只是一个存档,就像 zip 一样,对吧?” -- 重要的是档案in,而不是档案本身。这就是为什么您确实需要通过编辑您的问题来详细解释您希望转换为 APK 的目录中的内容。答案很可能是“大多数情况下您将运行命令行二进制文件”,因为这些二进制文件是 Ant、Eclipse 和 Gradle 使用的(例如,javacdx aapt)。

标签: java android apk archive


【解决方案1】:

正如我在评论中指出的那样,大部分构建过程都是从命令行二进制文件处理的,您不太可能移植到 Java,例如 javacdxaapt

如果我站在你的立场上,我会研究 Gradle 的 IDE 集成钩子,并使用它以及合适的 build.gradle 和相关文件从你的 Java 代码驱动构建过程。能够将 Gradle 用作 The One True Build Automation System 是 Gradle for Android 努力背后的关键点之一。

否则,您建议不要使用任何现有的 Android 构建自动化选项(Gradle、Ant、Maven 以及 Eclipse 构建过程的东西),而是构建另一个一个。如果你有几十个开发者月的空闲时间并且你想走这条路,当然欢迎你这样做。您可能想查看上述实现以获取想法。

【讨论】:

  • 我想我现在明白你的意思了。这说得通。但是,由于我正在进行的项目已经使用了 Maven,所以我认为如果我坚持使用 Maven 而不是 Gradle 会更好。还是您会建议改用 Gradle 方式?
  • @Pawan:我对 Maven 对 Android 的支持没有经验,因此与 Gradle 相比,我无法评论它。话虽如此,我相信这是一个比创建自己的解决方案更好的解决方案。
  • 能否请您指出定义如何构建android apk 的Ant 文件的源代码?还是 Gradle 插件?
  • @Pawan:我还没去找他们。一般工具构建细节在tools.android.com/build
【解决方案2】:

我也有类似的担忧,经过一些研究,我最终通过从 Java (Eclipse) 调用命令行,然后将我使用的命令作为参数提供了它。我为每个我想构建的项目循环重复了这个,它工作得很好。

http://geosoft.no/development/android.html 该站点显示了在命令行中构建 Android 程序可能需要遵循的每个步骤。我只关心 .apk 部分,所以第 14 步就足够了,但您可以查看整个页面。

使用该页面中的 APK 命令,我创建了一个 ProcessBuilder 代码:

ProcessBuilder pb = new ProcessBuilder
        (new String[] {ANDROID_HOME + "\\build-tools\\android-4.4W\\aapt.exe",
                "package",
                "-v",
                "-f",
                "-M", projectRootDirPath + "\\AndroidManifest.xml",
                "-S", projectRootDirPath + "\\res",
                "-I", ANDROID_HOME + "\\platforms\\android-20\\android.jar",
                "-F", projectRootDirPath + "\\bin\\" + [APK_file_name] + ".apk",
                projectRootDirPath + "\\bin"});

ANDROID_HOME 是您的 sdk 路径,projectRootDirPath 是项目目录的路径,当然 [APK_file_name] 应该是您的 .apk 文件所需的名称。

此外,您可能需要根据您使用的版本更改“android-4.4W”和“android-20”部分。

【讨论】: