android - 在 Android/Intellij/Jenkins 中构建配置管理

标签 android environment

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .


2年前关闭。







Improve this question




这个问题可能是主观的,但我认为 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。使用这样的东西对于您自己的项目可能是矫枉过正,但这是一种方式。例如,用于许可证写入接口(interface)和一些类似 SLF4J 的代码,然后在构建期间在 Lib 文件夹中提供 PressRelease.jar 或 Productive.jar,从而更改应用程序的行为方式......)

最佳答案

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

序言

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

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

安卓:

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

  • 黑莓操作系统 10
  • 黑莓世界(1:付费)

  • window
  • 我们使用这个版本在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代表游戏的一个版本。我们有很多存档分支。这些不是开发或功能分支 - 它们仅用于保存特定游戏包的更改。 IE。在 paid_apps还有更多游戏内容和paid_apps_androidpit包含 AndroidPit 许可库。

    发展发生在 master并在合并回master的功能分支中。然后发生合并过程。合并的方向是(并且只有这些方向):
    master -> release300-master -> release300-paid_apps -> release300-paid_apps_androidpit
            \
             \-> release300-blackberry
    

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

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

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

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

    关于android - 在 Android/Intellij/Jenkins 中构建配置管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17783254/

    相关文章:

    java - 使用 httpmime 添加 quickblox android sdk

    java - 在 Box Android API 中加载、保存和使用身份验证数据

    ruby - 使用自定义环境运行命令行

    windows - 如何为windows和linux电脑设置通用的emacs环境?

    c# - 收集系统和环境信息

    android - 应用程序中的奇怪异常

    php - MySQL、Android 和 PHP 问题

    java - 如何将 24 小时格式时间转换为 12 小时格式?

    java - 如何管理不同应用实例的属性文件?

    android - 试图模拟 Environment.getExternalStorageState