2011-09-21 56 views
48

我想要一个Android构建系统过程,命令行或Eclipse,以从单个源代码库生成几个.apk文件。一些常见原因 - 针对具有不同要求的市场或免费和付费版本的特定版本。来自单一源代码的多个Android应用程序包.apk文件

这个问题是不是关于

谷歌says“您可能需要创建单独的Android项目为每个APK打算发布,以便您可以分别适当地开发它们。你可以通过简单地复制你现有的项目并给它一个新的名字来做到这一点。“然后,他们建议使用库,我理解它。然后,他们正确地提到我想要的东西:”一个可以输出不同资源的构建系统基于构建配置”

  • 我知道,要实现条件编译在JAVA一个可键关机‘公共静态最后的’变量。有build.xml中的example of tweaking这样的值。更多一个完整的Android Ant构建配置示例或者一个到OSS项目的链接现在就这样做了吗?顺便说一下,build.xml是自动生成的,但是我看到有人在黑客攻击它,那么它是如何工作的?

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

+1

问得好...... – omt66

+0

更好的答案,这是使用'Gradle'(见我的回答如下),正式由Android工作室的支持。更有活力(可以随意添加更多应用程序)。没有变量指定哪个应用程序正在编码,并且只有一个主要活动和一个“AndroidManifest”,因为它应该是。 – craned

回答

11

我生成2个不同的APK与3次小的修改从一个单一的源树(演示和生产):

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

2)有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的手动开关,但看不到任何困难的书面小蚂蚁任务之间自动

+0

定义了两个活动的两个Manifest文件的组合很好。 –

+0

@WalterKarshat我知道,我很棒:),但是发明轮子真的很痛苦 – barmaley

+0

这看起来很不错。 如果我正确理解你的方法,那么你有一个错字;您可能打算调用MyProduction MyProductionActivity类,以便它与MyDemoActivity继承的类匹配。 – Carl

3

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

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

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

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

+0

+1用于此用例的Android库。这是你想要的。 – mmeyer

+0

我在软件工程方面卖得很好,推动了两个项目之间通用的代码到Android或其他库中。 –

+3

图书馆的建议是正确的,我宁愿维护一个Android项目,并有办法生成多个二进制目标。 Google明确提到为同一个包生成多个.apk文件,这些文件在SDK和GL版本和屏幕大小支持方面有所不同,但不会提供进一步的指导。我希望听到已经实施了这种设置的人员或者可以指向已完成的项目。 –

10

这样做的一种方法是维护两个单独的AndroidManifest.xml,每个配置一个。您可以手动(复制)或自动(构建脚本)在两者之间来回切换。这里

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

+0

这是一个有用的提示,谢谢。请问在构建脚本中如何做到这一点的例子? –

+1

@Walter Karshat:我添加了一个链接到我的答案。我希望这是你所需要的。 – Emmanuel

+0

感谢您的跟进,这是非常相关的信息。 –

0

这里是我们的处境:我们从我们推出了多个客户一个单一的代码库。他们每个人都对应用程序中的标题,背景和其他资源有各种要求(更不用说包名)。

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

嗯......也许这不是最佳的,绝对不是Android特有的,但这就是我们的做法。

+0

在原地更换文件并将其更改回来对我来说太“神奇”了,但我很高兴它能在您的安装中发挥作用。 –

+0

我会担心源代码和Ruby脚本之间的依赖关系。 – Carl

+0

有没有依赖关系,脚本不会修改源代码,只有资源。 – Ash

2

This article有一个很好的演练,举例说明如何在构建时修改配置文件;特别参见定制构建使用Java配置文件章节。请注意,有关build.xml的一些信息蚂蚁现在有点过期了。

+0

似乎对我来说,完整的解决方案将涉及到与Manifest文件混合以控制包含的资源和软件包名称,以及构建系统以有条件地编译Java,并可能发出几个.apk文件。感谢您的链接! –

1

我的团队建设2个不同的构建使用单个代码库+额外的代码来切换。 由于android构建基于ant脚本,我使用ant脚本来完成这项工作。

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

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

+1

XML编辑工具的有用链接。 –

2

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

How to create multiple Android apk files from one codebase organized by a Maven multi module project.

+0

固体解决方案,在链接的博客文章中有详细记录。谢谢,Bevor! –

+0

应更新此链接到: http://blog.zonacroft.com/blog/2013/04/14/how-to-create-multiple-android-apk-files-from-one-codebase-organized-by- a-maven-multi-module-project/ – mtbomb

+0

感谢您的信息,它已被更新.... – Bevor

0

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

5

答案这个尖叫Gradle,因为在这个website解释。它正式内置到Android Studio中,并受到鼓励。

这太神奇了;我已经使用相同的源代码构建了3个独立的应用程序,具有自定义文本和图形,无需任何特殊代码。只需要一些目录和Gradle安装程序是必需的,我的其他职位可以找到与两个答案。

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

随着网站解释说,这种设计背后的目的部分是使其更具活力,更加方便的让多个APK与本质上是相同的代码,这听起来完全像你在做什么来创建。

我可能没有解释它是最好的,但该网站做了很好的工作。

+0

这不会提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你会能够[评论任何帖子](http://stackoverflow.com/help/privileges/comment)。 –

+0

我编辑它以包含我之前要包含的链接,它为用户提供了一个答案。 – craned

+0

现在看起来好多了,近期的投票可能会被评论者忽略,这要归功于改进。 –

0

这是很容易通过使用Android Studio中建立其使用graddle作为构建系统的变种,以实现自己的目标。

检查here更详细的信息。

+0

我不得不同意alijandro,因为上面的信息与四年前Android构建环境的状态有关。这一切都改变了 –

相关问题