【问题标题】:Gradle productflavors sourcesets and old project structureGradle productflavors 源集和旧项目结构
【发布时间】:2013-06-22 00:45:45
【问题描述】:

今天我开始将我们的项目转换为使用 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 目录仅包含具有用于指向不同环境的常量的类。我将对资产做同样的事情(开发环境的不同图标)

【问题讨论】:

标签: android gradle


【解决方案1】:

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

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

我们无法真正知道已经创建的 sourceSet 是否意味着相同的东西,所以我们失败了,而不是潜在地将 sourceSet 用于那种风格,而您打算将它用于其他东西。

【讨论】:

    【解决方案2】:

    谢谢,这对我有用。

    在我的旧式项目中,我需要亚马逊和三星构建的两个 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 中拥有所需的布尔标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多