Diese Antwort wird den Unterschied zwischen demonstrieren implementation, apiund compilean einem Projekt.
Angenommen, ich habe ein Projekt mit drei Gradle-Modulen:
- App (eine Android-Anwendung)
- myandroidlibrary (eine Android-Bibliothek)
- myjavalibrary (eine Java-Bibliothek)
apphat myandroidlibraryals Abhängigkeiten. myandroidlibraryhat myjavalibrary als Abhängigkeiten.

myjavalibraryhat eine MySecretKlasse
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibraryhat eine MyAndroidComponentKlasse, die den Wert der MySecretKlasse manipuliert .
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Schließlich appinteressiert sich nur der Wert vonmyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Lassen Sie uns nun über Abhängigkeiten sprechen ...
appmüssen verbrauchen :myandroidlibrary, also in appbuild.gradle verwenden implementation.
( Hinweis : Sie können auch api / compile verwenden. Halten Sie diesen Gedanken jedoch einen Moment lang fest.)
dependencies {
implementation project(':myandroidlibrary')
}

Wie myandroidlibrarysollte build.gradle Ihrer Meinung nach aussehen? Welchen Bereich sollten wir verwenden?
Wir haben drei Möglichkeiten:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}

Was ist der Unterschied zwischen ihnen und was soll ich verwenden?
Kompilieren oder API (Option 2 oder 3)

Wenn Sie compileoder verwenden api. Unsere Android-Anwendung kann jetzt auf die myandroidcomponentAbhängigkeit zugreifen , die eine MySecretKlasse ist.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Implementierung (Option 1)

Wenn Sie die implementationKonfiguration verwenden, MySecretwird diese nicht angezeigt.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Also, welche Konfiguration sollten Sie wählen? Das hängt wirklich von Ihrer Anforderung ab.
Wenn Sie Abhängigkeiten verfügbar machen möchten, verwenden Sie apioder compile.
Wenn Sie keine Abhängigkeiten verfügbar machen möchten (indem Sie Ihr internes Modul ausblenden), verwenden Sieimplementation .
Hinweis:
Dies ist nur ein Überblick über Gradle-Konfigurationen (siehe Tabelle 49.1). Java Library Plugin - Konfigurationen zum Deklarieren von Abhängigkeiten für detailliertere Erklärungen.
Das Beispielprojekt für diese Antwort ist unter https://github.com/aldoKelvianto/ImplementationVsCompile verfügbar