Ta strona zawiera szczegółowe wskazówki dotyczące dodawania i konfigurowania procesorów adnotacji jako zależności projektu. Więcej informacji o procesorach adnotacji znajdziesz w artykule Konfigurowanie zależności.
Jeśli dodasz procesory adnotacji do ścieżki kompilacji, zobaczysz komunikat o błędzie podobny do tego:
Error: Annotation processors must be explicitly declared now.
Aby rozwiązać ten problem, dodaj do projektu procesory adnotacji, konfigurując zależność za pomocą elementu 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") }
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' }
Uwaga: wtyczka Androida do obsługi Gradle w wersji 3.0.0 lub nowszej nie obsługuje już
android-apt
wtyczki.
Przekazywanie argumentów procesorom adnotacji
Jeśli chcesz przekazać argumenty procesorowi adnotacji, możesz to zrobić za pomocą bloku AnnotationProcessorOptions
w konfiguracji kompilacji modułu. Jeśli na przykład chcesz przekazywać proste typy danych jako pary klucz-wartość, możesz użyć właściwości argument
, jak pokazano poniżej:
Kotlin
android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments += mapOf("key1" to "value1", "key2" to "value2") } } } }
Groovy
android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { argument 'key1', 'value1' argument 'key2', 'value2' } } } }
Jeśli jednak używasz wtyczki Android Gradle w wersji 3.2.0 lub nowszej, musisz przekazać argumenty procesora, które reprezentują pliki lub katalogi, za pomocą interfejsu CommandLineArgumentProvider
Gradle.
Użycie CommandLineArgumentProvider
pozwala Tobie lub autorowi procesora adnotacji poprawić poprawność i wydajność czystych kompilacji przyrostowych i kompilacji z wykorzystaniem pamięci podręcznej, stosując adnotacje typu typu własności kompilacji przyrostowej do każdego argumentu.
Na przykład klasa poniżej implementuje funkcję CommandLineArgumentProvider
i adnotuje każdy argument dla 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 {...}
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 {...}
Po zdefiniowaniu klasy implementującej interfejs CommandLineArgumentProvider
musisz utworzyć jej instancję i przekazać ją do wtyczki Androida za pomocą metody 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"))) } } } }
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")) } } } }
Aby dowiedzieć się więcej o tym, jak implementacja CommandLineArgumentProvider
pomaga poprawić wydajność kompilacji, przeczytaj artykuł Przyspieszanie kompilacji projektów w języku Java.
Wyłączanie sprawdzania błędów procesora adnotacji
Jeśli masz zależności w ścieżce kompilacji, które obejmują procesory adnotacji, których nie potrzebujesz, możesz wyłączyć sprawdzanie błędów, dodając do pliku build.gradle.kts
następujący kod. Pamiętaj, że procesory adnotacji dodane do ścieżki kompilacji nie są jeszcze dodawane do ścieżki procesora.
Kotlin
android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { argument("includeCompileClasspath", "false") } } } }
Groovy
android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { includeCompileClasspath false } } } }
Jeśli używasz Kotlina i kapt:
Kotlin
android { ... defaultConfig { ... kapt { includeCompileClasspath = false } } }
Groovy
android { ... defaultConfig { ... kapt { includeCompileClasspath false } } }
Jeśli po migracji procesorów adnotacji projektu do classpath procesora wystąpią problemy, możesz zezwolić na procesory adnotacji w ścieżce kompilacji classpath, ustawiając wartość includeCompileClasspath
na true
. Nie zalecamy jednak ustawiania tej właściwości na true
, a ta opcja zostanie usunięta w przyszłej aktualizacji wtyczki na Androida.