4

今天我开始将我们的项目转换为使用 gradle 构建系统。我无法更改项目结构,而且我有不同的风格,所以我想知道如何覆盖“dev”和“prod”的源集,因为这显然不起作用:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.2'
    }
}

apply plugin: 'android'

android {
    compileSdkVersion 17
    buildToolsVersion "17"

    dependencies {
        compile project(':ABS')
        compile project(':google-play-services_lib')
        compile project(':MergeAdapter')
        compile fileTree(dir: 'libs', include: '*.jar')
    }

    signingConfigs {
        release {
            storeFile file("myapp.keystore")
                    storePassword "**********"
                    keyAlias "**********"
                    keyPassword "**********"
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aild.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        dev {
            java.srcDirs = ['src-dev']
        }

        prod {
            java.srcDirs = ['src-prod']
        }

        instrumentTest.setRoot('tests')
    }

    productFlavors {
        dev {
            packageName "com.myapp.dev"
        }

        prod {
            packageName "com.myapp"
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

这给了我以下错误:

Cannot add a AndroidSourceSet with name 'dev' as a AndroidSourceSet with that name already exists.

问题是,我不能使用新的项目结构并且坚持使用这个,所以我如何覆盖这里的源目录,以便它包括,对于 dev 版本,src-dev 和对于 prod 版本 src-prod (而不是 src/main/java 和 src/dev/java 或 src/prod/java)

谢谢!

编辑: src-prod 和 src-dev 目录仅包含具有用于指向不同环境的常量的类。我将对资产做同样的事情(开发环境的不同图标)

4

2 回答 2

10

您需要首先声明您的风味,然后自定义源集。

发生的情况是,当您自定义 sourceSets 时,它创建了 android.sourceSets.dev,但随后在创建 android.productFlavors.dev 时,它尝试创建匹配的 android.sourceSets.dev 并失败(因为它已经存在)。

我们不能真正知道已经创建的 sourceSet 是否意味着相同的东西,所以当你打算将它用于其他东西时,我们失败了,而不是可能将 sourceSet 用于那种风格。

于 2013-06-22T01:12:49.643 回答
4

谢谢,这对我有用。

在我的旧式项目中,我需要 Amazon 和 Samsung 构建的两个 res 变体。现在有三个 res 文件夹,其中包含一个带有一些布尔标志的 flavor.xml 文件。

res/values/flavors.xml
res-samsung/values/flavors.xml
res-amazon/values/flavors.xml

gradle 文件首先定义了风味:

productFlavors {
    amazon {
    }

    samsung {
    }
}

然后,在 sourceSet 闭包中,我不添加,而只是更改隐式生成的 flavor-sourceSets 的目录:

sourceSets {
main {
    manifest.srcFile 'AndroidManifest.xml'
    java.srcDirs = ['src']
    resources.srcDirs = ['src']
    aidl.srcDirs = ['src']
    renderscript.srcDirs = ['src']
    res.srcDirs = ['res']
    assets.srcDirs = ['assets']
}

samsung.res.srcDirs = ['res-samsung']
amazon.res.srcDirs = ['res-amazon']

instrumentTest.setRoot('tests')
}

Gradle 的 mergeXXXResources 任务然后支持 res-xxx 文件夹内容,因此我在适当的风味 APK 中具有所需的布尔标志。

于 2013-12-17T13:52:17.527 回答