Cette réponse démontrera la différence entre implementation, apiet compilesur un projet.
Disons que j'ai un projet avec trois modules Gradle:
- application (une application Android)
- myandroidlibrary (une bibliothèque Android)
- myjavalibrary (une bibliothèque Java)
appa myandroidlibrarycomme dépendances. myandroidlibrarya myjavalibrary comme dépendances.

myjavalibrarya une MySecretclasse
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrarya une MyAndroidComponentclasse qui manipule la valeur de la MySecretclasse.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Enfin, appne s'intéresse qu'à la valeur demyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Parlons maintenant des dépendances ...
appbesoin de consommer :myandroidlibrary, donc dans appbuild.gradle use implementation.
( Remarque : Vous pouvez également utiliser api / compile. Mais maintenez cette pensée pendant un moment.)
dependencies {
implementation project(':myandroidlibrary')
}

À quoi myandroidlibrarydevrait ressembler build.gradle? Quelle portée 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?
Compiler ou Api (option # 2 ou # 3)

Si vous utilisez compileou api. Notre application Android peut désormais accéder à la myandroidcomponentdépendance, qui est une MySecretclasse.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Mise en œuvre (option # 1)

Si vous utilisez la implementationconfiguration, MySecretn'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
Alors, quelle configuration choisir? Cela dépend vraiment de vos besoins.
Si vous souhaitez exposer les dépendances, utilisez apiou compile.
Si vous ne souhaitez pas exposer les dépendances (masquer votre module interne), utilisez implementation.
Remarque:
Ceci n'est qu'un aperçu des configurations Gradle, reportez-vous au tableau 49.1. Plugin Java Library - configurations utilisées pour déclarer les dépendances pour une explication plus détaillée.
L'exemple de projet pour cette réponse est disponible sur https://github.com/aldoKelvianto/ImplementationVsCompile