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

时间:2011-09-21 23:06:43

标签: android ant apk

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

这个问题是关于:

Google says“您可能需要为要发布的每个APK创建单独的Android项目,以便您可以单独适当地开发它们。您只需复制现有项目并为其命名即可。 “。然后他们建议使用我理解的库。然后,他们准确地提到了我想要的东西:“一个可以根据构建配置输出不同资源的构建系统”

  • 我知道要在 JAVA 中完成条件编译,可以关闭'public static final'变量。 build.xml中有一个example of tweaking这样的值。现在有更多完整的Android Ant构建配置示例或者OSS项目的链接吗? BTW,build.xml是自动生成的,但是我看到有人乱砍它,那么它是如何工作的?

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

10 个答案:

答案 0 :(得分:11)

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

1)我的public static final DEMO=true; //false;课程中有Application,我根据该值在演示/制作功能之间切换代码

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任务时自动切换它们并不困难

答案 1 :(得分:10)

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

[edit]此人此处有一个系统来执行此类操作:http://blog.elsdoerfer.name/2010/04/29/android-build-multiple-versions-of-a-project/

答案 2 :(得分:5)

尖叫 Gradle回答,正如此website所述。它已正式内置于Android Studio中并受到鼓励。

太神奇了;我使用相同的源代码构建了3个独立的应用程序,具有自定义文本和图形,无需任何特殊编码。只需要一些目录和Gradle设置,我的其他帖子可以找到答案。

它似乎很好地解释了所有基础知识。有关您的具体问题的答案,请查看Product Flavors下的Build Variants部分,其中介绍了指定不同口味的内容。

正如该网站所解释的,此设计背后的部分目的是使其更具动态性,并且更容易使用基本相同的代码创建多个APK,这听起来就像您正在做的那样。

我可能没有解释它最好,但该网站做得非常好。

答案 3 :(得分:3)

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

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

如果你正确构造它,你可以在代码中做类似的事情,因为你的起点是你的Application对象,你可以将它子类化并做不同的事情。

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

答案 4 :(得分:2)

This article有一个很好的演练,有关如何在构建时修改配置文件的示例;特别参见自定义构建使用Java配置文件部分。请注意,有关 build.xml ant 的一些信息现在有点过时了。

答案 5 :(得分:2)

我遇到了同样的问题但是在一个带有标志的项目中包装所有这些都不是解决方案。我写了一个如何用Maven做的例子:

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

答案 6 :(得分:1)

以下是我们的情况:我们有一个代码库,我们可以从中发布几个客户端。他们每个人对应用程序中的标题,背景和其他资源都有各种要求(更不用说包名)了。

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

嗯......也许它不是最优的,绝对不是特定于Android的,但我们就是这样做的。

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:1)

通过使用使用graddle作为构建系统的Android Studio构建变体,可以轻松实现目标。

查看here以获取更多详细信息。

答案 9 :(得分:0)

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