如何在 build.gradle 中获取资源值?

新手上路,请多包涵

resValue 方法(或它的任何名称)允许您在 buildTypesproductFlavors设置 资源值。 是否有相应的方法来 获取resValue 设置的资源值?

It appears that productFlavors is evaluated before buildTypes , so a resValue set in buildTypes takes precedence.我想在调试版本中将“调试”附加到应用程序名称,但我需要获取在产品风格中设置的值才能附加到它。

编辑: 我尝试了 Marcin Koziński 的使用变量的建议,但 所有 产品口味都在 任何 构建类型之前进行评估。因此,这不起作用:

 android {
    String appName = ""

    productFlavors {
        Foo {
            appName = "Foo"
        }

        Bar {
            appName = "Bar"
        }
    }

    buildTypes {
        release {
            resValue "string", "app_name", appName
        }

        debug {
            resValue "string", "app_name", appName + " Debug"
        }
    }
}

buildTypes 中, appName 始终具有 最后一个 产品风味的值。因此,在此示例中,所有构建都收到名称 "Bar""Bar Debug"

基本上,我需要一个 resValueSuffix 类似于 applicationIdSuffix 。显然不存在这样的动物。 com.android.application 插件是否公开了我可以用来实现此目的的任何内容?

原文由 Kevin Krumwiede 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 972
2 个回答

如果您只是想设置 App Label(或其他清单值),您可以使用 manifest placeholders 解决这个问题。

 android {

    productFlavors {
        Foo {
             applicationId "com.myexample.foo"
             manifestPlaceholders.appName = "Foo"
        }

        Bar {
             applicationId "com.myexample.bar"
             manifestPlaceholders.appName = "Bar"
        }
    }

    buildTypes {
        release {
            manifestPlaceholders.appNameSuffix =""
        }

        debug {
            manifestPlaceholders.appNameSuffix =".Debug"
            applicationIdSuffix ".debug"
        }
    }
}

然后在您的 Android Manifest 中,您只需使用两个占位符作为您的应用程序名称(或其他值)

  <application
        android:label="${appName}${appNameSuffix}"
        ...
 </application>

这允许您在单个设备上并排安装所有 4 个变体,并在应用程序抽屉/启动器中为它们指定不同的名称。

编辑 2019 年 11 月 22 日

根据@javaxian 的反馈更新了占位符值的设置方式

原文由 cyroxis 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以像这样检查构建变体

在 gradle 中定义值

buildTypes {
    debug{
        buildConfigField "String", "Your_string_key", '"yourkeyvalue"'
        buildConfigField "String", "SOCKET_URL", '"some text"'
        buildConfigField "Boolean", "LOG", 'true'
    }
    release {
        buildConfigField "String", "Your_string_key", '"release text"'
        buildConfigField "String", "SOCKET_URL", '"release text"'
        buildConfigField "Boolean", "LOG", 'false'

    }
}

并使用构建变体访问这些值:

  if(!BuildConfig.LOG)
      // do something with the boolean value

要么

view.setText(BuildConfig.yourkeyvalue);

原文由 Ivan Milisavljevic 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题