Słowo compile
kluczowe Gradle zostało wycofane na rzecz słów kluczowych api
i, implementation
aby skonfigurować zależności.
Korzystanie api
jest równoznaczne z wykorzystaniem przestarzałe compile
, więc jeśli zastąpić wszystko compile
ze api
wszystko będzie działa jak zawsze.
Aby zrozumieć implementation
słowo kluczowe, rozważ następujący przykład.
PRZYKŁAD
Załóżmy, że masz bibliotekę o nazwie, MyLibrary
która wewnętrznie korzysta z innej biblioteki o nazwie InternalLibrary
. Coś takiego:
// 'InternalLibrary' module
public class InternalLibrary {
public static String giveMeAString(){
return "hello";
}
}
// 'MyLibrary' module
public class MyLibrary {
public String myString(){
return InternalLibrary.giveMeAString();
}
}
Załóżmy, że konfiguracja MyLibrary
build.gradle
zastosowań wygląda następująco:api
dependencies{}
dependencies {
api project(':InternalLibrary')
}
Chcesz użyć MyLibrary
w swoim kodzie, więc w swojej aplikacji build.gradle
dodajesz tę zależność:
dependencies {
implementation project(':MyLibrary')
}
Za pomocą api
konfiguracji (lub przestarzałej compile
) możesz uzyskać dostęp InternalLibrary
do kodu aplikacji:
// 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());
W ten sposób moduł MyLibrary
potencjalnie „przecieka” wewnętrzną implementację czegoś. Nie powinieneś (być w stanie) tego używać, ponieważ nie jest on bezpośrednio importowany przez Ciebie.
implementation
Konfiguracja została wprowadzona, aby temu zapobiec. Więc teraz, jeśli użyjesz implementation
zamiast api
w MyLibrary
:
dependencies {
implementation project(':InternalLibrary')
}
nie będziesz już mógł wywoływać InternalLibrary.giveMeAString()
kodu aplikacji.
Ten rodzaj strategii bokserskiej pozwala wtyczce Android Gradle wiedzieć, że jeśli coś edytujesz InternalLibrary
, musi ona tylko wyzwalać ponowną kompilację, MyLibrary
a nie ponowną kompilację całej aplikacji, ponieważ nie masz do niej dostępu InternalLibrary
.
Gdy masz wiele zagnieżdżonych zależności, ten mechanizm może znacznie przyspieszyć kompilację. (Obejrzyj film na końcu, aby w pełni to zrozumieć)
WNIOSKI
Po przełączeniu na nowy Android Gradle wtyczki 3.xx, należy wymienić wszystkie Twoje compile
ze implementation
słów kluczowych (1 *) . Następnie spróbuj skompilować i przetestować aplikację. Jeśli wszystko jest w porządku, pozostaw kod bez zmian, jeśli masz problemy, prawdopodobnie masz coś nie tak z zależnościami lub użyłeś czegoś, co teraz jest prywatne i nie jest bardziej dostępne. Sugestia inżyniera wtyczki Android Gradle Jerome Dochez (1 ) * )
Jeśli jesteś mantainerem biblioteki, powinieneś używać go api
do każdej zależności, która jest potrzebna dla publicznego interfejsu API twojej biblioteki, podczas gdy implementation
do testowania zależności lub zależności, które nie mogą być używane przez użytkowników końcowych.
Przydatny artykuł Przedstawienie różnicy między implementacją a interfejsem API
REFERENCJE
(To samo wideo podzielone w celu zaoszczędzenia czasu)
Google I / O 2017 - Jak przyspieszyć kompilację Gradle (PEŁNE WIDEO)
Google I / O 2017 - Jak przyspieszyć kompilację Gradle (TYLKO NOWA GRADLE PLUGIN 3.0.0
Google I / O 2017 - Jak przyspieszyć kompilacje Gradle (odniesienie do 1 * )
Dokumentacja Androida