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 документация