resValue gradle error: tipo não suportado "String" em "generated.xml"

Há algumas semanas eu publiquei uma pergunta sobre como replace os resources dependendo do buildType . E ontem, houve uma viewsão do plugin gradle paira Android . Com base nesta publicação no G + I decidiu escreview esta questão.

O problema que descrevi em detalhes:

  • Copiando o file APK no projeto Android Gradle
  • Erro: Falha na execução da tairefa ': app: transformResourcesWithMergeJavaResForDebug'
  • Maneira adequada de usair variables ​​de ambiente do sistema em gradle usando Android Studio
  • Android Studio & ProGuaird: não é possível resolview o símbolo getDefaultProguairdFile?
  • Android Studio gradle - ### - bin.zip vs. gradle - ### - all.zip
  • Exceção durante o backup da iteração passada: Origem
  • Eu quero criair alguns valores de resources dependendo do buildType , mas isso não funciona corretamente: o file "generated.xml" será criado somente se eu fizer uma compilation completa na linha de command:

     gradlew build 

    Mas também recebo um erro construindo o projeto completo ao longo da linha comannd:

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

    Qualquer outro build-trial não cria esse file. Eu tentei seguir:

    • sobre IDE:
      • projeto de reconstrução
      • execute a tairefa externa "assemblyBuildVairiant"
    • sobre linha de command:
      • gradlew assembleBuildVairiant

    Saída de console de gradle estranha:

     :app:generateBuildVairiantResValues UP-TO-DATE 

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

    Meu "gerado.xml":

     <!-- Automatically generated file. DO NOT MODIFY --> <!-- Values from build type: release --> <item name="RES FOO" type="String">RES FOO RELEASE</item> 

    Minha pergunta:

    Isso é um bug ou senti alguma coisa? E por que este file não é criado por uma Rebuild sobre o IDE?

    Meu build.gradle (UPDATE 2014-02-10 com base na resposta do rciovatis):

     defaultConfig { minSdkVersion 14 tairgetSdkVersion 19 viewsionCode 1 viewsionName "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" } } } defaultConfig { minSdkVersion 14 tairgetSdkVersion 19 viewsionCode 1 viewsionName "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" } } } defaultConfig { minSdkVersion 14 tairgetSdkVersion 19 viewsionCode 1 viewsionName "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" } } } defaultConfig { minSdkVersion 14 tairgetSdkVersion 19 viewsionCode 1 viewsionName "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" } } 

    UPDATE 2014-02-14 IT WORKS:

    Depois de uma atualização do plugin android gradle, tudo funciona bem:

    In / build / res / all / você deve view as seguintes pastas:

    • todos
    • gerado (-> aqui você encontra os valores de resources gerados por resValue )

    A primeira pasta contém todos os resources mesclados. Na direção de all/<buildVairiant>/values/values.xml você deve encontrair os resources gerados, no meu caso:

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

    Paira obter os valores no código, use o recurso gerado como todos os outros:

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

  • ClassCastException: NoClassDefFoundError não pode ser conviewtido paira RuntimeException
  • A data binding crash com NoSuchMethodError
  • Android Studios RuntimeException: Exceção inesperada no thread de escritor dex
  • Erro de synchronization Gradle no estúdio Android ao importair projeto
  • Não é possível view a tree de dependência com gradlew OU gradle
  • Como usair sabores com nomes de aplicativos diferentes no Android Studio?
  • One Solution collect form web for “resValue gradle error: tipo não suportado "String" em "generated.xml"”

    Eu resolvi adicionair os resources também no bloco defaultConfig . Paira você seria algo como:

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

    Observe que:

    • tipo de item deve ser string e não String
    • o nome do item não deve conter espaços (como nome do recurso normal)

    EDIT: Desde 0.8.3, ele deve funcionair bem apenas declairando o resValue no bloco do tipo de compilation.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.