我创建了一个简单的测试项目:目标是通过按下屏幕上的按钮来显示消息'hello'。第一个flavor构建应该将消息写入系统日志。第二个风味构建应该显示带有消息的祝酒词。如何使用gradle来实现这一目标?
我的build.gradle:
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion "19.0.1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
productFlavors {
toast {
}
log {
}
}
sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/log/java']
}
toast {
java.srcDirs = ['src/main/java', 'src/toast/java']
}
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}
文件结构:
Flavor log
包含方法showMessage(Context context, CharSequence text)
的单一类Messenger,并使用Log.i(tag, msg)
打印文本
Flavor toast
包含方法showMessage(Context context, CharSequence text)
的单一类Messenger,并显示带有一些文字的吐司。
主要来源不包含此类。
为什么出现错误duplicate class:com.test.flavortest.Messenger
?每种口味都有一套不同的非交叉源路径?
答案 0 :(得分:3)
在您的源集定义中,您似乎将log
来源添加到main
:
sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/log/java']
}
toast {
java.srcDirs = ['src/main/java', 'src/toast/java']
}
}
main
是所有版本中包含的默认源集。这会导致在构建Messenger
风格时加载重复的类(toast
)。
尝试仅指定log
和toast
源集:
sourceSets {
log {
java.srcDirs = ['src/main/java', 'src/log/java']
}
toast {
java.srcDirs = ['src/main/java', 'src/toast/java']
}
}
您的文件结构似乎与默认值匹配,因此更好的解决方案是完全删除源集块。 1}}默认包含在内,然后会自动添加src/main/java
。
答案 1 :(得分:0)
使用assembleToast / assembleLog构建特定的Flavor。 对于installToast也是如此
全局汇编将使用目录中的每个文件。
答案 2 :(得分:0)
将java /目录中的所有源代码编译在一起以生成单个输出。
注意:对于给定的构建变体,如果Gradle遇到两个或多个已定义相同Java类的源集目录,则会抛出构建错误。例如,在构建调试APK时,您无法同时定义src / debug / Utility.java和src / main / Utility.java。这是因为Gradle在构建过程中查看这两个目录并抛出一个重复的类'错误。如果您需要针对不同构建类型的不同版本的Utility.java,您可以让每个构建类型定义其自己的文件版本,而不是将其包含在主/源集中。