【问题标题】:Android flavors, Gradle sourceSets mergingAndroid 风格、Gradle 源集合并
【发布时间】:2015-06-06 02:08:08
【问题描述】:

我尝试为多个合作伙伴制作应用程序,并为每个合作伙伴制作一个测试和产品版本。对于每种口味,我都会创建一个包含 res/values 的特定文件夹,如文档所述。

我的 gradle 文件如下所示:

apply plugin: 'com.android.application'

android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
    compileSdkVersion 14
    buildToolsVersion "21.1.2"

    defaultConfig {
            versionCode 1
            versionName 1
            minSdkVersion 14
            targetSdkVersion 19
        }

    productFlavors {
        prodPARTNER1 {
            applicationId "com.PARTNER1"
        }

        testPARTNER1 {
            applicationId "com.PARTNER1.test"
        }
        prodPARTNER2{
            applicationId "com.PARTNER2"
        }

        testPARTNER2{
            applicationId "com.PARTNER2.test"
        }
    }
    sourceSets {
        testPARTNER2 {
            res.srcDirs = ["testPARTNER2/res", "prodPARTNER2/res"]
        }
    }

}

dependencies {
    compile project(':ViewPagerIndicatorLibrary')
    compile 'com.android.support:support-v4:19.0.0'
    compile 'com.google.android.gms:play-services:+'
    compile files('libs/achartengine-1.1.0.jar')
    compile files('libs/android-async-http-1.4.4.jar')
    compile files('libs/jackson-annotations-2.2.3.jar')
    compile files('libs/jackson-core-2.2.3.jar')
    compile files('libs/jackson-databind-2.2.3.jar')
    compile files('libs/urlimageviewhelper-1.0.4.jar')
}

我希望测试版本获取 prod 版本的 res 文件夹(这样我不会为两个版本复制资源)并将其与测试版本合并。 问题是:

Error:Error: Duplicate resources: C:\...prodPARTNER2\res\values\strings.xml:string/app_name,C:\...testPARTNER2\res\values\strings.xml:string/app_name

有什么想法吗?同一种口味不能合并太 res 文件夹吗?

编辑:我也使用 gradle v 1.1.0 和 android studio v 1.1.0

【问题讨论】:

    标签: android gradle android-gradle-plugin build.gradle android-productflavors


    【解决方案1】:

    警告:这种方法在Android Plugin for Gradle 3.0.0上有所改变

    为每个合作伙伴应用使用productFlavors,并为测试构建定义构建类型test

    productFlavors {
        partner1 {
            applicationId "com.partner1"
        }
    
        partnerN {
            applicationId "com.partnerN"
        }
    }
    
    buildTypes {
        debug {
          // use defaults
        }
        release {
          // the 'prod' version, use defaults
        }
        test {
          // config as you want!
            applicationIdSuffix ".test"
            versionNameSuffix " Test"
            debuggable true
            minifyEnabled false
            signingConfig signingConfigs.debug
        }
    }
    

    您可以像Android Plug-in for Gradle 显示的那样使用混合和匹配源文件夹:

    为了构建您应用的每个版本,构建系统结合了以下来源的源代码和资源:

    • src/main/ - 主源目录(所有变体通用的默认配置)
    • src/<buildType>/ - 源码目录
    • src/<productFlavor>/ - 源码目录

    编辑:此用户指南是另一个帮助来源:http://tools.android.com/tech-docs/new-build-system/user-guide

    编辑2:根据上面的链接:

    还会为每个变体创建额外的源集:

    • android.sourceSets.flavor1Debug 位置src/flavor1Debug/
    • android.sourceSets.flavor1Release 位置src/flavor1Release/
    • android.sourceSets.flavor2Debug 位置src/flavor2Debug/
    • android.sourceSets.flavor2Release 位置src/flavor2Release/

    然后,您可以使用/src/partner1Test/ 将资源细节定义为partner1 flavor AND Test build,即partner1Test build 变体。

    【讨论】:

    • 太好了,我不必为一个合作伙伴创造 2 种口味!但是我怎样才能为我的测试版本提供不同的资源(并与 prod 版本合并)?导致 src// 变为 src/test 并将用于所有合作伙伴,这不是合作伙伴特定的权利吗?
    • 例如,我想更改 string.xml 中的 app_name 为 prod 它是 MyPartner1App 并且为了测试它是 MyPartner1TestApp 我该怎么做?
    • @jaumard comment1, question2:是的,src/test 将在构建 test 构建类型时用于所有合作伙伴,它不是特定于合作伙伴的。
    • @jaumard comment2:只需在 src/partner1Test 文件夹中再次定义 string/app_name
    • @jaumard comment1,问题1:使用我在答案中显示的源集,它是自动完成的:例如:src/main 中的string/app_name=App 可以重新定义为 src/specific 中的string/app_name=AppSpecific /跨度>
    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多