Android Gradle - 在特定的productFlavor上添加packageNameSuffix

时间:2013-12-06 11:27:54

标签: android gradle android-gradle

我有一个Gradle Android项目,其中包含此产品的Groups and Flavors配置:

/*
 * Define different flavor groups
 */
flavorGroups 'market', 'version'

/*
 * Defile product flavors
 */
productFlavors {

    amazon {
        flavorGroup 'market'
    }

    google {
        flavorGroup 'market'
    }

    flav1 {
        flavorGroup 'version'
        packageName 'com.company.flav1'
    }

    flav2 {
        flavorGroup 'version'
        packageName 'com.company.flav2'
    }

    flav3 {
        flavorGroup 'version'
        packageName 'com.company.flav3'
    }
}

// .. Other stuff

效果很好。所有源和资源都正确合并。 但由于特定原因,我需要.amz产品风格的包后缀为amazon。我怎样才能做到这一点?

我试过这种方式:

amazon {
    flavorGroup 'market'
    packageNameSuffix '.amz'
}

但是gradle会抛出异常。

3 个答案:

答案 0 :(得分:11)

目前无法做到这一点。 packageNameSuffix严格来说是Build Type的属性。

我想提供一种方法来定制给定变体的ProductFlavor值(即所有风味维度和构建类型的给定组合),但目前不可能。

您可以使用扩展现有版本构建类型并添加后缀的“amzRelease”构建类型,而不是新版本的风格。

如果您当前的“亚马逊”风味更多(配置versionCode / Name / etc ...),它将无法正常工作。然后,您可以使用亚马逊风味和amzRelease构建类型。它会创建比你需要的更多的变种,但它会有效,直到我们有更好的。

答案 1 :(得分:1)

您可以使用我在此处撰写的解决方案的变体:https://stackoverflow.com/a/26585241/4177090

简而言之,您可以使用variantFilter找到组合变体,然后从那里更新appliciationId:

android.variantFilter { variant ->
    def flavorString = ""
    def flavors = variant.getFlavors()
    for (int i = 0; i < flavors.size(); i++) {
        flavorString += flavors[i].name;
    }
    if(flavorString.contains("amazon")) {
        variant.getDefaultConfig().applicationId variant.getDefaultConfig().applicationId + ".amz"
    }
}

答案 2 :(得分:0)

gradle 1.0.0 +的工作解决方案:

android.applicationVariants.all { variant ->
    def flavorName = variant.getVariantData().getVariantConfiguration().getFlavorName()
    def mergedFlavour = variant.getVariantData().getVariantConfiguration().getMergedFlavor();

    if (flavorName.toLowerCase().contains("amazon")) {
        mergedFlavour.setApplicationId(mergedFlavour.getApplicationId() + ".amz")
    }
}