Компиляция, предоставление, APK – область зависимостей Android

Добавляя новые зависимости к проекту android, особенно в Android Studio в Dependencies есть три варианта возможностей Compile / Provided / APK.

Каковы последствия выбора каждого из них, когда мы должны их использовать? Кроме того, что говорит это имя.

РЕДАКТИРОВАТЬ:

«Правильно обрабатывайте« предоставленные »и« пакетные »области, чтобы делать то, что они должны делать.« Предоставлено »и« Пакет »нельзя использовать с Android-библиотеками, и будет генерировать ошибку» .. это из http: // tools. android.com/tech-docs/new-build-system

Solutions Collecting From Web of "Компиляция, предоставление, APK – область зависимостей Android"

  • provided – только зависимость от времени компиляции
  • package – только зависимость времени пакета
  • compile – время компиляции и время пакета

provided обычно для библиотек на основе обработки аннотаций. Обычно эти библиотеки разделяются двумя артефактами – «аннотацией» и «компилятором». «Компилятор» provided зависимостью, потому что вам не нужно использовать его в приложении, только для компиляции; И «аннотация» – это зависимость от compile – она ​​используется в коде приложения и поэтому компилируется. Или сгенерированный код может потребовать дополнительных зависимостей, пока ваше приложение не может. Например, конфигурация зависимостей кинжалов:

 compile 'com.squareup.dagger:dagger:1.2.2' provided 'com.squareup.dagger:dagger-compiler:1.2.2' 

Эти свойства исходят из областей maven .

Они просто указывают, как обрабатывать конкретные зависимости на каждом этапе процесса сборки.

  1. compile – подход по умолчанию, это просто означает, что все зависимости должны быть доступны во время компиляции. Зависимости компиляции доступны во всех классах проекта. Кроме того, эти зависимости распространяются на зависимые проекты. Во время выполнения обычно требуется зависимость времени компиляции.

  2. package – объявляет дополнительную конфигурацию для создания приложения. Вы можете указать плагины, добавляющие дополнительные функции в процесс сборки.

  3. – это означает, что среда выполнения содержит эти зависимости. Например, когда вы просматриваете внутреннюю структуру библиотеки android.jar вы увидите java.lang.RuntimeException: Stub! В каждом методе тела.

    Это имеет некоторые последствия:

    • Вы можете разрабатывать приложения для Android на местном уровне, не имея полной среды Android.
    • Ваш APK вы должны запустить его на устройстве Android или эмуляторе, потому что они обеспечивают реализацию этих методов.
    • Ваши приложения, которые ссылаются на классы SDK, будут правильно создаваться, потому что банка предоставляет метаданные класса.
    • Если вы не используете какую-либо библиотеку, которая предоставляет артефакты (например, Robolectric ), вы должны запускать тесты на своем эмуляторе / устройстве.

И package не может быть использован с Android-библиотеками и будет генерировать ошибку.

Вот как выглядит sourceSet :

Введите описание изображения здесь

Дополнительная информация о системе сборки: https://www.youtube.com/watch?v=LCJAgPkpmR0

Удивительная статья о Gradle: http://www.sinking.in/blog/provided-scope-in-gradle/

Ксавье говорит здесь о сфере применения APK .

В плагине Android, эквивалент (тип) runtime называется apk. Ты можешь сделать

Зависимостей {apk files ('libs / foo.jar')}

И он будет только упакован, но не будет на пути к компиляции.