如何从单个源树创建两个或更多APK包,最好是在单个构建中

时间:2014-06-14 14:15:29

标签: android eclipse apk

问题是如何从单个源树构建具有不同包名的多个APK,以便并排安装。每个安装可能是生产版本旁边的内部测试版,也可能是具有不同选项的同一应用程序的不同版本,或者可能是用于A-B测试目的。为构建选择不同的源代码选项很容易,但输出不同的包名称不是。

包名称在AndroidManifest.xml中指定,然后在R.java中显示,并作为XML中的命名空间。根据一些搜索,它也可能是动态加载资源,意图命名等的一个因素。找到需要重命名的所有地方并不容易。

似乎AAPT命令有一个--rename-manifest-package`开关可以完成这项工作。有关SO的各种旧问题,但这是最近的选择。这个link显示了如何使用Ant,但是我们使用Eclipse并且这样做没有多大帮助。 this最近的问题只是Ant。

所以问题是:(a)这是一个可行的解决方案(b)是否可以通过Eclipse构建完成(c)它会错过什么,需要在正在运行的应用程序中进行识别?

1 个答案:

答案 0 :(得分:2)

  

为构建选择不同的源代码选项很容易,但不输出不同的包名称。

如果您开始使用Gradle for Android进行构建。

  

每个安装可能是生产版本旁边的内部测试版

这映射到Gradle for Android概念“构建类型”。

  

或者它可能是具有不同选项的同一应用的不同版本

这将映射到Gradle for Android概念“产品口味”。

  

或者它可能用于A-B测试目的

我认为这里的传统方法不是单独的APK,而是根据其他标准确定是A还是B的单个APK,并且相应地表现。

  

包名称在AndroidManifest.xml中指定,然后在R.java中显示,并作为XML中的命名空间。根据一些搜索,它也可能是动态加载资源,意图命名等的一个因素。找到需要重命名的所有地方并不容易。

Gradle for Android有助于将包名称的角色分割为:

  • 应用程序ID,用于确定此应用程序和其他应用程序是否可以在同一设备上同时安装

  • 用于R.java

  • 的包名称

构建类型允许您为包名称添加后缀,以用于应用程序ID角色。产品风格允许您为应用程序ID角色替换软件包名称。不会影响用于资源的包名称。

  

(a)这是一个可行的解决方案

如果我不得不猜测,那个转换是Gradle for Android用于上述应用程序ID更改的内容,因此它应该适用于其他地方。

  

(b)可以使用Eclipse构建

完成

我不知道你可以在Eclipse中改变那些类型的东西。 Gradle for Android也不会从Eclipse内部运行,至少现在不行。但是,无论如何,你所寻求的对于IDE来说没有多大意义,恕我直言。直接使用Ant,直接使用Gradle for Android,或使用Ant或Gradle for Android的持续集成服务器。

  

(c)它会错过什么,需要在正在运行的应用程序中进行识别?

如果“it”表示重命名的应用程序ID,则它对大多数代码都没有影响。 getPackageName()应该返回应用程序ID,因此依赖它的内容(例如,Maps V2 API密钥)需要考虑各种可能的值。