在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的一些原则。 游戏的付费和免费版本不仅在代码上有所不同,而且在用户界面和游戏内容上也不相同。
该游戏是针对两个平台和几个商店(它们都具有不同的授权机制)发布的:
安卓:
黑莓OS 10
视窗
这给了我们8个不同的分发包。
环境
我们的生产工具链基于git
和TeamCity
。 没有专门的工具(如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_androidpit
与release300-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