web-dev-qa-db-fra.com

Impossible de trouver la méthode Android () pour les arguments lors de la compilation Android projet de gradle

J'ai un projet basé sur des gradins Android avec 4 sous-modules - deux bibliothèques et deux applications. J'essayais de simplifier les fichiers build.gradle de chaque sous-module en déplaçant une partie du code/des configurations partagées. dans le fichier build.gradle de niveau supérieur et utilisez subprojects {} pour rendre ce code disponible pour chaque sous-module.

La structure du système de fichiers ressemble à ceci:

Root
 |- App1/
 |- App2/
 |- Lib1/
 |- Lib2/
 |- build.gradle
 |- settings.gradle

Le problème est que si j'ajoute une section Android {} Aux sous-projets, les tâches de gradation échouent. Voici, par exemple, mon fichier build.gradle de niveau supérieur:

subprojects { project ->
  Android {
    buildToolsVersion "20.0.0"
  }
}

Running gradle retourne ceci:

Qu'est-ce qui a mal tourné: Un problème est survenu lors de l'évaluation du projet racine 'Android'. Impossible de trouver la méthode Android () pour les arguments [build_7dngpra6ldok366maq0on77r7e $ _run_closure3_closure5 @ 43d95624] sur le projet racine 'Android'.

J'ai cherché des publications similaires et certaines personnes suggèrent d'ajouter la ligne apply plugin: 'Android' À chaque sous-projet afin d'exposer la méthode manquante Android() dont se plaint Gradle. Cependant, cette solution ne fonctionne pas pour moi car elle ajouterait effectivement cette ligne au projet de bibliothèque, qui requiert plutôt apply plugin: 'Android-library'.

Est-il possible d'utiliser Android {} À l'intérieur de subprojects {} Lorsque vous avez des applications et des bibliothèques dans le même projet?

29
Mike Laren

Il s’agit en fait d’une limitation de la structure du plug-in Android-gradle et d’une solution de contournement décrite à l’emplacement the Android website website) .

Si vous avez beaucoup de Android modules, vous voudrez peut-être éviter de définir manuellement les mêmes valeurs pour chacun d'entre eux. Parce que vous avez probablement un mélange de Android et le projet de bibliothèque Android, vous ne pouvez pas appliquer ces plugins à travers une fermeture de sous-projets.

La solution proposée est:

... dans le build.gradle du projet racine:

ext {
  compileSdkVersion = 19
  buildToolsVersion = "19.0.1"
}

dans tous les Android modules:

Android {
  compileSdkVersion rootProject.ext.compileSdkVersion
  buildToolsVersion rootProject.ext.buildToolsVersion
}

...

Je pense avoir remarqué que cela ne fonctionnait pas avec les anciennes versions de Gradle (j’essayais avec 1.10 et j’ai eu une erreur). Avec Gradle 2.1, cela semble cependant fonctionner correctement.

31
user4118620

Il y a un problème mineur avec la réponse de user4118620 ... du moins sur Gradle 2.10 quand je l'ai utilisé. Pour que la clé soit visible par les modules Android. Nous devons placer l'extension dans la portée du sous-projet

À la racine, vous devez ajouter les éléments suivants:

subprojects {
  ext{
     <Android_compile_sdk_key> = <sdk_value>
     <Android_build_key> = <build_value>
  }
}

À chacun des sous-modules, vous suivez simplement ce qu'il a mentionné précédemment

Android {
  compileSdkVersion <Android_compile_sdk_key>
  buildToolsVersion <Android_build_key>
}

Vous pouvez trouver la documentation sur le multi-génération Gradle sur le lien suivant

https://docs.gradle.org/current/userguide/multi_project_builds.html#sub:adding_specific_behavior

2
Sonny