如何将特定于构建的配置注入 APK?

Posted

技术标签:

【中文标题】如何将特定于构建的配置注入 APK?【英文标题】:How do you inject build-specific configuration into an APK? 【发布时间】:2011-03-17 05:07:25 【问题描述】:

我有一个 android 应用程序,我将它分发给几个不同的市场提供商;每个应用程序的功能都相同,但需要某些不同的配置参数。理想情况下,我想在一个构建步骤中生成所有单独的 APK。有没有“官方”的方式来实现这一点?

我正在考虑一种方法,其中我在项目结构中有一个模板文件,并在构建时使用 ant 将值插入到输出文件中,例如 res/xml/config.xml。

提前致谢!

【问题讨论】:

【参考方案1】:

有几种方法可以解决这个问题:

1) 设置 Android 库应用程序 (专为 Eclipse 设计)

这是 Android 文档中建议的方法。使用此方法,您可以将应用程序设置为"Library Project"。

然后,对于您想要生成的每个特定构建,您将设置一个新的 Android 项目,references 之前创建的库项目。这个项目需要有自己的 AndroidManifest,它声明了库应用程序中使用的组件。由于每个应用程序都有自己的清单,因此几乎可以通过更换组件或更改信息来进行任何类型的定制。然而,虽然允许复杂的差异,但如果差异很少,这确实会在维护中产生一些冗余。

2) 构建一个 ANT 脚本或其他构建脚本来操作配置

ANT 脚本可以在构建时操纵源文件或 XML 文件以允许自定义配置。最简单的方法是使用 unix sed 或 python/ruby 脚本进行自定义。在自定义仅限于小的更改和/或仅文本替换的情况下,这是理想的选择。在大多数情况下,这是我选择的路线。

我建议在进行操作之前将源代码树复制到一个临时目录,以便可以在“ant clean”上清除它并且不会影响源代码的工作副本。

对此的一个警告是,我将设计修改,以便在不运行脚本的情况下仍然构建源代码(即,您可以在 eclipse 或任何其他环境中开发时进行标准构建,而无需运行特殊脚本)。

【讨论】:

【参考方案2】:

我使用一个包含所有代码的库项目和两个(或更多)引用该库的项目。

库项目的 res 文件夹中有一个名为 config.xml 的资源文件,该文件在其他项目中被覆盖。 这样我就可以拥有不同的应用程序设置,并且每个构建都有自己的 manifest.xml,因此您可以真正为每种构建类型配置不同的东西。

这还允许您拥有特定的代码/权限/...只有特定构建才需要,并使构建过程非常容易。

【讨论】:

【参考方案3】:

您可以为您的 apk 设置一个基于 Maven Android 插件的构建,该构建使用资源过滤和配置文件来满足您的不同配置。查看官方示例项目的 morseflash 示例,详细了解它是如何完成的。

设置好配置文件后,您可以使用 maven 调用程序插件一次性运行所有配置文件。如果您想让它自动化,只需将构建放在 Hudson 上即可。

http://code.google.com/p/maven-android-plugin/

http://code.google.com/p/maven-android-plugin/wiki/Samples

http://www.simpligility.com/2010/11/release-version-management-for-your-android-application/

【讨论】:

【参考方案4】:

我使用一个 ant 脚本,它读取一些构建时参数并为我生成适当的 APK(appname-1.1_ggl、appname-1.1_amz.apk 分别包含指向 Google Market 或 Amazon Market 的链接)。手动运行两次没什么大不了的。

这可能不现实,这取决于你有多少排列(你没有提到),但你可以使用subant。为您需要调用的每个排列使用不同的 buildpath 和后续的 build.properties

【讨论】:

以上是关于如何将特定于构建的配置注入 APK?的主要内容,如果未能解决你的问题,请参考以下文章

如何将特定于类的文件夹中的图像上传到 Azure ML Studio 上的 Azure Blob 存储

为啥不能将特定于供应商的伪元素/类组合成一个规则集?

将特定于语言环境的字符串转换为 BigDecimal 的最佳方法

从 Play 商店安装应用时缺少拆分 APK

在全局(单例)服务中使用特定于请求的上下文

如何配置 mex 以将编译器标志传递给 nvcc