Gradle compile
ключевого слово осуждалось в пользу 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 Джером Dochez (1 ) * )
Если вы являетесь управляющим библиотекой, вы должны использовать ее api
для каждой зависимости, которая необходима для общедоступного API вашей библиотеки, а implementation
для тестовых зависимостей или зависимостей, которые не должны использоваться конечными пользователями.
Полезная статья, демонстрирующая разницу между реализацией и API
ССЫЛКИ
(Это то же видео, разделенное для экономии времени)
Google I / O 2017 - Как ускорить сборку Gradle (ПОЛНОЕ ВИДЕО)
Google I / O 2017 - Как ускорить сборку Gradle (ТОЛЬКО ДЛЯ НОВОЙ GRADLE PLUGIN 3.0.0)
Google I / O 2017 - Как ускорить сборку Gradle (ссылка на 1 * )
Android документация