ResValue gradle error: Неподдерживаемый тип "String" в "generated.xml"

Несколько недель назад я опубликовал вопрос Как переопределить ресурсы в зависимости от типа buildType. И только вчера появилась версия gradle для Android. На основе этот пост в G + Я решил написать этот вопрос.

Проблема, которую я подробно описал:

Я хочу создать некоторые значения ресурсов в зависимости от buildType, но это не работает должным образом: Файл "сгенерированный .xml" будет создан только в том случае, если я сделаю полную сборку по командной строке:

gradlew build

Но я также получаю сообщение об ошибке, создав полный проект по линии 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

Все остальные сборки не создают этот файл. Я пробовал следующее:

  • над IDE:
    • перестроить проект
    • выполнить внешнюю задачу "assembleBuildVariant"
  • над командной строкой:
    • gradlew assembleBuildVariant

Странный gradle вывод консоли:

:app:generateBuildVariantResValues UP-TO-DATE

My 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"
    }
}

Мой "сгенерированный .xml":

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

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

Мой вопрос:

Является ли это ошибкой или я что-то пропустил? И почему этот файл не создан Rebuild над IDE?

My build.gradle(UPDATE 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 ЭТО РАБОТАЕТ:

После обновление плагина 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>

Чтобы получить значения в коде, просто используйте сгенерированный ресурс, как и все остальные:

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

Ответ 1

Я решил добавить ресурсы также в блок 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
  • имя элемента не должно содержать пробелов (в качестве обычного имени ресурса)

EDIT: Начиная с 0.8.3, он должен отлично работать, просто объявляя resValue в блоке типа сборки.