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
використання виглядає так:api
dependencies{}
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