Closed. This question needs to be more focused。它当前不接受答案。












想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。

12个月前关闭。



Improve this question




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

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

假设您有一个正在运行的App,它是由Jenkins/Ant/Proguard构建的一个普通Android项目(选择的IDE是IntelliJ,但这并不重要)。建立完成后,您将在Play商店中放入最终的APK。

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

现在,假设您也要定位到Amazon,也许有新闻发布版本等。因此,您的代码开始出现分歧,尽管仍有很多东西共享,但是某些部分特定于例如您定位的市场。

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

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

因此,任何有关这些问题 Realm 的技巧,工具,搜索词,经验(例如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,以更改应用程序的行为...)

最佳答案

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

前言

我将尝试解释一些用于部署Linderdaum Puzzle HD的原理。该游戏提供了付费版本和免费版本,这些版本不仅在代码方面有所不同,而且在UI和游戏内容方面也有所不同。

该游戏针对两个平台和多个商店(均具有不同的授权机制)发布:

Android:

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

  • 黑莓OS 10
  • BlackBerry World(1:付费)

  • 视窗
  • 我们使用此版本在PC上进行开发和测试(1:付费)

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

    环境

    我们的生产工具链基于gitTeamCity。没有使用特殊工具(例如Maven,Gradle)。

    解决方案

    我们工作流程的终点是TeamCity项目页面,其中我们具有与8个分发程序包相对应的所有构建配置以及一些用于调试的其他构建(即带有其他检查和日志)。只需一键即可通过Web界面从任何位置构建任何软件包。

    每个软件包都有一个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的功能分支中。然后发生合并过程。合并的方向是(并且仅这些方向):
    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应用程序就像在分支BuildAndroid.py上调用Python脚本release300-master一样简单。

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

    07-27 14:07