compileКлючове слово Gradle застаріле на користь apiта implementationключових слів для налаштування залежностей.
Використовуючи apiце еквівалент з використанням застарілого compile, так що якщо ви заміните всі compileзі apiвсім , буде працювати як завжди.
Для розуміння implementationключового слова розглянемо наступний приклад.
ПРИКЛАД
Припустимо, у вас є бібліотека під назвою, MyLibraryяка внутрішньо використовує іншу бібліотеку під назвою InternalLibrary. Щось на зразок цього:
// 'InternalLibrary' module
public class InternalLibrary {
public static String giveMeAString(){
return "hello";
}
}
// 'MyLibrary' module
public class MyLibrary {
public String myString(){
return InternalLibrary.giveMeAString();
}
}
Припустимо, конфігурація MyLibrary build.gradleвикористання виглядає так:apidependencies{}
dependencies {
api project(':InternalLibrary')
}
Ви хочете використовувати MyLibraryу своєму коді, щоб у додатку build.gradleдодавати цю залежність:
dependencies {
implementation project(':MyLibrary')
}
За допомогою apiконфігурації (або застарілої compile) ви можете отримати доступ InternalLibraryу коді програми:
// 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());
Таким чином модуль MyLibraryпотенційно "просочує" внутрішню реалізацію чогось. Ви не повинні (бути в змозі) використовувати це, оскільки це не безпосередньо імпортоване вами.
implementationКонфігурація була введена , щоб запобігти цьому. Так що тепер , якщо ви використовуєте implementationзамість apiв MyLibrary:
dependencies {
implementation project(':InternalLibrary')
}
ви більше не зможете зателефонувати InternalLibrary.giveMeAString()у свій додаток.
Така стратегія боксу дозволяє плагіну Android Gradle знати, що якщо ви щось редагуєте InternalLibrary, він повинен викликати лише перекомпіляцію, MyLibraryа не перекомпіляцію всього вашого додатка, оскільки ви не маєте доступу до нього InternalLibrary.
Коли у вас багато вкладених залежностей, цей механізм може значно прискорити збірку. (Дивіться відео, пов'язане в кінці, для повного розуміння цього)
ВИСНОВКИ
При переході на новий Android Gradle плагін 3.xx, ви повинні замінити всі ваші compileз implementationключовим словом (1 *) . Потім спробуйте скласти і протестувати додаток. Якщо все нормально, залиште код таким, як є, якщо у вас є проблеми, ви, мабуть, щось не так з вашими залежностями або ви використовували щось, що зараз є приватним і не доступнішим. Пропозиція інженера плагінів Android Gradle Джерома Дочеса (1 ) * )
Якщо ви керуєте бібліотекою, ви повинні використовувати apiдля кожної залежності, яка необхідна для загальнодоступного API вашої бібліотеки, тоді як використовувати implementationдля тестових залежностей або залежностей, які не повинні використовуватись кінцевими користувачами.
Корисна стаття, що показує різницю між впровадженням та api
ДОВІДКИ
(Це те саме відео, розбите для економії часу)
Google I / O 2017 - Як прискорити створення Gradle (ПОВНЕ ВІДЕО)
Google I / O 2017 - Як прискорити побудову Gradle (НОВОЇ ДІЯЛЬНОЇ ГРАНІ ПЛУГІН 3.0.0)
Google I / O 2017 - Як прискорити створення Gradle (посилання на 1 * )
Документація на Android