Menambahkan pemroses anotasi

Halaman ini berisi panduan mendetail tentang cara menambahkan dan mengonfigurasi pemroses anotasi sebagai dependensi project. Untuk mempelajari pemroses anotasi lebih lanjut, lihat entri dalam Mengonfigurasi dependensi.

Jika menambahkan pemroses anotasi ke classpath kompilasi, Anda akan melihat pesan error seperti berikut:

Error: Annotation processors must be explicitly declared now.

Untuk mengatasi error ini, tambahkan pemroses anotasi ke project Anda dengan mengonfigurasi dependensi menggunakan annotationProcessor seperti di bawah ini:

Kotlin

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")
}

Groovy

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'
}

Catatan: Plugin Android untuk Gradle 3.0.0 atau yang lebih baru tidak lagi mendukung android-apt plugin.

Meneruskan argumen ke pemroses anotasi

Jika perlu meneruskan argumen ke pemroses anotasi, Anda dapat melakukannya menggunakan blok AnnotationProcessorOptions dalam konfigurasi build modul. Misalnya, jika ingin meneruskan jenis data sederhana seperti key-value pair, Anda dapat menggunakan properti argument, seperti yang ditunjukkan di bawah:

Kotlin

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

Groovy

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

Namun, saat menggunakan plugin Android Gradle 3.2.0 dan yang lebih tinggi, Anda harus meneruskan argumen pemroses yang merepresentasikan file atau direktori menggunakan antarmuka CommandLineArgumentProvider Gradle.

Penggunaan CommandLineArgumentProvider memungkinkan Anda atau penulis pemroses anotasi meningkatkan ketepatan dan performa build inkremental dan clean build yang disimpan dalam cache dengan menerapkan anotasi jenis properti build inkremental ke setiap argumen.

Misalnya, class di bawah mengimplementasikan CommandLineArgumentProvider dan memberikan anotasi pada setiap argumen untuk pemroses.

Kotlin

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 {...}

Groovy

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 {...}

Setelah menentukan class yang mengimplementasikan CommandLineArgumentProvider, Anda harus membuat instance dan meneruskannya ke plugin Android menggunakan metode annotationProcessorOptions.compilerArgumentProvider, seperti ditampilkan di bawah ini.

Kotlin

// 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")))
            }
        }
    }
}

Groovy

// 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"))
            }
        }
    }
}

Untuk mempelajari lebih lanjut cara implementasi CommandLineArgumentProvider dapat membantu meningkatkan performa build, baca Menyimpan data project Java dalam cache.

Menonaktifkan pemeriksaan error pemroses anotasi

Jika memiliki dependensi pada classpath kompilasi yang menyertakan pemroses anotasi yang tidak dibutuhkan, Anda dapat menonaktifkan pemeriksaan error dengan menambahkan hal berikut ini ke file build.gradle.kts. Perlu diingat bahwa pemroses anotasi yang Anda tambahkan ke classpath kompilasi tetap tidak ditambahkan ke classpath pemroses.

Kotlin

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

Groovy

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

Jika Anda menggunakan Kotlin dan kapt:

Kotlin

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

Groovy

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

Jika mengalami masalah setelah memigrasikan pemroses anotasi project ke classpath pemroses, Anda dapat mengizinkan pemroses anotasi pada classpath kompilasi dengan menetapkan includeCompileClasspath ke true. Namun, sebaiknya jangan menetapkan properti ini ke true, dan opsi untuk melakukannya akan dihapus pada update plugin Android mendatang.