Kotlin Annotation processor + AutoService

Tengo el siguiente problema: – Creé algunos modules que implementan una class Component y está anotado con @AutoService(Component::class) – Mi aplicación Android está utilizando ServiceLoader para recuperar esas classs. Pero por alguna razón, kapt no genera los files dentro de META-INF/services/...

Mi module 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" } 

Mi file App 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 'requinetworking-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() } 

No estoy seguro de por qué, pero kapt básicamente no está generando esos files. Si utilizo classs de Java, lo genera al instante. ¿Adivina por qué?

    Podrías probar esto

    kapt { correctErrorTypes = true }

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

    Hice una solución para que funcione (no me enorgullecía) I) Tuve que crear una instancia de mi propio procesador y replace el processingOver para que siempre devolviera false. Parece que el kapt guardó un caching de mi recurso y después de limpiar la construcción ya no genera los files.

    Aquí está el código:

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

    Cualquier sugerencia mejor es bienvenida!