来自单一源代码的多个Android应用程序包.apk文件

我想要一个Android构build系统过程,命令行或Eclipse,从一个源代码库生成几个.apk文件。 一些常见的原因 – 针对具有不同需求的市场或免费和付费版本的具体版本。

这个问题不是关于:

  • 将共享代码封装到Android库或外部Javajar中

  • 生成debugging与签名版本.apk

谷歌说: “您可能需要为每个要发布的APK创build单独的Android项目,以便您可以分别适当地开发它们,只需简单地复制现有项目并重新命名即可。 然后,他们善意地build议使用图书馆,我明白。 然后,他们正确地提到了我所要的:“一个可以根据构buildconfiguration输出不同资源的构build系统”

  • 我知道要在JAVA中完成条件编译,可以closures“public static final”variables。 有一个在build.xml 中调整这样一个值的例子 。 任何一个更完整的Android Ant构buildconfiguration的例子,或者到现在的OSS项目的链接呢? 顺便说一句,build.xml是自动生成的,但我看到有人剽窃它,那么这是如何工作的?

  • 在Manifest.xml中声明的包名称为package =“com.example.appname”,如果需要发出多个不同名称的.apks,那么每个包含一个单独的项目?

我从一个源代码树生成2个不同的APK(演示和生产),进行了3​​个小的修改:

1)我有public static final DEMO=true; //false; public static final DEMO=true; //false; 在我的Application类,并根据我用来切换演示/生产function之间的代码值

2)有两个主要的活动,如:

 package mypackage; public class MyProduction extends Activity { //blah-blah } package mypackage.demo; public class MyDemoActivity extends mypackage.MyProductionActivity { //blah-blah } 

3)最后2个独立的AndroidManifest.xml文件指向不同的发射器活动取决于演示/生产开关

我在2个APK之间手动切换,但在写入小型ANT任务时自动切换它们并不难

一种方法是维护两个独立的AndroidManifest.xml,每个configuration一个。 你可以在两者之间来回切换手动(复制)或自动(build立脚本)。

这个人在这里有一个系统来做这种事情: http : //blog.elsdoerfer.name/2010/04/29/android-build-multiple-versions-of-a-project/

正如本网站所解释的那样,这个答案 尖叫了 Gradle 。 它正式内置到Android Studio中,并受到鼓励。

太奇妙了; 我已经使用相同的源代码构build了3个独立的应用程序,具有自定义的文本和graphics,没有任何特殊的编码。 只需要一些目录和Gradle设置,我的其他职位可以find两个答案。

这似乎很好地解释了所有的基础知识。 有关您的具体问题的答案,请参阅Build Variants下的Product Flavors部分,其中描述了指定不同的风味。

正如网站所解释的,这个devise背后的目的之一就是让它更具dynamic性,更容易让多个APK使用基本相同的代码来创build,这听起来就像你在做什么。

我可能没有解释最好的,但该网站做得不错。

尽pipe你坚持认为这不是将共享代码打包到Android库中,但它是这样的。 你已经说过,市场可能有不同的要求,或者有免费和付费的版本。 在每个示例中,您的两个最终输出APK具有不同的行为和/或资源。 您可以将大部分代码放在共享的Android库中,然后在实际项目中保持不同。

例如,我已经开发了应用程序,他们需要发布到Android Market和Amazon AppStore。 亚马逊AppStore要求,如果你链接到应用程序的市场页面,它必须是亚马逊的(而不是Android Market页面)。 您可以将资源中的URL存储在资源库中,然后在代码中使用该资源,但是会覆盖Amazon项目中的资源以指向相应的Amazon URL。

如果你的结构是正确的,你可以在代码中做类似的事情,因为你的起点是你的应用程序对象,你可以inheritance和做不同的事情。

也就是说,如果您想要添加一个更改清单中包名称的Ant步骤,那么它就是 XML。 作为预编译步骤来修改应该不难。

这篇文章有一个很好的演练,如何在构build时修改configuration文件的例子; 具体参见定制构build使用Javaconfiguration文件部分。 请注意,关于build.xmlant的一些信息现在已经过时了一些。

我有同样的问题,但包装所有在一个项目与标志是没有解决办法给我。 我写了一个例子,如何用Maven做到这一点:

如何从一个由Maven多模块项目组织的代码库创build多个Android apk文件。

我的团队使用单个代码库+附加代码构build2个不同的版本。 由于android构build基于ant脚本,我使用ant脚本来完成这项工作。

我用xmltask来操作清单xml文件和许多ant任务(regexp,copy ..)来编辑源代码。

我准备了模板项目模板(包括build.xml,default.properties,local.properties),并将新的源代码复制到这些项目模板中。 拷贝完成后,运行build.xml并行以缩短编译时间。 当完成时,我得到了多个apk文件。

这是我们的情况:我们有一个我们为几个客户发布的代码库。 他们每个人都对应用程序中的标题,背景和其他资源有不同的要求(更不用说包名称)。

构build由修改AndroidManifest的Ruby脚本处理,从特定于客户端的文件夹复制/replace某些资源,然后转到Android的标准构build例程。 构build完成后,脚本将已更改的文件重置为原始的“默认”状态。

那么…也许这不是最佳的,绝对不是特定于Android的,但是这就是我们的做法。

我认为最好的方式仍然是使用libray的通用来源和两个不同的Android项目的演示和生产包。 这是因为在Java中,从apk到源进行逆向生成是非常简单的。 如果你使用相同的源代码进行演示和制作,有人可能会破解你的apk下载演示包,提取java源代码,并解锁variables源,将其作为生产版本使用。 使用库可以保留生产包中的部分源代码,这样就无法使用演示包作为生产包。

使用Android Studio构build变体(使用渐变作为构build系统)很容易实现您的目标。

点击这里查看更多详细信息。