如何在 build.gradle 中为不同的 productFlavors 定义 android:label
Posted
技术标签:
【中文标题】如何在 build.gradle 中为不同的 productFlavors 定义 android:label【英文标题】:How to define android:label for different productFlavors in build.gradle 【发布时间】:2018-11-25 05:57:09 【问题描述】:有没有办法在 build.gradle 中为不同的 productFlavors 指定不同的应用标签(名称)?例如这样的:
productFlavors
stage
app name with "-stage" suffix
preprod
app name with "-preprod" suffix
prod
app name without any suffix
【问题讨论】:
【参考方案1】:可以如下实现:
-
确保您在 androidManifest.xml 中指定了
android:label="@string/app_name"
。
然后从strings.xml
中删除app_name
如下更改您的 build.gradle:
productFlavors
stage
resValue "string", "app_name", "stage"
preprod
resValue "string", "app_name", "preprod"
prod
resValue "string", "app_name", "prod"
【讨论】:
【参考方案2】:第 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.xml
和 whatever
字符串资源)。
当您构建应用时,Android 将使用您的字符串资源的构建特定源集,在您未覆盖它的情况下回退到 main
。
如果您确实想在 Gradle 中定义它 - 例如,您在构建时以编程方式生成标签值 - use resValue
statements 而不是在 XML 中定义字符串资源。您仍然会在清单中使用该字符串资源,我建议您仍然在 app/src/main/res/values/strings.xml
中使用默认值作为后备。
【讨论】:
【参考方案3】:您可以使用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"
【讨论】:
【参考方案4】:我的一个朋友基于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) 添加您所指的字符串资源(appName
、appNameStage
、appNamePreprod
)。如果需要,将它们本地化。
【讨论】:
以上是关于如何在 build.gradle 中为不同的 productFlavors 定义 android:label的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 build.gradle 中为字符串执行 REGEX?
在 build.gradle 中为 Selenium 测试程序定义 WebDriver 路径,而不是以编程方式设置系统属性
如何调试 Gradle build.gradle 文件(在调试器中,带有断点)?