resValue gradle error:“generated.xml”中不支持的类型“String”

时间:2014-02-06 10:25:50

标签: android android-studio android-gradle build.gradle

几周前,我发布了一个问题How to override resources depending on buildType。 就在昨天,有一个gradle plugin release for android。 根据{{​​3}},我决定写下这个问题。

我已详细描述的问题:

我想根据buildType创建一些资源值,但这不能正常工作: 仅当我通过命令行进行完整构建时,才会创建文件“generated.xml”:

gradlew build

但是我通过在comannd line上构建完整的项目也会出错:

* What went wrong: Execution failed for task ':app:merge<buildVariant>Resources'.
Unsupported type 'String' in file C:\Users\...\build\res\generated\release\values\generated.xml

其他每个构建试用版都不会创建此文件。我试过以下:

  • over IDE:
    • 重建项目
    • 执行外部任务“assembleBuildVariant”
  • over命令行:
    • gradlew assembleBuildVariant

奇怪的gradle控制台输出:

:app:generateBuildVariantResValues UP-TO-DATE

我的build.gradle:

buildTypes {
    debug{
        buildConfigField "String", "FOO", "\"FOO DEBUG\""
        resValue "String", "RES FOO", "RES FOO DEBUG"
    }
    release {
        buildConfigField "String", "FOO", "\"FOO RELEASE\""
        resValue "String", "RES FOO", "RES FOO RELEASE"
    }
}

我的“generated.xml”:

<!-- Automatically generated file. DO NOT MODIFY -->

<!-- Values from build type: release -->
<item name="RES FOO" type="String">RES FOO RELEASE</item>

我的问题:

这是一个错误还是我错过了什么?为什么这个文件不是由Rebuild通过IDE创建的?

我的build.gradle(更新2014-02-10基于rciovatis回答):

defaultConfig {
    minSdkVersion 14
    targetSdkVersion 19
    versionCode 1
    versionName "1.0"
    resValue "string", "RES_FOO", "RES FOO"
}

buildTypes {
    debug{
        buildConfigField "String", "FOO", "\"FOO DEBUG\""
        resValue "string", "RES_FOO", "RES FOO DEBUG"
    }
    release {
        buildConfigField "String", "FOO", "\"FOO RELEASE\""
        resValue "string", "RES_FOO", "RES FOO RELEASE"
    }
}

更新2014-02-14 IT工作:

this post on G+之后一切正常:

在/ build / res / all /中,您应该看到以下文件夹:

  • 所有
  • 生成( - >此处,您可以通过resValue找到生成的资源值)

第一个文件夹all包含所有合并资源。在方向all/<buildVariant>/values/values.xml中,您应该找到生成的资源,在我的情况下:

// for buildType DEBUG
<item name="TESTFOO" type="string">TEST FOO DEBUG</item>
// for buildType RELEASE
<item name="TESTFOO" type="string">TEST FOO RELEASE</item>

要获取代码中的值,只需像所有其他资源一样使用生成的资源:

getResources().getString(R.string.TESTFOO)

1 个答案:

答案 0 :(得分:61)

我解决了在defaultConfig块中添加资源的问题。对你来说就像是:

android {
    defaultConfig {
        resValue "string", "RES_FOO", "RES FOO RELEASE"
    }

    buildTypes {
        debug{
            buildConfigField "String", "FOO", "\"FOO DEBUG\""
            resValue "string", "RES_FOO", "RES FOO DEBUG"
        }
        release {
            buildConfigField "String", "FOO", "\"FOO RELEASE\""
            resValue "string", "RES_FOO", "RES FOO RELEASE"
        }
    }
}

请注意:

  • 项目类型必须为string而不是String
  • 项目名称不得包含空格(作为普通资源名称)

编辑: 从0.8.3开始,它应该可以正常工作,只需在构建类型块中声明resValue。