配置 Android 构建变体的错误重新声明类

Posted

技术标签:

【中文标题】配置 Android 构建变体的错误重新声明类【英文标题】:Error Redeclaration class configuring Android build variants 【发布时间】: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 命令仍然有效。 【参考方案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 指定的那样,您必须从主包中删除该类。

【讨论】:

以上是关于配置 Android 构建变体的错误重新声明类的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Android Studio 中切换到调试构建变体

Android Studio下项目构建的Gradle配置及打包应用变体

Android Gradle 插件ProductFlavor 配置 ( AppExtension#variantFilter 过滤变体属性 )

Android Studio Instrumentation 测试构建变体

Android配置变体

Android配置变体