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.