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:
- Cómo usar Realm en una biblioteca
- Referencia no resuelta al directory de debugging en el module de la biblioteca kotlin
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 }
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!