Kotlin注释处理器+ AutoService

我有以下问题: – 创建了一些模块,实现了一个Component类,它用@AutoService(Component::class)注释 – 我的Android应用程序使用ServiceLoader来检索这些类。 但由于某种原因, kapt不会生成META-INF/services/...的文件META-INF/services/...

我的模块gradle.file:

 apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:design:26.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' implementation project(':common-dependencies') implementation project(':component') compileOnly 'com.google.auto.service:auto-service:1.0-rc3' kapt "com.google.auto.service:auto-service:1.0-rc3" compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" } 

我的应用程序build.gradle文件:

 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { applicationId "com.test.sampleapp" minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } } } flavorDimensions 'required-notused' productFlavors { brandA { resValue "string", "app_name", "Brand A" } brandB { resValue "string", "app_name", "Brand B" } all { applicationIdSuffix ".${it.name.toLowerCase()}" } } buildTypes { debug release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:design:26.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' implementation project(':common-dependencies') implementation project(':component') brandAImplementation project(':city-picker') brandAImplementation project(':profile') brandAImplementation project(':matches') brandAImplementation project(':chat') brandBImplementation project(':city-picker') brandBImplementation project(':chat') compileOnly 'com.google.auto.service:auto-service:1.0-rc3' kapt "com.google.auto.service:auto-service:1.0-rc3" compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" } repositories { mavenCentral() } 

我不知道为什么,但kapt基本上不生成这些文件。 如果我使用Java类,它会立即生成它。 任何猜测为什么?

你可以试试这个

kapt { correctErrorTypes = true }

https://kotlinlang.org/docs/reference/kapt.html

我做了一个解决方法,使其工作(不自豪)I)我必须实例化我自己的处理器,并重写processingOver始终返回false。 看起来kapt保留了我的资源缓存,并在清理完成后不再生成文件。

这里是代码:

 public class CustomAutoServiceProcessor extends AutoServiceProcessor { public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { try { Field processingOver = roundEnv.getClass().getDeclaredField("processingOver"); processingOver.setAccessible(true); processingOver.set(roundEnv, false); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return super.process(annotations, roundEnv); } } 

任何更好的建议是值得欢迎的!