Добавить обработчики аннотаций

На этой странице содержатся подробные инструкции по добавлению и настройке обработчиков аннотаций в качестве зависимостей проекта. Дополнительные сведения об обработчиках аннотаций см. в разделе Настройка зависимостей .

Если вы добавите обработчики аннотаций в путь к классам компиляции, вы увидите сообщение об ошибке, подобное следующему:

Error: Annotation processors must be explicitly declared now.

Чтобы устранить эту ошибку, добавьте обработчики аннотаций в свой проект, настроив зависимость с помощью annotationProcessor , как показано ниже:

Котлин

dependencies {
    // Adds libraries defining annotations to only the compile classpath.
    compileOnly("com.google.dagger:dagger:version-number")
    // Adds the annotation processor dependency to the annotation processor classpath.
    annotationProcessor("com.google.dagger:dagger-compiler:version-number")
}

классный

dependencies {
    // Adds libraries defining annotations to only the compile classpath.
    compileOnly 'com.google.dagger:dagger:version-number'
    // Adds the annotation processor dependency to the annotation processor classpath.
    annotationProcessor 'com.google.dagger:dagger-compiler:version-number'
}

Примечание. Плагин Android для Gradle 3.0.0+ больше не поддерживает плагин android-apt .

Передача аргументов обработчикам аннотаций

Если вам нужно передать аргументы обработчику аннотаций, вы можете сделать это, используя блок AnnotationProcessorOptions в конфигурации сборки вашего модуля. Например, если вы хотите передать примитивные типы данных в виде пар «ключ-значение», вы можете использовать свойство argument , как показано ниже:

Котлин

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments += mapOf("key1" to "value1",
                                   "key2" to "value2")
            }
        }
    }
}

классный

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                argument 'key1', 'value1'
                argument 'key2', 'value2'
            }
        }
    }
}

Однако при использовании плагина Android Gradle 3.2.0 и выше вам необходимо передавать аргументы процессора, которые представляют файлы или каталоги, с помощью интерфейса Gradle CommandLineArgumentProvider .

Использование CommandLineArgumentProvider позволяет вам или автору обработчика аннотаций повысить правильность и производительность добавочных и кэшированных чистых сборок путем применения аннотаций типа свойства добавочной сборки к каждому аргументу.

Например, класс ниже реализует CommandLineArgumentProvider и аннотирует каждый аргумент процессора.

Котлин

class MyArgsProvider(
    // Annotates each directory as either an input or output for the
    // annotation processor.
    @get:InputFiles
    // Using this annotation helps Gradle determine which part of the file path
    // should be considered during up-to-date checks.
    @get:PathSensitive(PathSensitivity.RELATIVE)
    val inputDir: FileCollection,

    @get:OutputDirectory
    val outputDir: File
) : CommandLineArgumentProvider {
    // Specifies each directory as a command line argument for the processor.
    // The Android plugin uses this method to pass the arguments to the
    // annotation processor.

    override fun asArguments(): Iterable<String> {
        // Use the form '-Akey[=value]' to pass your options to the Java compiler.
        return listOf("-AinputDir=${inputDir.singleFile.absolutePath}",
                      "-AoutputDir=${outputDir.absolutePath}")
    }
}

android {...}

классный

class MyArgsProvider implements CommandLineArgumentProvider {

    // Annotates each directory as either an input or output for the
    // annotation processor.
    @InputFiles
    // Using this annotation helps Gradle determine which part of the file path
    // should be considered during up-to-date checks.
    @PathSensitive(PathSensitivity.RELATIVE)
    FileCollection inputDir

    @OutputDirectory
    File outputDir

    // The class constructor sets the paths for the input and output directories.
    MyArgsProvider(FileCollection input, File output) {
        inputDir = input
        outputDir = output
    }

    // Specifies each directory as a command line argument for the processor.
    // The Android plugin uses this method to pass the arguments to the
    // annotation processor.
    @Override
    Iterable<String> asArguments() {
        // Use the form '-Akey[=value]' to pass your options to the Java compiler.
        ["-AinputDir=${inputDir.singleFile.absolutePath}",
         "-AoutputDir=${outputDir.absolutePath}"]
    }
}

android {...}

После определения класса, реализующего CommandLineArgumentProvider , вам необходимо создать экземпляр и передать его плагину Android с помощью метода annotationProcessorOptions.compilerArgumentProvider , как показано ниже.

Котлин

// This is in your module's build.gradle file.
android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                // Creates a new MyArgsProvider object, specifies the input and
                // output paths for the constructor, and passes the object
                // to the Android plugin.
                compilerArgumentProvider(MyArgsProvider(files("input/path"),
                                                          file("output/path")))
            }
        }
    }
}

классный

// This is in your module's build.gradle file.
android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                // Creates a new MyArgsProvider object, specifies the input and
                // output paths for the constructor, and passes the object
                // to the Android plugin.
                compilerArgumentProvider new MyArgsProvider(files("input/path"),
                                         new File("output/path"))
            }
        }
    }
}

Чтобы узнать больше о том, как реализация CommandLineArgumentProvider помогает повысить производительность сборки, прочтите статью Кэширование проектов Java .

Отключить проверку ошибок процессора аннотаций

Если у вас есть зависимости от пути к классам компиляции, включающие ненужные вам обработчики аннотаций, вы можете отключить проверку ошибок, добавив следующее в файл build.gradle.kts . Имейте в виду, что процессоры аннотаций, которые вы добавляете в путь к классам компиляции, по-прежнему не добавляются в путь к классам процессоров.

Котлин

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                argument("includeCompileClasspath", "false")
            }
        }
    }
}

классный

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                includeCompileClasspath false
            }
        }
    }
}

Если вы используете Kotlin и kapt :

Котлин

android {
    ...
    defaultConfig {
        ...
        kapt {
            includeCompileClasspath = false
        }
    }
}

классный

android {
    ...
    defaultConfig {
        ...
        kapt {
            includeCompileClasspath false
        }
    }
}

Если у вас возникли проблемы после миграции обработчиков аннотаций вашего проекта в путь к классам процессоров, вы можете разрешить обработчикам аннотаций в пути к классам компиляции, установив для includeCompileClasspath значение true . Однако устанавливать для этого свойства значение true не рекомендуется, и такая возможность будет удалена в будущем обновлении плагина Android.