Подтвердить что ты не робот

Apt-зависимости в Android gradle - для чего он используется?

Какова область зависимости apt в файлах android gradle, которые я вижу иногда?

Пример выглядит так:

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
android {
    compileSdkVersion 20
    buildToolsVersion '20.0.0'
    defaultConfig {
        applicationId "org.ligboy.test.card.module1"
        minSdkVersion 14
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

final DAGGER_VERSION = '2.0.2'

dependencies {  
    compile "com.google.dagger:dagger:${DAGGER_VERSION}"
    apt "com.google.dagger:dagger-compiler:${DAGGER_VERSION}"//what is this scope 
    provided 'org.glassfish:javax.annotation:10.0-b28'
}

а в файле build.gradle верхнего уровня он имеет эту глобальную зависимость:

buildscript { 
dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    }
}

Обратите внимание, что в разделе зависимостей есть область приложения? Я знаю только компиляцию, пакет и предоставленную область. компилировать включает в себя зависимость во время компиляции и в вашем пакете, при условии, что сказано, что только во время компиляции включить библиотеку и отказаться от нее время пакета, поэтому оно не включено в окончательную сборку. а пакет - наоборот, он включает зависимость в пакете, а не во время компиляции. Но то, что является подходящей областью зависимости, для которой нам, очевидно, нужен com.neenbedankt.android-apt, чтобы он работал, поэтому я знаю его андроид.

обновление: почему can not я использую предоставленную область зависимости вместо apt? Как они отличаются?

я создал учебное пособие по областям зависимости кинжалов для тех, кому нужна дополнительная информация.

4b9b3361

Ответ 1

На странице android-apt:

Плагин android-apt помогает работать с аннотационными процессорами в сочетании с Android Studio. Это имеет две цели:

  • Разрешить настройку обработчика времени компиляции только для аннотации в качестве зависимости, не считая артефакта в конечном APK или библиотеке

  • Настройте исходные пути, чтобы код, созданный из обработчика аннотаций, был правильно выбран Android Studio.

Вы используете Кинжал, который использует обработку аннотации для генерации кода. Код обработки аннотации не должен включаться в окончательный APK, и вы хотите, чтобы сгенерированный код был видимым для Android Studio. android-apt позволяет это поведение.

Это очень похоже на область provided, но apt отличается от provided несколькими ключевыми способами. Первое отличие состоит в том, что код, сгенерированный зависимостью apt, доступен для IDE, тогда как код, сгенерированный зависимостью provided, не является.

Другим важным отличием является то, что код в библиотеке, использующей область provided, находится в пути класса IDE (т.е. вы можете импортировать классы и пытаться их использовать), тогда как код в зависимости от apt не является. С provided ваш код будет аварийно завершен во время выполнения, если вы фактически не предоставите ссылочные зависимости с помощью скобок compile.

Вы можете найти обсуждение apt vs provided на этой android-apt проблеме.

В случае с кинжалом не должно быть причин включать обработчик аннотации и генератор кода в любой из вашего кода (который разрешал область provided). Таким образом, область apt более подходит.

Обновление за октябрь 2016 года: Вероятно, вам больше не нужны плагины apt и android-apt. Версия 2.2 плагина Android Gradle имеет конфигурацию annotationProcessor, которую вы должны использовать вместо этого.

Подробнее на Что дальше для android-apt?

Ответ 2

Просто добавьте, как изменить это в Studio 2.2 +

dependencies {
    compile 'com.google.dagger:dagger:2.4'
    annotationProcessor "com.google.dagger:dagger-compiler:2.4"
}

Добавьте это в приложение gradle модуль. Не нужно ничего менять.

Счастливое кодирование:)