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

owe*_*owe 36 android android-studio build.gradle android-gradle-plugin

几个星期前,我发布了一个问题如何根据buildType覆盖资源.就在昨天,有一个用于androidgradle插件版本.根据这篇关于G +的帖子,我决定写下这个问题.

我详细描述的问题:

我想根据它创建一些资源值buildType,但这不能正常工作:只有在命令行上完成构建时才会创建文件"generated.xml":

gradlew build
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 在IDE上:
    • 重建项目
    • 执行外部任务"assembleBuildVariant"
  • 超过命令行:
    • gradlew assembleBuildVariant

奇怪的gradle控制台输出:

:app:generateBuildVariantResValues UP-TO-DATE
Run Code Online (Sandbox Code Playgroud)

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

我的"generated.xml":

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

<!-- Values from build type: release -->
<item name="RES FOO" type="String">RES FOO RELEASE</item>
Run Code Online (Sandbox Code Playgroud)

我的问题:

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

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

更新2014-02-14 IT工作:

之后的gradle这个Android插件的更新一切正常:

在/ 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>
Run Code Online (Sandbox Code Playgroud)

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

getResources().getString(R.string.TESTFOO)
Run Code Online (Sandbox Code Playgroud)

rci*_*ati 63

我解决了在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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意:

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

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

  • 使用最新版本的gradle插件( - > 0.8.3),它可以正常工作. (2认同)
  • 注意:在将长数字添加为字符串资源时使用引号,或者无论如何它都将被视为整数.https://code.google.com/p/android/issues/detail?id=78839 (2认同)
  • 我们如何在gradle文件中为特定的flavor或build类型定义字符串数组? (2认同)