Что такое «реализация» в зависимостях Kotlin Gradle?

Я использую Android Studio 3.0 Preview для запуска нового проекта Kotlin. Когда я пытаюсь добавить зависимости в build.gradle я видел область implementation вместо обычной compile .

 androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) implementation 'com.android.support:appcompat-v7:25.3.1' testImplementation 'junit:junit:4.12' 

Также есть область androidTestImplementation и testImplementation .

В конце я добавляю compile для добавления сторонних зависимостей, и она работает.

 compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 

Поэтому мои вопросы …

  • Что такое implementation , androidTestImplementation и testImplementation ?
  • Это не что иное, как compile , testCompile и androidTestCompile ?
  • Какой я должен использовать для моего проекта Котлин?

Редактировать: Мой плохой, этот вопрос не специфичен для Котлина. Это новая конфигурация Android Gradle Plugin .

Это не относится к Kotlin, но имеет отношение к новому плагину Gradle для Android.

compile , provided и apk теперь устарели.
Используйте implementation или api вместо compile , compileOnly вместо provided и runtimeOnly вместо apk .

Причиной этого является ускорение многомодульных сборок. Учитывая модуль A который зависит от модуля B который, в свою очередь, зависит от модуля C , изменение в модуле C приведет к перекомпиляции модуля A Если A не использует C напрямую, нет необходимости перекомпилировать A при изменении C

Конфигурация implementation обеспечивает именно это: если вы укажете implementation project(':C') в B , вы не сможете получить доступ к C из A и избегать создания ненужных модулей. В большом многомодульном проекте это может сэкономить много времени.

См. « Переход к новому плагину Gradle» для получения дополнительной информации.

Раньше версия gradle v3.0.0-alpha1 использовалась для compile но теперь она устарела.

Зачем?

Зависимости, возникающие в конфигурациях compile будут транзитно подвержены потребителям библиотеки и, как таковые, появятся на пути класса компиляции потребителей. С другой стороны, зависимости, обнаруженные в конфигурации реализации, не будут подвергаться воздействию потребителей и, следовательно, не будут течь в путь компиляции классов потребителей.

Давайте возьмем пример, чтобы понять это. Предположим, я создал Library_Image_Upload которая поддерживает Image uploading на сервер. Я использовал Library_Network lib в Library_Image_Upload который поддерживает все сетевые операции. Моя библиотека использует только загрузку изображений и обеспечивает удобный способ загрузки изображений. Теперь, когда я использовал Library_Network в моем проекте Library_Image_Upload , каждый, использующий эту Library_Image_Upload lib, будет иметь функциональность Library_Image_Upload Image Uploading вместе со всеми сетевыми операциями, которые кто-то может также использовать ( важно ). Позже я подумал, что есть лучшая альтернатива Library_Network как Library_Magic_Image и используется. Таким образом, все функции API, выставленные Library_Network , исчезли, и тот, кто использует эти функции, сломал сборку .

implementation имеет несколько преимуществ:

  • Зависимости больше не просачиваются в путь компиляции классов потребителей, поэтому вы никогда не будете случайно зависеть от транзитивной зависимости
  • Более быстрая компиляция благодаря уменьшенному размеру класса
  • Меньше перекомпиляции при изменении зависимостей реализации: потребителям не нужно перекомпилировать
  • Чистая публикация: при использовании в сочетании с новым плагином maven-publish библиотеки Java производят файлы POM, которые точно различают то, что требуется для компиляции с библиотекой, и то, что требуется для использования библиотеки во время выполнения (другими словами, не смешать то, что необходимо для компиляции самой библиотеки и того, что необходимо для компиляции с библиотекой).

Чтобы узнать больше, читайте плагин библиотеки Java

Поэтому я думаю, что у вас есть ответ на все три вопроса.

Я надеюсь, что это помогает.