【问题标题】:How to get a resource value in build.gradle?如何在 build.gradle 中获取资源值?
【发布时间】:2016-05-26 20:56:52
【问题描述】:

resValue 方法(或其他任何名称)允许您设置buildTypesproductFlavors 中的资源值。 有没有相应的方法获取resValue设置的资源值?

似乎productFlavorsbuildTypes 之前被评估,因此buildTypes 中设置的resValue 优先。我想在调试版本中将“Debug”附加到应用程序名称,但我需要获取在产品风味中设置的值才能附加到它。

编辑:我尝试了 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"

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

【问题讨论】:

  • @TimCastelijns Q&A 是关于来自strings.xml 的资源。我的资源是使用resValue 创建的。
  • app_name 是否在您的应用中除了清单之外的任何地方使用?
  • 有一种方法可以使用清单占位符,请参阅下面的答案。

标签: android android-gradle-plugin


【解决方案1】:

如果您只是尝试设置应用标签(或其他清单值),您可以使用 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 的反馈更新了占位符值的设置方式

【讨论】:

  • 太棒了!谢谢。
  • 我仍然很好奇如何回答关于在 gradle 中获取资源价值的 OPs 问题...
  • 不知道有没有可能,如果有的话我一直没搞清楚。
  • 也许此链接可以帮助您使用 gradle 从资源文件中读取:veltema.jp/2014/08/27/…
  • 我在使用这个原本很棒的方法时遇到了一些可怕的冲突,因为我的一个库,即 Localytics,也使用了 manifestPlaceholders。我需要更改的只是设置我想要的占位符,即manifestPlaceholders.appNameSuffix = ".Debug" 而不是manifestPlaceholders = [ appNameSuffix:".Debug"]
【解决方案2】:

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

在 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);

【讨论】:

  • 有问题的资源是应用名称,所以它必须是资源。
【解决方案3】:

要在调试版本中使用资源的替代版本,您可以使用调试源集。

strings.xml 可以在以下路径src/main/res/values 下找到,这意味着它在主源集中。如果您创建一个新目录src/debug/res/values,您可以在其中放置一个新的strings.xml 文件,其中包含在调试版本中应该被覆盖的值。例如:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">My Application Debug</string>
</resources>

这将替换主文件中app_name 的任何值。您不必复制此处的所有字符串 - 此处未包含的字符串只是从主文件中获取。

【讨论】:

  • 资源不在strings.xml。我使用 resValue 创建它,因为我预计构建变体 * 产品风味的数量会增长,并且我想避免为每个组合创建 strings.xml 的需要。
  • 如果您使用resValue 创建原始值,那么您不必从资源中读取它。您的 build.gradle 脚本中已经有了该值。只需将其分配给局部变量并使用它为每个变体创建资源。
  • 我尝试将变量放在android 范围内。所有产品风味都在任何构建类型之前运行,因此每个构建类型都会看到在最后一个产品风味中分配的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 2017-02-15
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
相关资源
最近更新 更多