Il y a quelques semaines, j'ai posté une question Comment remplacer les ressources en fonction de buildType . Et hier encore, il y a eu version du plugin Gradle pour Android . Basé sur ce post sur G + J'ai décidé d'écrire cette question.
Le problème que j'ai décrit en détail:
Je veux créer des valeurs de ressource en fonction de buildType
, mais cela ne fonctionne pas correctement: le fichier "generate.xml" ne sera créé que si je fais une construction complète sur la ligne de commande:
gradlew build
Mais j'obtiens également une erreur en construisant le projet complet sur la ligne 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
Aucun autre essai de génération ne crée ce fichier. J'ai essayé de suivre:
Étrange sortie console Gradle:
:app:generateBuildVariantResValues UP-TO-DATE
Mon 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"
}
}
Mon "généré.xml":
<!-- Automatically generated file. DO NOT MODIFY -->
<!-- Values from build type: release -->
<item name="RES FOO" type="String">RES FOO RELEASE</item>
Ma question:
Est-ce un bug ou ai-je raté quelque chose? Et pourquoi ce fichier n'est pas créé par un Rebuild
sur l'IDE?
Mon build.gradle (MISE À JOUR 2014-02-10 basée sur la réponse de 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"
}
}
MISE À JOUR 2014-02-14 IL FONCTIONNE:
Après ne mise à jour du gradle Android tout fonctionne bien:
Dans/build/res/all/vous devriez voir les dossiers suivants:
resValue
)Le premier dossier all
contient toutes les ressources fusionnées. Dans la direction all/<buildVariant>/values/values.xml
vous devriez trouver les ressources générées, dans mon cas:
// for buildType DEBUG
<item name="TESTFOO" type="string">TEST FOO DEBUG</item>
// for buildType RELEASE
<item name="TESTFOO" type="string">TEST FOO RELEASE</item>
Pour obtenir les valeurs dans le code, utilisez simplement la ressource générée comme toutes les autres:
getResources().getString(R.string.TESTFOO)
J'ai résolu d'ajouter les ressources également dans le bloc defaultConfig
. Pour vous, ce serait quelque chose comme:
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"
}
}
}
Veuillez noter que:
string
et non String
EDIT: depuis la version 0.8.3, cela devrait fonctionner correctement en déclarant simplement la resValue dans le bloc de type de construction.