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

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

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

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

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

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

在C#中有“条件编译语句”,如“IF PLAY_STORE ...”。 Java / Android有没有类似的东西? 另外,它们是否和ANT以及构建过程相得益彰。

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

因此,任何提示,工具,搜索词,这些问题领域的经验(例如MAVEN,它会帮助我解决任何问题,还是ANT +脚本生成build.xml会更好)。 另一个例子,如果我有针对所有目标市场的“真正的”Android项目,这可以让我做任何事情。 但是当然,如​​果我在最底层添加一个新页面(例如一个imprint页面),我需要进入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,改变应用程序的行为方式......)


你一定要看看

  • 图书馆项目 - 这将帮助你正确的代码分离,并与ant玩得很好 - 看看我们在droidcon的演示文稿:http: droidcon -app-店)
  • Gradle (又名“新建构建系统”) - 这将帮助您更轻松地构建条件并略微更好地集成IDE(使用新的Android Studio ),请点击此处查看更多信息:http://tools.android.com/tech-docs/new -build系统)
  • UPD:正如我所见,您已经在为您的项目使用LP。 一些提示让制作过程变得更简单:

  • 使用manifestmerger.enabled=true

  • 看看github.com/onepf/OpenIAB


  • 这个问题有些基于意见,因为在一个复杂的项目中,总是有超过1种合适的解决方案。

    前言

    我将尝试解释我用来部署Linderdaum Puzzle HD的一些原则。 游戏的付费和免费版本不仅在代码上有所不同,而且在用户界面和游戏内容上也不相同。

    该游戏是针对两个平台和几个商店(它们都具有不同的授权机制)发布的:

    安卓:

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

  • BlackBerry World(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包含paid_apps_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的设备,并且具有特殊设计的用户界面。 所以,这5个分支用于构建我们的8个分发包。

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

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

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


    如果因为无法控制的原因而陷入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,因为它具有内置的这种功能(产品风味),但不幸的是,在积极的开发中,这不是一个严肃的选项。 也许在几个月内,但不是现在。

    链接地址: http://www.djcxy.com/p/14737.html

    上一篇: Build configuration management in Android / Intellij / Jenkins

    下一篇: Adding EditText alongside RadioButton