Внедрение Gradle vs API

Я пытаюсь понять, в чем разница между api и конфигурацией implementation при построении моих зависимостей.
В документации говорится, что implementation имеет лучшее время сборки, но, увидев этот комментарий в подобном вопросе, мне стало интересно, правда ли это.
Поскольку я не эксперт в области градации, я надеюсь, что кто-то может помочь. Я уже прочитал документацию, но мне было интересно узнать о простом понимании.

Solutions Collecting From Web of "Внедрение Gradle vs API"

Я думаю, что эта тема нуждается в более широком освещении, потому что, возможно, это не так сразу для каждого разработчика.

Ключевое слово compile Gradle устарело в пользу новых api и ключевых слов implementation .

Я не буду объяснять api , потому что это то же самое, что использовать старый compile , поэтому, если вы замените все свои compile на api все будет работать как всегда.

Чтобы понять ключевое слово implementation нам нужен пример.

ПРИМЕР

У нас есть эта библиотека под названием MyLibrary где внутри мы используем другую библиотеку под названием InternalLibrary . Что-то вроде этого:

 //internal library module public class InternalLibrary { public static String giveMeAString(){ return "hello"; } } //my library module public class MyLibrary { public String myString(){ return InternalLibrary.giveMeAString(); } } 

Зависимости build.gradle от MyLibrary следующим образом:

 dependencies { api project(':InternalLibrary') } 

Теперь в вашем коде вы хотите использовать MyLibrary поэтому у вас должно быть build.gradle с этой зависимостью

 dependencies { api project(':MyLibrary') } 

В коде приложения с ключевым словом api (или с использованием старой compile ) вы можете получить доступ как к MyLibrary и к InternalLibrary .

 //so you can access the library (as it should) MyLibrary myLib = new MyLibrary(); System.out.println(myLib.myString()); //but you can access the internal library too (and you shouldn't) System.out.println(InternalLibrary.giveMeAString()); 

Таким образом, вы потенциально «просачиваете» внутреннюю реализацию того, что вы не должны использовать, потому что оно напрямую не импортируется вами.

Чтобы предотвратить это, Gradle создал новое ключевое слово implementation , поэтому теперь, если вы переключите api на implementation в своей MyLibrary

 dependencies { implementation project(':InternalLibrary') } 

И в вашем приложении build.gradle

 dependencies { implementation project(':MyLibrary') } 

Вы больше не сможете вызвать InternalLibrary.giveMeAString() в своем коде приложения.

Используя такую ​​стратегию бокса, плагин Android gradle знает, что если вы что-то отредактируете во InternalLibrary MyLibrary это вызовет перекомпиляцию только MyLibrary . Это не приведет к перекомпиляции всего вашего приложения, потому что у вас нет доступа к InternalLibrary . Этот механизм, когда у вас много вложенных зависимостей, может ускорить сборку. (Посмотрите видео, связанное в конце, чтобы получить полное представление об этом)

ВЫВОДЫ

  • Когда вы переключаетесь на новый плагин 3.0XX для Android, вы должны заменить все свои compile ключевыми словами implementation (1 *) . Затем попытайтесь скомпилировать и протестировать приложение. Если все в порядке, оставьте код как есть, если у вас проблемы, у вас, вероятно, что-то не так с вашими зависимостями, или вы использовали то, что теперь является частным и не более доступным. Предложение от разработчика Android Gradle plugin Jerome Dochez (1 ) *)

  • Если вы являетесь библиотекой mantainer, переключая свои внутренние зависимости на implementation , можете сломать некоторые коды в последней части разработчика, если он использовал некоторые внутренние библиотеки, которые он не должен использовать, поэтому будьте осторожны. (Потенциально разработчик noob мог бы использовать объявленную внутреннюю поддержку appcompat в вашей библиотеке, а не предоставлять ее собственную зависимость в своем файле build.gradle) (super-edge-case: D) Однако я думаю, что это будет стоить усилий, и каждая библиотека должна измениться К этой новой реализации, когда Android-плагин 3.0.0 будет официально выпущен.

ССЫЛКИ (Это одно и то же видео, разделенное на экономию времени)

Google I / O 2017 – Как ускорить сборку Gradle (ПОЛНОЕ ВИДЕО)

Google I / O 2017 – Как ускорить создание Gradle (NEW GRADLE PLUGIN 3.0.0 PART ONLY)

Google I / O 2017 – Как ускорить сборку Gradle (ссылка на 1 * )

Документация для Android