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

Kev*_*ede 24 android android-gradle-plugin

resValue方法(或其任何名称)允许您在或中设置资源值. 是否有相应的方法来获取设置的资源值buildTypesproductFlavorsresValue

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

编辑:我尝试使用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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

基本上,我需要一个resValueSuffix类似的applicationIdSuffix.显然没有这样的动物存在.com.android.application插件是否暴露了我可以用来实现的任何东西?

cyr*_*xis 33

如果您只是尝试设置应用程序标签(或其他清单值),则可以使用清单占位符来解决此问题.

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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

 <application
        android:label="${appName}${appNameSuffix}"
        ...
 </application>
Run Code Online (Sandbox Code Playgroud)

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

  • 我仍然很好奇OPs问题如何在gradle中获得资源价值... (9认同)
  • 由于我的一个libs,即Localytics,也使用了manifestPlaceholders,因此在使用这个非常好的方法时遇到了一些可怕的冲突.我需要改变的只是设置我想要的占位符,即`manifestPlaceholders.appNameSuffix =".Debug"`而不是`manifestPlaceholders = [appNameSuffix:".Debug"]`. (3认同)

Iva*_*vic 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'

    }
}
Run Code Online (Sandbox Code Playgroud)

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

 if(!BuildConfig.LOG)
      // do something with the boolean value
Run Code Online (Sandbox Code Playgroud)

要么

view.setText(BuildConfig.yourkeyvalue);
Run Code Online (Sandbox Code Playgroud)