如何将特定于构建的配置注入 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 存储