7

这个问题可能是主观的,但我认为 Stackoverflow 仍然是最好的提问场所:

问题域是“高级 Android 编程”。我不需要有关如何设置单个 Android 项目、如何使用库项目或如何使用 ANT 构建普通项目的信息。

假设你有一个正在运行的应用程序,一个由 Jenkins / Ant / Proguard 构建的普通 Android 项目(选择的 IDE 是 IntelliJ,但这并不重要)。此构建的结果是您将放入 Play 商店的最终 APK。

现在想象一下,您需要这个应用程序作为免费和付费版本。到目前为止没问题,只需将所有共享代码放入一个库项目中,并创建两个子项目,一个带有 App.java 启用许可证检查,另一个例如限制使用。

现在想象一下,你也想瞄准亚马逊,也许有一个新闻稿版本,等等。所以你的代码开始出现分歧,仍然有很多东西共享,但某些部分是特定于你的目标市场的。

在 C# 中有“条件编译语句”,例如“IF PLAY_STORE ...”。Java / Android有类似的东西吗?此外,它们是否与 ANT 和构建过程配合得很好。

但我不限于条件编译。“每个市场一个项目”的方法是不同的。我只是想了解您如何以可持续的方式管理这些不同的“构建配置”。这意味着它适用于 15 个项目,针对 2 种口味(免费和付费)的 3 个市场。我希望你明白我在暗示什么。所有应用程序的代码都非常相似,但是在上面的示例中,我将拥有 90 个不同的 APK - 有了这些数字,“在源代码中手动注释仅在此构建中需要等”就不再适用了。

因此,任何提示、工具、搜索词、这些问题域的经验(例如,MAVEN,它会帮助我解决任何问题,还是生成 build.xml 的 ANT + 脚本会更好)。另一个例子,如果我有一个适用于所有目标市场的“真正的”Android 项目,那么我几乎可以做任何事情。但当然,不利的一面是,如果我在最低级别添加一个新页面(例如印记页面),我需要进入 90 Manifest.xml 来添加页面......

感谢您对此的任何帮助,克里斯

PS:我会在底部添加一些我找到的关于这个主题的链接,如果有人在没有答案的情况下遇到这个问题,这可能是“第一次阅读这个”部分

http://www.asyncdev.net/2011/02/android-dev-prod-builds/

http://www.slf4j.org/ (在“将JAR放入提供IMPL”方式中相关)

(SLF4J 只是一种减少依赖关系并在部署期间提供配置的好方法 - 通过简单地添加不同的 JAR。使用这样的东西对于您自己的项目可能是矫枉过正,但这是一种方式。例如,用于许可证写入接口和一些类似 SLF4J 的代码,然后在构建期间在 Lib 文件夹中提供 PressRelease.jar 或 Productive.jar,从而更改应用程序的行为方式......)

4

2 回答 2

1

这个问题在某种程度上是基于意见的,因为在一个复杂的项目中总是有不止 1 个合适的解决方案。

前言

我将尝试解释我用来部署Linderdaum Puzzle HD的一些原则。游戏有付费和免费版本,不仅代码不同,UI 和游戏内容也不同。

游戏发布了两个平台和几个商店(都有不同的授权机制):

安卓:

  1. Google Play(2:免费+付费)
  2. AndroidPit(2:免费+付费)
  3. SlideMe(1:免费)
  4. 三星商店(1:免费)

黑莓操作系统 10

  1. 黑莓世界(1:付费)

视窗

  1. 我们使用这个版本在PC上进行开发和测试(1:付费)

这为我们提供了8 个不同的分发包。

环境

我们的生产工具链基于gitTeamCity. 不使用特殊工具(如 Maven、Gradle)。

解决方案

我们工作流程的终点是 TeamCity 项目页面,其中我们拥有对应于 8 个分发包的所有构建配置以及一些用于调试的额外构建(即带有额外检查和日志)。任何包都可以通过网络界面从任何地方一键构建。

对于每个包,都有一个git分支名称(由某些包共享),因此TeamCity知道从哪里获取源。目前我们有这个分支:

  remotes/origin/master
  remotes/origin/release300-blackberry
  remotes/origin/release300-master
  remotes/origin/release300-paid_apps
  remotes/origin/release300-paid_apps_androidpit

这里release300代表游戏的一个版本。我们有很多存档分支。这些不是开发或功能分支 - 它们仅用于保存特定游戏包的更改。即paid_apps里面有更多的游戏内容并paid_apps_androidpit包含AndroidPit 授权库。

开发发生在master合并回主控的功能分支中。然后发生合并过程。合并的方向是(并且只有这些方向):

master -> release300-master -> release300-paid_apps -> release300-paid_apps_androidpit
        \
         \-> release300-blackberry

即,release300-paid_apps_androidpit与 基本相同的内容release300-paid_apps,但是,它增加了一些新功能(如许可库等)。并且release300-blackberry是完全独立的,因为它必须针对具有不寻常的屏幕宽高比 1:1 的设备并具有特殊设计的 UI。因此,这 5 个分支用于构建我们的 8 个发行包。

我们从不将这些发布分支的更改合并回 master。错误修正以相同的方向传播。

每个包都有自己的脚本文件,即为 Google Play 构建免费应用程序就像BuildAndroid.py在 branch 上调用 Python 脚本一样简单release300-master

同样的想法适用于所有其他包:仅使用单行 TeamCity 命令行构建运行程序。

于 2013-08-13T16:53:37.093 回答
0

如果您ant因无法控制的原因而陷入困境,请考虑使用过滤器和令牌。您可以.java从与每种类型的配置或业务逻辑对应的模板生成文件。这是一个官方的例子:

<copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt">
  <filterset begintoken="%" endtoken="*">
    <filter token="DATE" value="${TODAY}"/>
  </filterset>
</copy>

这将用当前日期替换文本@DATE*并将${build.dir}/version.txt结果复制到${dist.dir}/version.txt. 这与一些智能分支一起,可以为您提供一个不错的预处理器。当然,缺点是它真的很慢(ant总的来说,这甚至更慢)。

我真的很想推荐 Gradle,因为它内置了这个功能(产品风格),但不幸的是,在它处于积极开发阶段时,这并不是一个严肃的选择。也许几个月后,但不是现在。

于 2013-08-15T19:07:52.227 回答