2014-02-06 3 views
33

Vor ein paar Wochen habe ich eine Frage gestellt How to override resources depending on buildType. Und gerade gestern gab es eine gradle plugin release for android. Basierend auf this post on G+ habe ich mich entschieden, diese Frage zu schreiben.resValue gradle error: Nicht unterstützter Typ "String" in "generated.xml"

Das Problem, das ich im Detail beschrieben haben:

Ich möchte je nach buildType einige Ressourcenwerte schaffen, aber diese nicht richtig funktioniert: Die Datei „generated.xml“ nur erstellt werden wenn ich einen kompletten Build über die Befehlszeile:

gradlew build 

Aber ich auch durch den Bau der kompletten Projekt über comannd Linie einen Fehler:

* 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 

Jede andere Build-Testversion erstellt diese Datei nicht. Ich habe versucht, folgende:

  • über IDE:
    • Wiederaufbau Projekt
    • externe Aufgabe "assembleBuildVariant" execute
  • über Kommandozeile:
    • gradlew assembleBuildVariant

Seltsam gradle Konsolenausgabe:

:app:generateBuildVariantResValues UP-TO-DATE 

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

Mein "generated.xml":

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

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

Meine Frage:

Ist das ein Bug oder habe ich etwas verpasst? Und warum wird diese Datei nicht von einem Rebuild über die IDE erstellt?

Mein Build.gradle (UPDATE 2014.02.10 basierend auf rciovatis Antwort):

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

UPDATE 2014.02.14 ES FUNKTIONIERT:

Nach an update of the gradle android plugin alles funktioniert:

In/build/res/all/Sie sollten sehen, folgende Ordner:

  • alle
  • erzeugt (-> hier gibt es die generierten Ressourcenwerte von resValue finden)

Der erste Ordner all enthält alle zusammen Ressourcen. In Richtung all/<buildVariant>/values/values.xml sollten Sie die generierten Ressourcen, in meinem Fall finden:

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

Um die Werte im Code zu erhalten nur die generierte Ressource wie alle anderen verwenden:

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

Warum benötigen Sie ** buildConfigField **? Wo rufst du es in deinem Code an? –

Antwort

57

ich die Ressourcen gelöst auch das Hinzufügen im defaultConfig Block. Für Sie wäre es so etwas wie:

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

Bitte beachten Sie, dass:

  • Elementtyp string sein muss und nicht String
  • Elementname darf keine Leerzeichen enthalten (wie normale Ressourcenname)

EDIT: Seit 0.8.3 sollte es funktioniert, nur die resValue im Build-Typ-Block zu deklarieren.

+0

Danke für Ihre Antwort. Es macht wirklich Sinn, dass der Name des Elements keine Leerzeichen enthalten sollte :). Ich habe deine Antwort versucht (siehe mein Update), aber ich habe immer noch keinen Zugriff auf den neuen Ressourcenwert aus dem Code (-> 'getResources(). GetString (R.string.RES_FOO)'). Auch die Datei "generate.xml" wird nicht durch einen Build über die IDE erstellt. In der Konsolenkonsole kann ich die Aufgabe für 'resValue' sehen, aber es ist immer UP-TO-DATE (: app: generate ResValues ​​UP-TO-DATE). Haben Sie Zugriff auf die generierten Res-Werte aus dem Code? – owe

+2

Mit der neuesten Version des Gradle-Plugin (-> 0.8.3) funktioniert es gut. – owe

+0

Ab heute ist eine andere Lösung, src/debug/res/values ​​/ strings.xml zu erstellen und die Zeichenfolge RES_FOO dort einzufügen. In diesem Fall nehme ich an, dass RES_FOO in Ihrer Standard-strings.xml für Release-Builds verwendet wird, aber wenn das nicht der Fall ist, können Sie auch eine src/release/res/values ​​/ strings.xml erstellen. – riper

Verwandte Themen