如何在build.gradle中为不同的productFlavors定义android:标签

时间:2018-06-15 11:29:22

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

有没有办法在build.gradle中为不同的productFlavor指定不同的应用标签(名称)?例如:

productFlavors {
    stage {
        app name with "-stage" suffix
    }
    preprod {
        app name with "-preprod" suffix
    }
    prod {
        app name without any  suffix
    }
}

4 个答案:

答案 0 :(得分:3)

您可以按如下方式实现:

  1. 确保您已在AndroidManifest.xml中指定了android:label="@string/app_name"
  2. 然后从app_name
  3. 中删除strings.xml

    按如下方式更改build.gradle:

    productFlavors {
        stage {
            resValue "string", "app_name", "stage"
        }
    
        preprod {
            resValue "string", "app_name", "preprod"
        }
        prod {
            resValue "string", "app_name", "prod"
        }
    } 
    

答案 1 :(得分:2)

步骤1:在main来源集中定义一个字符串资源,用于android:label值。

步骤2:在main源集的清单中,将该字符串资源应用于android:label属性(例如android:label="@string/whatever")。

步骤3:对于您希望android:label具有不同值的任何构建类型,产品风格或构建变体,请在现有{{1}旁边创建一个源集(例如app/src/stage/ })并将您想要的值放在该源集的字符串资源中(例如,app/src/main/带有app/src/stage/res/values/strings.xml字符串资源。)

当您构建应用时,Android将使用针对您的字符串资源的特定于构建的源集,如果您没有覆盖它,则会回退到whatever

如果您肯定想在Gradle中定义它 - 例如,您将在构建时以编程方式生成标签值 - use resValue statements,而不是在XML中定义字符串资源。您仍然会在清单中使用该字符串资源,我建议您在main中使用默认值作为后备。

答案 2 :(得分:1)

您可以使用resValue "string", "app_name", "label (name) "创建。从app_name文件中删除string.xml

喜欢:

productFlavors {
    stage {
        resValue "string", "app_name", "Stage"
    }
    preprod {
        resValue "string", "app_name", "Preprod"
    }
    prod {
        resValue "string", "app_name", "Prod"
    }
}

答案 3 :(得分:0)

我的一位朋友提出了一个基于injecting build variables into the manifest的非常好的解决方案。它甚至允许使用本地化的应用标签。所以这就是:

1)在android:label中指定AndroidManifest.xml,如下所示:

android:label="${appLabel}"

2)在应用级build.gradle中指定默认值:

manifestPlaceholders = [appLabel:"@string/appName"]

3)覆盖所需产品口味的值:

productFlavors {
    stage {
        manifestPlaceholders = [appLabel:"@string/appNameStage"]
    }
    preprod {
        manifestPlaceholders = [appLabel:"@string/appNamePreprod"]
    }
    prod {
        // Just let it use a default value
    }
}

4)添加您要引用的字符串资源(appNameappNameStageappNamePreprod)。如果需要,可以将它们本地化。