【问题标题】:How to define android:label for different productFlavors in build.gradle如何在 build.gradle 中为不同的 productFlavors 定义 android:label
【发布时间】: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
    }
}

【问题讨论】:

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


    【解决方案1】:

    可以如下实现:

    1. 确保您在 AndroidManifest.xml 中指定了android:label="@string/app_name"
    2. 然后从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.xmlwhatever 字符串资源)。

      当您构建应用时,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) 添加您所指的字符串资源(appNameappNameStageappNamePreprod)。如果需要,将它们本地化。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-02
            • 2018-06-16
            • 1970-01-01
            相关资源
            最近更新 更多