配置 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 上收到“重新声明”类错误。现在,我只是忽略它,因为assemble
和 bundle
命令仍然有效。
【参考方案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下项目构建的Gradle配置及打包应用变体
Android Gradle 插件ProductFlavor 配置 ( AppExtension#variantFilter 过滤变体属性 )