如何为android gradle项目设置风味?神秘的重复类错误

时间:2014-02-07 12:15:37

标签: android build gradle

我创建了一个简单的测试项目:目标是通过按下屏幕上的按钮来显示消息'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'])
}

文件结构: File structure

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?每种口味都有一套不同的非交叉源路径?

Full sample project, zipped

3 个答案:

答案 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)。

尝试仅指定logtoast源集:

sourceSets {

    log {
        java.srcDirs = ['src/main/java', 'src/log/java']
    }

    toast {
        java.srcDirs = ['src/main/java', 'src/toast/java']
    }
}

您的文件结构似乎与默认值匹配,因此更好的解决方案是完全删除源集块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,您可以让每个构建类型定义其自己的文件版本,而不是将其包含在主/源集中。