【问题标题】:Error Redeclaration class configuring Android build variants配置 Android 构建变体的错误重新声明类
【发布时间】:2019-12-06 14:22:47
【问题描述】:

在我的 Android 项目中,我配置了一个包含 3 个变体的维度(例如:mock、dev、prod)。 我也有默认的构建类型(调试、发布),我有他们的应用程序实现:

  • src/debug/java/package/MyApplication.kt
  • src/release/java/package/MyApplication.kt

所以我可以生成 6 个构建(mockDebug、mockRelease、devDebug、devRelease 等)

现在我的 mockDebug 变体需要 MyApplication.kt 的特定实现。

当我读到here 我可以在此路径中创建一个 MyApplication 类:src/mockDebug/java/package/MyApplication.kt

但是,我在 Android Studio 中收到一条错误消息,提示“Redeclaration: MyApplication”。

我确信我可以解决这个问题,将所有调试/发布 MyApplication.kt 实现移动到

  • 模拟调试
  • 模拟发布
  • 开发调试
  • 开发发布
  • prodDebug
  • 产品发布

目录,但我不明白为什么文档说它是可能的,即使我收到该错误

谢谢你帮助我

【问题讨论】:

  • 我遇到了类似的问题。我需要为 BuildType(调试和发布)使用不同的类,而不是 productFlavor。但我在 IDE 上收到“重新声明”类错误。现在,我只是忽略它,因为 assemblebundle 命令仍然有效。

标签: android gradle build.gradle android-productflavors


【解决方案1】:

在我的情况下,删除 /build 文件夹解决了这个问题。

【讨论】:

    【解决方案2】:

    “重新声明:MyApplication” 您会看到上述错误存在于主要和您的风格或变体中

    方法应该是您想要更改的类或文件,不应在 main 中复制该文件并将它们添加到风味或变体中并进行您希望看到的更改。

    【讨论】:

      【解决方案3】:

      您可以尝试以这种方式实现您的 Gradle。 在 Build.gradle 中:

        buildTypes {
          release {
              debuggable false
              minifyEnabled true
              zipAlignEnabled true
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
          }
          debug {
              debuggable true
              zipAlignEnabled false
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
          }
        }
      
        productFlavors {
          mock {
              minSdkVersion 17
              applicationId 'com.test.mock'
              targetSdkVersion 23
              testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
              versionCode 1
              versionName '1.0'
          }
          dev {
              minSdkVersion 17
              applicationId 'com.test.dev'
              targetSdkVersion 23
              testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
              versionCode 1
              versionName '1.0'
          }
          prod {
              minSdkVersion 17
              applicationId 'com.test.prod'
              targetSdkVersion 23
              testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
              versionCode 1
              versionName '1.0'
          }
      }
      

      所以,现在您可以拥有如下文件夹结构:

        /src/mock/Application.kt
        /src/dev/Application.kt
        /src/prod/Application.kt
      

      因此,一旦您构建了项目,请从 BuildVariant 选项卡中选择变体,以便使用相应的 Application.kt。

      希望这将有助于解决您的问题。

      【讨论】:

      • 嗨,“MyApplication.kt”包含基于构建类型(调试/发布)的不同逻辑,而不是基于变体(模拟/开发/生产),所以我不想重构/复制这个类为 mockDebug、devDebug 和 prodDebug 用于调试变体和 mockRelease、devRelease 和 prodRelease 用于发布变体。我只想维护调试/发布实现,但我只想为 mockDebug 组合覆盖它。 Android 文档说有可能,但它不起作用
      • 哦,好吧...那么您是否尝试过在 Gradle 中使用源集?此外,如果您使用源集,那么您的 /src/main/ -> 不应该有 Application.kt;文件夹应如下所示:- 1) /src/main/ 2) /src/debug/Application.kt 3) /src/release/Application.kt 这样您就可以构建 Gradle 而不会出现重复错误
      • 我在主目录中没有MyApplication.kt,只有在调试和发布中,它们是互斥的。但是当我在 mockDebug 目录中创建第三个文件时,我在 debug 和 mockDebug MyApplication 类中都收到“重新声明”错误,好像它们之间存在冲突
      【解决方案4】:

      正如documentation 指定的那样,您必须从主包中删除该类。

      【讨论】:

        猜你喜欢
        • 2013-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多