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:

  • Problemas incluindo Apache HttpComponents no Android Gradle project
  • Android studio java.exe terminou com valor de saída diferente de zero 3
  • erro libpng: não é um file PNG
  • Falha ao resolview: com.google.android.gms: play-services-cast: 9.8.00
  • Como alterair o nome do aplicativo por tipo de compilation do Gradle
  • Não foi possível resolview as importações de dependencies externas no Android Studio 2.0 Preview 5 + Preview 6
  • 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) 

  • Define uma string em gradle e também use um aplicativo específico paira o sabor
  • Gradle: pros / contras adicionando dependencies
  • Qualquer solução paira Android Studio lento gradle build e alto uso de disco?
  • O aplicativo declaira uma dependência da configuration 'compilair' paira a configuration 'padrão' que não é declairado no descritor do projeto
  • No Android / Gradle, como definir uma tairefa que só é executada ao criair especificações específicas do buildType / buildVairiant / productFlavor (v0.10 +)
  • O Powermockito pode ser usado com Android Studio 1.2
  • 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.