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

34
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插件是否提供了任何可用于实现此目的的东西?

https://dev59.com/qmQm5IYBdhLWcg3w4CEN - Tim
@TimCastelijns 那个问答是关于从strings.xml中获取资源的。我的资源是使用resValue创建的。 - Kevin Krumwiede
你的应用程序中除了清单文件之外,是否还在其他地方使用了 app_name - cyroxis
有一种方法可以使用清单占位符来实现,详见下面的答案。 - cyroxis
3个回答

44

如果你只想设置App标签(或其他清单值),你可以使用 清单占位符 解决此问题。

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清单文件中,您只需使用应用程序名称(或其他值)的两个占位符。

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

这使您可以在单个设备上并排安装所有4个变体,并在应用抽屉/启动器中为它们提供不同的名称。

编辑 2019年11月22日

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


太棒了!谢谢。 - Kevin Krumwiede
13
我仍然很好奇如何回答OPs的问题,以了解如何在gradle中获得资源值... - IgorGanapolsky
我不知道是否可能,如果是的话,我从未能够弄清楚。 - cyroxis
也许这个链接可以帮助您使用Gradle从资源文件中读取:http://veltema.jp/2014/08/27/generating-strings.xml-from-JSON-at-Build-in-Android-Studio/ - Ultimo_m
3
由于我的其中一个库(Localytics)也使用了manifestPlaceholders,因此在使用这个本来很棒的方法时,我遇到了一些严重的冲突。我只需要更改设置我想要的占位符,即manifestPlaceholders.appNameSuffix = ".Debug",而不是manifestPlaceholders = [ appNameSuffix:".Debug"] - javaxian

8

您可以这样检查构建变体

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

1
所涉及的资源是应用程序名称,因此它必须是一种资源。 - Kevin Krumwiede
这不是由 OP 提出的问题。 - CaptainCrunch

1
有一个资源的备用版本可以在调试构建中使用,您可以使用调试源集。 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的任何值。您不必在此处复制所有字符串-您不包含在此处的字符串仅从主文件中获取。

1
资源不在strings.xml中。我使用resValue创建它,因为我预计构建变体*产品风味的数量将增加,并且我想避免为每个组合创建strings.xml的需要。 - Kevin Krumwiede
如果您使用resValue创建原始值,则无需从资源中读取它。您已经在build.gradle脚本中拥有该值。只需将其分配给本地变量,并使用它为每个变体创建资源即可。 - Marcin Koziński
我尝试把该变量放在“android”范围内。所有产品口味在任何构建类型之前运行,因此每个构建类型都可以看到分配给最后一个产品口味的值。 - Kevin Krumwiede

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接