不同源集中具有相同类名的重新声明错误

bli*_*han 1 android gradle

与风格变体类似,我期望能够为相同的类名提供源集变体。例如,

android测试目录

class RobotTest(val name: String = "androidTest")
Run Code Online (Sandbox Code Playgroud)

目录

class RobotTest(val name: String = "main")
Run Code Online (Sandbox Code Playgroud)

测试目录

class RobotTest(val name: String = "test")
Run Code Online (Sandbox Code Playgroud)

当我仅在两个源中具有相同的类名时,Android Studio 就可以了:

  • maintest
  • mainandroidTest

但是,一旦我将相同的类添加到所有三个类中,Android Studio 就会显示一条分析错误testandroidTest带有以下消息:

重新声明:RobotTest

我在单元测试、仪器测试和应用程序中运行了代码,一切都编译良好(没有构建错误),并且在记录时RobotTest().name,我正确地获得了每个类上下文的 3 个不同值。

有谁知道如何解决这个问题或者这是不允许的吗?

Nis*_*tix 6

当您创建了产品风味后,您不应将变体类放入main源集中。

保留所有变体文件的共同点main

例如,您定义了:

  flavorDimensions("api")
  productFlavors {
      create("real") {
          dimension = "api"
      }
      create("mock") {
          dimension = "api"
      }
  }
Run Code Online (Sandbox Code Playgroud)

从那时起,您就有了两个构建变体:real或者mock

所以,你的类必须有两个版本(如果应该不同的话):

/src/real/kotlin/com/example/SomeApi.kt
/src/main/kotlin/com/example/ (no file here)
/src/mock/kotlin/com/example/SomeApi.kt
Run Code Online (Sandbox Code Playgroud)

更新:

以上所有内容仅适用于来源!如果你创造 4 种口味,你必须将 Java/Kotlin 类复制到 4 个文件夹中,没有“默认”文件夹。

对于资源来说,逻辑是不同的。Gradle 首先从默认文件夹“main”中获取资源文件(某些 XML 文件),然后将其替换为风味文件夹中覆盖的文件(如果该文件存在于该文件夹中)。如果您创建 4 种风格,则可以在“main”中保留默认值,并且只能覆盖它一次。