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

时间:2016-05-26 20:56:53

标签: android android-gradle

resValue方法(或其所谓的方法)允许您在buildTypesproductFlavors设置资源值。 是否有相应的方式获取resValue设置的资源值?

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

编辑:我尝试使用MarcinKoziń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始终具有 last 产品风格的值。因此,在此示例中,所有构建都会收到名称"Bar""Bar Debug"

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

3 个答案:

答案 0 :(得分:29)

如果您只是尝试设置应用标签(或其他清单值),可以使用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个变体,并在应用程序抽屉/启动器中为它们指定不同的名称。

答案 1 :(得分:6)

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

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

答案 2 :(得分: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的任何值。您不必复制此处的所有字符串 - 您在此处不包含的字符串只是从主文件中删除。