13

我正在尝试合并我的免费应用程序和付费应用程序。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 文件的导入语句,以便每个风味都引用正确的 R 文件?

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

在此处输入图像描述

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

对我做错的任何见解将不胜感激。这必须是任何覆盖 packageName 的人都会遇到的非常常见的情况。我一直在努力弄清楚大约一个星期,但我自己似乎无法到达那里。

谢谢,

-亚伦

4

1 回答 1

10

在 android 的 gradle plugin 0.7.3 下,生成的R.java文件针对src/main的包名。它包含不同风格的所有资源,它只是将它们放入一个生成的R.java文件中。我是从一次 IO 谈话中听到的。

你的包名是src/main/AndroidManifest.xml什么?我的猜测是com.flyingspheres.android

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

例如

import com.flyingspheres.android.R;
于 2014-01-15T16:50:36.430 回答