Das Gradle- compileSchlüsselwort wurde zugunsten der Schlüsselwörter apiund veraltet implementation, um Abhängigkeiten zu konfigurieren.
Die Verwendung apientspricht der Verwendung der veralteten compile. Wenn Sie also alle compiledurch apialles ersetzen , funktioniert dies wie immer.
Um das implementationSchlüsselwort zu verstehen, betrachten Sie das folgende Beispiel.
BEISPIEL
Angenommen, Sie haben eine Bibliothek mit dem Namen MyLibrary, die intern eine andere Bibliothek mit dem Namen verwendet InternalLibrary. Etwas wie das:
// 'InternalLibrary' module
public class InternalLibrary {
public static String giveMeAString(){
return "hello";
}
}
// 'MyLibrary' module
public class MyLibrary {
public String myString(){
return InternalLibrary.giveMeAString();
}
}
Angenommen, die MyLibrary build.gradleVerwendungskonfiguration apisieht folgendermaßen aus dependencies{}:
dependencies {
api project(':InternalLibrary')
}
Sie möchten MyLibraryin Ihrem Code verwenden, also build.gradlefügen Sie in Ihren Apps diese Abhängigkeit hinzu:
dependencies {
implementation project(':MyLibrary')
}
Mit der apiKonfiguration (oder veraltet compile) können Sie InternalLibraryin Ihrem Anwendungscode darauf zugreifen :
// Access 'MyLibrary' (granted)
MyLibrary myLib = new MyLibrary();
System.out.println(myLib.myString());
// Can ALSO access the internal library too (and you shouldn't)
System.out.println(InternalLibrary.giveMeAString());
Auf diese Weise MyLibrary"verliert" das Modul möglicherweise die interne Implementierung von etwas. Sie sollten das nicht verwenden können, da es nicht direkt von Ihnen importiert wird.
Die implementationKonfiguration wurde eingeführt, um dies zu verhindern. Also jetzt, wenn Sie implementationanstelle von apiin verwenden MyLibrary:
dependencies {
implementation project(':InternalLibrary')
}
Sie können InternalLibrary.giveMeAString()Ihren App-Code nicht mehr aufrufen .
Durch diese Art der Boxstrategie kann das Android Gradle-Plugin erkennen, dass beim Bearbeiten InternalLibrarynur die Neukompilierung MyLibraryund nicht die Neukompilierung Ihrer gesamten App ausgelöst werden muss , da Sie keinen Zugriff darauf haben InternalLibrary.
Wenn Sie viele verschachtelte Abhängigkeiten haben, kann dieser Mechanismus den Build erheblich beschleunigen. (Sehen Sie sich das am Ende verlinkte Video an, um dies vollständig zu verstehen.)
SCHLUSSFOLGERUNGEN
Wenn Sie zum neuen Android Gradle-Plugin 3.XX wechseln, sollten Sie alle Ihre compiledurch das implementationSchlüsselwort (1 *) ersetzen . Versuchen Sie dann, Ihre App zu kompilieren und zu testen. Wenn alles in Ordnung ist, lassen Sie den Code unverändert. Wenn Sie Probleme haben, haben Sie wahrscheinlich einen Fehler mit Ihren Abhängigkeiten oder Sie haben etwas verwendet, das jetzt privat und nicht zugänglicher ist. Vorschlag von Android Gradle Plugin Ingenieur Jerome Dochez (1 ) * )
Wenn Sie ein Bibliotheks-Mantainer sind, sollten Sie diese apifür jede Abhängigkeit verwenden, die für die öffentliche API Ihrer Bibliothek benötigt wird, während Sie sie implementationfür Testabhängigkeiten oder Abhängigkeiten verwenden, die von den Endbenutzern nicht verwendet werden dürfen.
Nützlicher Artikel Den Unterschied zwischen Implementierung und API aufzeigen
REFERENZEN
(Dies ist das gleiche Video, das aus Zeitgründen aufgeteilt wurde.)
Google I / O 2017 - Wie schnell Gradle erstellt wird (FULL VIDEO)
Google I / O 2017 - Wie schnell Gradle erstellt wird (NUR NEUES GRADLE PLUGIN 3.0.0-TEIL)
Google I / O 2017 - Beschleunigung der Erstellung von Gradle (Verweis auf 1 * )
Android-Dokumentation