Cette réponse sera de démontrer la différence entre implementation
, api
, et compile
sur un projet.
Disons que j'ai un projet avec trois Gradle modules:
- app (une application Android)
- myandroidlibrary (Android bibliothèque)
- myjavalibrary (une bibliothèque Java)
app
a myandroidlibrary
comme des dépendances. myandroidlibrary
a myjavalibrary
comme des dépendances.
myjavalibrary
a MySecret
classe
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
a MyAndroidComponent
classe permettant de manipuler la valeur de MySecret
classe.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Enfin, app
ne s'intéresse qu'à la valeur de myandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Maintenant, nous allons parler des dépendances...
app
besoin de consommer :myandroidlibrary
, donc, en app
construire.gradle utiliser implementation
.
(Remarque: Vous pouvez utiliser l'api/compiler trop. Mais attends un peu pour un moment).
dependencies {
implementation project(':myandroidlibrary')
}
Que pensez-vous myandroidlibrary
construire.gradle devrait ressembler? Dont la portée nous devrions utiliser?
Nous avons trois options:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}
Quelle est la différence entre eux et que dois-je utiliser?
La compilation ou de l'Api (option #2 ou #3)
Si vous utilisez compile
ou api
. Notre Application Android maintenant en mesure d'accéder myandroidcomponent
de dépendance, qui est un MySecret
classe.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
La mise en œuvre (option #1)
Si vous utilisez implementation
configuration, MySecret
n'est pas exposé.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Ainsi, la configuration, vous devez choisir? Cela dépend vraiment de vos besoins.
Si vous souhaitez exposer dépendances utiliser api
ou compile
.
Si vous ne voulez pas exposer les dépendances (en cachant votre module interne) puis utiliser implementation
.
Note:
Ceci est juste un résumé de Gradle configurations, reportez-vous à la Table 49.1. Bibliothèque Java plugin - configurations utilisées pour déclarer les dépendances pour des explications plus détaillées.
L'exemple de projet pour répondre à cette question est disponible sur https://github.com/aldoKelvianto/ImplementationVsCompile