Android gradle buildTypes: 重复的类

35

我正在将我的应用程序转换为使用gradle,并且正在尝试使用buildTypes。我有一个名为Constants 的类,我希望在发布版本中进行修改。因此,我在src/main/java/my/package/name/Constants.javasrc/release/java/my/package/name/Constants.java中各有一个文件。

当我尝试构建时,gradle告诉我在发布版本中的Constants 文件上构建失败,并显示它是重复的类的错误。

我还尝试在build.gradle中为此添加了不同的sourceSet,如下所示:

sourceSets {
    main {
        java.srcDirs = ['src/main/java'];
        //...
    }
    release {
        java.srcDirs = ['src/release/java'];
    }
}

但是这仍然给我同样的错误。所以我想知道,我在这里做错了什么?

2个回答

82

mainrelease中不可以有同一个类,你需要将它拆分到类似debugrelease这样的地方。

gradle将每个buildType的源集与main合并。
这就是为什么在release构建中该类会重复的原因。

所以规则是:将类放入main每个buildType中,但不应同时存在于两者中。


2
如果将类A放在付费和免费的buildType中,主要部分会抱怨缺少类A。如何处理? - powder366
1
文档中说可以通过相同的包名和类名覆盖类 https://developer.android.com/tools/building/configuring-gradle.html#workBuildVariants 但实际上并没有生效 :( - jaumard
除非我漏掉了什么,文档中说如果它们在不同的flavor中,你可以有相同类名/包名的同一类。但如果一个在main中,另一个在flavor中,则不行。 - tir38
@tir38 这里的文档非常清晰,关于构建变种的源集和重复类存在的问题进行了详细说明。 - miensol
1
如果在该版本中存在该类,则使用动态类加载和接口来加载类。 - Pellet
有没有办法为不同的构建类型替换主要源集(主目录)? - xxxzhi

0

“fix” 的答案对我有所帮助,但是主 Gradle 给出了一个错误提示,说我的 Config 类中缺少一个常量。这是因为我只在付费版和免费版中使用了该类,而没有在主版本中使用。找不到 Config 类。 我不确定这是否是 Studio 中的一个 bug……最终我用以下方法解决了这个问题:

buildTypes {

    release {
        ...
        buildConfig "public static final boolean XYZ = false;"
    }

}

而且,我使用了buildConfig.XYZ而不是我的Config.XYZ类常量。


仅返回翻译的文本:buildConfigField "boolean", "XYZ", "false" - NickUnuchek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接