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

cur*_*hov 5 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'])
}
Run Code Online (Sandbox Code Playgroud)

文件结构: 文件结构

Flavor log包含单类Messenger with method showMessage(Context context, CharSequence text)并使用打印文本Log.i(tag, msg)

Flavor toast包含带有方法的单类Messenger,showMessage(Context context, CharSequence text)并显示带有一些文本的toast.

主要来源不包含此类.

为什么会duplicate class:com.test.flavortest.Messenger出现错误?每种口味都有一套不同的非交叉源路径?

完整的示例项目,压缩

ant*_*nyt 3

在您的源集定义中,您似乎将log源添加到main

sourceSets {

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

    toast {
        java.srcDirs = ['src/main/java', 'src/toast/java']
    }
}
Run Code Online (Sandbox Code Playgroud)

main是所有风格中包含的默认源集。Messenger这会导致在构建风味时加载重复的类 ( ) toast

尝试仅指定log和源集:toast

sourceSets {

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

    toast {
        java.srcDirs = ['src/main/java', 'src/toast/java']
    }
}
Run Code Online (Sandbox Code Playgroud)

您的文件结构似乎与默认值匹配,因此更好的解决方案是完全删除源集块src/main/java默认包含,然后src/flavor/java自动添加。