soc*_*qwe 34 android kotlin android-gradle-plugin android-productflavors
我有一个非常愚蠢的问题,但我几小时后就坐在我的应用程序前面,但我无法理解问题所在.
我有一个Android应用程序(用kotlin编写),我想制作两种产品风格并覆盖产品风格的类/文件:
所以我的gradle脚本是这样的:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
...
productFlavors {
foo {
applicationId "com.foo"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的文件结构如下:
- src
- androidTest
- foo
- java
- com
- example
- Bar.kt
- main
- java
- com
- example
- Bar.kt
- test
Run Code Online (Sandbox Code Playgroud)
所以基本上我想Bar.kt在foo产品风格中覆盖文件,但不知何故它不起作用:它说类Bar是重复的.
任何提示?
mie*_*sol 50
变体的文档说明(强调我的):
注意:对于给定的构建变体,如果Gradle遇到两个或多个定义了相同Java类的源集目录,则会抛出构建错误.例如,在构建调试APK时,您无法同时定义src/debug/Utility.java和src/main/Utility.java.这是因为Gradle在构建过程中查看这两个目录并抛出"重复类"错误.如果您希望不同版本的Utility.java用于不同的构建类型,则可以让每个构建类型定义其自己的文件版本,而不是将其包含在主/源集中.
因此,解决方案是拥有自己的Bar.kt每个变体版本,并将其从主要源集中排除.
Sem*_*cer 17
正如miensol所说,你不能把你的文件放到main特定的文件夹中,并且期望gradle以与android资源系统相同的方式工作.但我找到了一种方法来做到这一点,没有代码重复,所以你不必将你复制Bar.kt到你拥有的每个flavor文件夹.
所以,假设你有三种开发,生产和模拟.你希望你的特殊模拟Bar.kt在模拟,但在开发和prod风格的正常实现.你把你的模拟文件放到mock flavor特定的文件夹中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')
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有多种口味,例如A,B和C
并且您的主要代码包含所有活动,并且对于A和C风格,您想更改某些活动的某些功能,例如ShoppingCartActivity
那么您需要进行如下更改,将ShoppingCartActivity置于所有三种形式(包括B)中,然后从main中删除并将文件声明为main清单以外的所有清单文件
有关更多详细信息,请参见使用源集构建
- 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)**
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15773 次 |
| 最近记录: |