如何为 build.gradle 中的不同 productFlavors 定义 android:label

How to define android:label for different productFlavors in build.gradle

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

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

第 1 步:在您的 main 源集中定义一个字符串资源以用于您的 android:label 值。

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

第 3 步:对于您想要 android:label 不同值的任何构建类型、产品风格或构建变体,创建一个源集(例如,app/src/stage/ 除了现有的 app/src/main/) 并将您想要的值放入该源集的字符串资源中(例如,app/src/stage/res/values/strings.xmlwhatever 字符串资源)。

当您构建您的应用程序时,Android 将为您的字符串资源使用构建特定的源集,在您没有覆盖它的情况下回退到 main

如果您确定要在 Gradle 中定义它 — 例如,您在构建时以编程方式生成标签值 — use resValue statements 而不是在 XML 中定义字符串资源.您仍然会在清单中使用该字符串资源,我建议仍然在 app/src/main/res/values/strings.xml 中使用默认值作为后备。

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

喜欢:

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

您可以通过以下方式实现:

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

按如下方式更改您的 build.gradle:

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

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

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

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

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)。如果需要,将它们本地化。