产品风味:发现重复的类
Posted
技术标签:
【中文标题】产品风味:发现重复的类【英文标题】:Product Flavor: Duplicate class found 【发布时间】:2016-09-23 04:12:00 【问题描述】:我有一个问题,但几个小时以来我一直坐在我的应用程序前,但我不明白问题出在哪里。
我有一个 android 应用程序(用 kotlin 编写),我想制作两种产品风格并覆盖产品风格中的类/文件:
所以我的 gradle 脚本是这样的:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android
...
productFlavors
foo
applicationId "com.foo"
我的文件结构如下:
- src
- androidTest
- foo
- java
- com
- example
- Bar.kt
- main
- java
- com
- example
- Bar.kt
- test
所以基本上我想在foo
产品风味中覆盖Bar.kt
文件,但不知何故它不起作用:它说类 Bar 是重复的。
有什么提示吗?
【问题讨论】:
不应该只在您定义的风味中存在特定风味的来源(即不在主中)?因此,您至少要定义两种风格,并且这些风格的源集中只有 Bar.kt。 嗯,也许你是对的......实际上我正在尝试覆盖一个匕首模块......所以Bar.kt
实际上是一个匕首2模块
Android gradle buildTypes: Duplicate class的可能重复
你可以看看我的回答:***.com/questions/28563632/…
【参考方案1】:
如果您有多种口味,例如 A、B 和 C
您的主代码包含所有活动,对于 A 和 C 风格,您希望更改某些活动的某些功能,例如 ShoppingCartActivity
然后您需要进行如下更改,将 ShoppingCartActivity 放入所有三种风格(包括 B 也是)并从 main 中删除并将文件声明到除 main manifest 之外的所有清单文件中 p>
更多详情请查看Build with source sets
- A
- java
- com
- example
- ShoppingCartActivity.kt(some changes)
- B
- java
- com
- example
- ShoppingCartActivity.kt
- C
- java
- com
- example
- ShoppingCartActivity.kt(new changes added)
- main
- java
- com
- example
**(remove from here)**
【讨论】:
有什么方法可以在 main 上使用 ShoppingCartActivity 的基础,以防万一我在其他风味中还有另一个,所以我改用风味?【参考方案2】:正如 miensol 所说,您不能将文件放到 main
和风味特定文件夹中,并期望 gradle 以与 android 资源系统相同的方式工作。但我找到了一种无需重复代码即可做到这一点的方法,因此您不必将 Bar.kt
复制到您拥有的每个风味文件夹中。
假设您有 dev、prod 和 mock 三种风格。您希望在 mock 中特别模拟 Bar.kt
,但在 dev 和 prod 风格中正常实现。您将模拟文件放入 mock 风味特定文件夹 mock/java/com/something/
并将“默认”实现放入具有随机名称的新文件夹,例如 non-mock/java/com/something/
将其命名为“common”之类的名称也会使感觉。现在你必须告诉 gradle 这些风味应该在哪里寻找它们的 Bar.kt
类。
把这个放到你的build.gradle
:
android
...
sourceSets
prod
java.srcDirs('src/non-mock/java')
dev
java.srcDirs('src/non-mock/java')
【讨论】:
完美运行,使用 AS 3.4.2。谢谢!【参考方案3】:The documentation for variants 状态(强调我的):
注意:对于给定的构建变体,Gradle 会抛出构建错误,如果它 遇到两个或多个定义了 相同的 Java 类。例如,在构建调试 APK 时,您不能 定义 src/debug/Utility.java 和 src/main/Utility.java。这是 因为 Gradle 在构建期间会查看这两个目录 处理并引发“重复类”错误。如果你想要不同 不同构建类型的 Utility.java 版本,您可以拥有每个 构建类型定义它自己的文件版本并且不包含它 主/源集。
因此解决方案是为每个变体拥有自己的Bar.kt
版本,并将其从主要源集中排除。
【讨论】:
如果我说 4-5 种风格,其中 3 种使用相同的类并且集合使用特定代码,我需要在任何地方复制它还是 sourceSets 可以做到?无法处理源集 @AkhilDad 我想你可以创建一个单独的模块来跨风格共享代码。 或者为此添加另一个风味维度。以上是关于产品风味:发现重复的类的主要内容,如果未能解决你的问题,请参考以下文章