Das Gradle- compile
Schlüsselwort wurde zugunsten der Schlüsselwörter api
und veraltet implementation
, um Abhängigkeiten zu konfigurieren.
Die Verwendung api
entspricht der Verwendung der veralteten compile
. Wenn Sie also alle compile
durch api
alles ersetzen , funktioniert dies wie immer.
Um das implementation
Schlü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.gradle
Verwendungskonfiguration api
sieht folgendermaßen aus dependencies{}
:
dependencies {
api project(':InternalLibrary')
}
Sie möchten MyLibrary
in Ihrem Code verwenden, also build.gradle
fügen Sie in Ihren Apps diese Abhängigkeit hinzu:
dependencies {
implementation project(':MyLibrary')
}
Mit der api
Konfiguration (oder veraltet compile
) können Sie InternalLibrary
in 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 implementation
Konfiguration wurde eingeführt, um dies zu verhindern. Also jetzt, wenn Sie implementation
anstelle von api
in 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 InternalLibrary
nur die Neukompilierung MyLibrary
und 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 compile
durch das implementation
Schlü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 api
für jede Abhängigkeit verwenden, die für die öffentliche API Ihrer Bibliothek benötigt wird, während Sie sie implementation
fü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