Gradle Android插件生成不同产品口味的R文件?

时间:2013-11-01 22:10:27

标签: android gradle

我正在尝试合并我的免费应用和付费应用。 Android新构建系统的productFlavors似乎非常适合我的问题。

我的freeApp风格很好用,但是当我构建paidApp风格时,正在生成的R文件是在freeApp中定义的包结构中。

以下是gradle.build文件的摘录:

productFlavors {
freeApp {
    versionCode 201308020
    versionName "2.0.13_free"
    packageName "com.flyingspheres.android"
}
paidApp {
    versionCode 201305110
    versionName "2.0.10_paid"
    packageName "com.flyingspheres.android.inventory"
}

我一直认为R文件的位置是由清单中的包名定义的。我验证了清单文件是否正确生成。

问题是这两种口味的R文件位于同一位置。 Gradle要求清单存在于主源代码树中,因此无论我在主源代码树中放置哪个版本的清单,都将生成R.java文件。

假设我在每个风味的正确位置生成R文件;如何管理R文件的import语句,以便每个flavor引用正确的R文件?

以下是我的项目结构的屏幕截图:

enter image description here

每个AndroidManifest.xml文件都是完整且完整的清单 - 根据文档,主树中的清单应该完全覆盖产品风味版本。虽然,显然没有发生,因为应该启动的活动和内容提供商没有被覆盖。

对我所做错的任何见解都会非常感激。这必须是一个非常常见的情况,任何覆盖packageName的人都会遇到这种情况。我一直在努力解决这个问题大约一个星期,而且似乎无法独自实现目标。

谢谢,

-Aaron

1 个答案:

答案 0 :(得分:10)

在android的gradle插件0.7.3下,生成的R.java文件仅 src/main的包名称即可。它包含了不同风格的所有资源,它只是将它们放入一个生成的R.java文件中。我是从an IO talk听到的。

src/main/AndroidManifest.xml中您的包裹名称是什么?我的猜测是com.flyingspheres.android

在您的类中尝试导入 R,这些类需要使用您的src/main程序包名称以编程方式访问资源。

E.g。

import com.flyingspheres.android.R;