web-dev-qa-db-fra.com

Android Gradle Implementation vs CompileOnly Performance

Les documents mentionnent que implementation fournit des améliorations significatives du temps de construction par rapport à compile/api. Qu'en est-il de compileOnly?

Mon cas d'utilisation est un projet multi-modules (désolé, je n'aime pas la terminologie multi-projets de Gradle), où j'ai une application Android, et plusieurs bibliothèques dont l'application dépend (implementation). Certaines bibliothèques dépendent également les unes des autres. Dois-je utiliser implementation ou compileOnly lors de la déclaration des dépendances dans les modules de bibliothèque? Mon module d'application utilisera implementation pour dépendre de ces artefacts, donc je n'ai pas besoin qu'ils soient transitifs à travers les modules de la bibliothèque.

25
Eliezer

La configuration api doit être utilisée pour les dépendances qui sont exportées vers des modules externes (dépendance transitive) . La configuration Vice-Versa implementation doit être utilisée pour les dépendances internes au composant (pas de dépendance transitive) .

implémentation vs compileOnly:

Il n'y a aucune similitude dans leur travail, compileOnly est

  • une configuration héritée du plugin Java
  • requis au moment de la compilation
  • non inclus dans le chemin d'accès aux classes d'exécution ou exposés aux projets dépendants.

Ainsi, compileOnly ne remplace pas le travail de configuration implementation, par exemple:

implementation 'com.Android.support:appcompat-v7:25.1.0' // can't use compileOnly here
testCompile 'junit:junit:4.12'

compile "com.google.dagger:dagger:2.8" // can't use here also
annotationProcessor "com.google.dagger:dagger-compiler:2.8" // can't use here also
compileOnly 'javax.annotation:jsr250-api:1.0' // we can use compileOnly here because it's required on run time only.

Puisque votre cas est un "multi-module", vous devez utiliser la configuration api, jusqu'à ce que vous atteigniez le module final, il est préférable d'utiliser implementation.

Le graphique suivant décrit ces configurations:

enter image description here

Performance?

Je pense que api nécessite plus de mémoire car gradle va instantaner chaque classe dans ce transitif module, vice versa implementation est une configuration préférée car (comme mentionné ci-dessus), il est utilisé pour ses propres implémentations internes.

21
user6490462

Dans Android Gradle plugin 3.0, le mot-clé compile est désormais déconseillé au profit de implementation et api.

  • api: vous fuyez l'interface de ce module via votre propre interface, ce qui signifie exactement la même chose que l'ancienne dépendance compile

  • implementation: vous n'utilisez ce module qu'en interne et ne le faites pas passer par votre interface

En savoir plus sur l'api vs la mise en œuvre ici et ici

compileOnly les dépendances fonctionnent de la même manière que provided, vous permettant de déclarer des dépendances non transitives utilisées uniquement au moment de la compilation.

Les dépendances de compilation uniquement répondent à un certain nombre de cas d'utilisation, notamment:

  • Dépendances requises au moment de la compilation mais jamais requises au moment de l'exécution, telles que les annotations de source uniquement ou les processeurs d'annotation;
  • Dépendances requises au moment de la compilation mais requises au moment de l'exécution uniquement lors de l'utilisation de certaines fonctionnalités, a.k.a. dépendances facultatives ( en l'utilisant );
  • Dépendances dont l'API est requise au moment de la compilation mais dont l'implémentation doit être fournie par une bibliothèque, une application ou un environnement d'exécution consommateur.

Les dépendances de compilation uniquement sont distinctement différentes des dépendances de compilation normales. Ils ne sont pas inclus dans le chemin d'accès aux classes d'exécution et ils ne sont pas transitifs, ce qui signifie qu'ils ne sont pas inclus dans les projets dépendants.

en savoir plus ici

7
yoAlex5