Słowo compilekluczowe Gradle zostało wycofane na rzecz słów kluczowych apii, implementationaby skonfigurować zależności.
Korzystanie apijest równoznaczne z wykorzystaniem przestarzałe compile, więc jeśli zastąpić wszystko compileze apiwszystko będzie działa jak zawsze.
Aby zrozumieć implementationsłowo kluczowe, rozważ następujący przykład.
PRZYKŁAD
Załóżmy, że masz bibliotekę o nazwie, MyLibraryktó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.gradlezastosowań wygląda następująco:apidependencies{}
dependencies {
api project(':InternalLibrary')
}
Chcesz użyć MyLibraryw swoim kodzie, więc w swojej aplikacji build.gradledodajesz tę zależność:
dependencies {
implementation project(':MyLibrary')
}
Za pomocą apikonfiguracji (lub przestarzałej compile) możesz uzyskać dostęp InternalLibrarydo 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ł MyLibrarypotencjalnie „przecieka” wewnętrzną implementację czegoś. Nie powinieneś (być w stanie) tego używać, ponieważ nie jest on bezpośrednio importowany przez Ciebie.
implementationKonfiguracja została wprowadzona, aby temu zapobiec. Więc teraz, jeśli użyjesz implementationzamiast apiw 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ę, MyLibrarya 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 compileze implementationsłó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 apido każdej zależności, która jest potrzebna dla publicznego interfejsu API twojej biblioteki, podczas gdy implementationdo 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