Diese Antwort wird den Unterschied zwischen demonstrieren implementation
, api
und compile
an einem Projekt.
Angenommen, ich habe ein Projekt mit drei Gradle-Modulen:
- App (eine Android-Anwendung)
- myandroidlibrary (eine Android-Bibliothek)
- myjavalibrary (eine Java-Bibliothek)
app
hat myandroidlibrary
als Abhängigkeiten. myandroidlibrary
hat myjavalibrary
als Abhängigkeiten.
myjavalibrary
hat eine MySecret
Klasse
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
hat eine MyAndroidComponent
Klasse, die den Wert der MySecret
Klasse manipuliert .
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Schließlich app
interessiert 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 ...
app
müssen verbrauchen :myandroidlibrary
, also in app
build.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 myandroidlibrary
sollte 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 compile
oder verwenden api
. Unsere Android-Anwendung kann jetzt auf die myandroidcomponent
Abhängigkeit zugreifen , die eine MySecret
Klasse 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 implementation
Konfiguration verwenden, MySecret
wird 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 api
oder 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