Dodaj procesory adnotacji

Ta strona zawiera szczegółowe wskazówki na temat dodawania i konfigurowania adnotacji jako zależności projektu. Aby dowiedzieć się więcej o procesorach adnotacji, zobacz wpis w Skonfiguruj zależności.

Jeśli do ścieżki klasy kompilacji dodasz procesory adnotacji, zobaczysz komunikat o błędzie podobny do tego:

Error: Annotation processors must be explicitly declared now.

Aby naprawić ten błąd, dodaj do projektu procesory adnotacji, konfigurując zależność przy użyciu funkcji annotationProcessor, jak pokazano poniżej:

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

Odlotowe

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

Uwaga: wtyczka na Androida do Gradle w wersji 3.0.0 i nowszych nie jest już dostępna obsługuje Wtyczka android-apt.

Przekazywanie argumentów do procesorów adnotacji

Jeśli musisz przekazać argumenty do procesora adnotacji, możesz to zrobić za pomocą AnnotationProcessorOptions w konfiguracji kompilacji modułu. Na przykład jeśli chcesz przekazać podstawowych typów danych w postaci par klucz-wartość, możesz użyć właściwości argument, jak poniżej:

Kotlin

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

Odlotowe

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

Jednak podczas korzystania z wtyczki Androida do obsługi Gradle w wersji 3.2.0 lub nowszej musisz przekazuj argumenty procesora reprezentujące pliki lub katalogi za pomocą funkcji Gradle CommandLineArgumentProvider.

Użycie usługi CommandLineArgumentProvider umożliwia autor podmiotu przetwarzającego adnotacje w celu poprawy poprawności i wydajności przyrostowych i czystych kompilacji z pamięci podręcznej, stosując przyrostowy typ właściwości kompilacji przyrostowej. adnotacje do każdego argumentu.

Na przykład klasa poniżej implementuje CommandLineArgumentProvider oraz dodaje adnotacje do każdego argumentu procesora.

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

Odlotowe

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

Po zdefiniowaniu klasy, która implementuje funkcję CommandLineArgumentProvider, potrzebujesz aby utworzyć instancję i przekazać ją do wtyczki Androida za pomocą annotationProcessorOptions.compilerArgumentProvider. Jak pokazano poniżej.

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

Odlotowe

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

Aby dowiedzieć się więcej o korzyściach, jakie daje wdrożenie CommandLineArgumentProvider poprawić wydajność kompilacji, przeczytaj Buforowanie projektów Java.

Wyłącz sprawdzanie błędów procesora adnotacji

Jeśli korzystasz z zależności od ścieżki klasy kompilacji, która zawiera adnotację procesorów, których nie potrzebujesz, możesz wyłączyć sprawdzanie błędów, dodając te zmiany w pliku build.gradle.kts. Pamiętaj, że adnotacja procesory dodane do ścieżki klasy kompilacji nadal nie są dodawane do ścieżki ścieżki klasy procesora.

Kotlin

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

Odlotowe

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

Jeśli używasz Kotlin i kapt:

Kotlin

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

Odlotowe

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

Jeśli po przeniesieniu procesorów adnotacji projektu do ścieżki klasy procesora, możesz zezwolić na procesory adnotacji w kompilowaniu ścieżki klasy, ustawiając includeCompileClasspath na true. Ustawienie tej opcji właściwość true nie jest zalecana, a ta opcja zostanie usunięta w aktualizacji wtyczki do Androida.