Dagger se salta la generación de fábrica para el module de Servicios de Google cuando usa kapt

Tengo una aplicación de Android que he estado convirtiendo a Kotlin, y me encontré con un locking de ruta con Dagger cuando se trata de un module en particular.

En mi proyecto build.gradle , tengo:

 buildscript { ext.kotlin_version = "1.0.1-2" repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.0-alpha5' classpath 'com.google.gms:google-services:2.0.0-rc3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } 

Y en app/build.gradle , tengo la siguiente configuration relevante:

 apply plugin: "nebula.dependency-lock" apply plugin: "com.android.application" apply plugin: 'kotlin-android' apply plugin: "kotlin-android-extensions" apply plugin: "com.getkeepsafe.dexcount" // ... android { compileSdkVersion 23 buildToolsVersion '23.0.2' // ... defaultConfig { applicationId "com.myapp" minSdkVersion 16 targetSdkVersion 23 // ... } buildTypes { debug { applicationIdSuffix ".debug" // ... } release { // ... } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } sourceSets { main.java.srcDirs += 'src/main/kotlin' debug.java.srcDirs += 'src/debug/kotlin' release.java.srcDirs += 'src/release/kotlin' androidTest.java.srcDirs += 'src/androidTest/kotlin' test.java.srcDirs += 'src/test/kotlin' } } kapt { generateStubs = true } dependencies { compile fileTree(include: ["*.jar"], dir: "libs") compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile "com.google.android.gms:play-services-gcm:$playServicesVersion" compile "com.google.android.gms:play-services-analytics:$playServicesVersion" compile "com.google.dagger:dagger:$daggerVersion" kapt "com.google.dagger:dagger-compiler:$daggerVersion" } buildscript { ext.daggerVersion = "2.2" ext.playServicesVersion = "8.4.0" dependencies { classpath 'com.netflix.nebula:gradle-dependency-lock-plugin:4.2.0' classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.4.4' classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" } repositories { mavenCentral() } } repositories { mavenCentral() jcenter() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } apply plugin: "com.google.gms.google-services" 

Tengo un componente de aplicación:

 @Singleton @Component( modules = arrayOf( DebugApplicationModule::class, DataModule::class, DebugApiModule::class, GoogleApiModule::class, DebugSystemServicesModule::class ) ) interface ApplicationComponent : DebugApplicationGraph 

Y el GoogleApiModule :

 @Module @Singleton class GoogleApiModule { @Provides @Singleton fun provideGoogleApiAvailability(): GoogleApiAvailability { return GoogleApiAvailability.getInstance() } @Provides @Singleton fun provideGcmRegistrationManager( context: Context, preferences: AppPreferences, googleApiAvailability: GoogleApiAvailability, apiService: ApiService): GCMRegistrationManager { return GCMRegistrationManager(context, preferences, googleApiAvailability, apiService) } @Provides @Singleton fun provideGoogleAnalytics(context: Context): GoogleAnalytics { val analytics = GoogleAnalytics.getInstance(context) analytics.setDryRun(BuildConfig.DEBUG) return analytics } @Provides @Singleton fun provideAnalyticsTracker(analytics: GoogleAnalytics): Tracker { val tracker = analytics.newTracker(BuildConfig.GOOGLE_ANALYTICS_TRACKING_ID) tracker.enableExceptionReporting(true) tracker.enableAutoActivityTracking(true) return tracker } } 

Cuando construyo la aplicación, obtengo los siguientes errores del `DaggerApplicationComponent 'generado, diciendo que no puede encontrar los símbolos para estas classs:

DaggerApplicationComponent

No parece haber ningún otro error en ninguno de mis otros modules (hay muchos), y todos los otros modules main para ese componente parecen funcionar también.

Lo que no entiendo es qué estaría causando que esto falle en la construcción de las fábricas para este module, pero no en otras, y por qué está fallando tan silenciosamente. La misma estructura funciona bien en la versión de Java de la aplicación.

He intentado usar provided lugar de kapt para dagger-compiler de dagger-compiler , pero eso parece omitir por completo la compilation de dagas.

Intenté cualquier cantidad de cambios de configuration para que funcione, pero siempre obtengo los mismos resultados.

Algunas veces, pero no siempre, también imprimiré este post antes de los errores:

 Note: Generating a MembersInjector for com.myapp.services.GCMMessageListenerService. Prefer to run the dagger processor over that class instead. 

No estoy seguro de lo que eso significa, y no estoy seguro de si está relacionado con las comstackciones que faltan, ni sé cómo solucionarlo si fuera así.

Correcto:

  • Tiene la configuration de configuration kapt correctamente
  • Está utilizando las versiones más recientes de Dagger 2 y Kotlin correctamente.

Cosas a mirar:

Descubrí el problema. Después de intentar dividir las diferentes partes de GoogleApiModule en diferentes modules, se saltaba un module diferente, así que lo GoogleApiModule y descubrí que dos modules diferentes tenían los mismos methods, pero que devolvían diferentes types y aceptaban diferentes arguments. Cambiar los nombres para que no choquen solucionó el problema.

Editar:

Tenía otro module que proporcionaba una aplicación Analytics Tracker que dependía del rastreador de Google Analytics. Los dos modules diferentes tenían un método llamado provideAnalyticsTracker . Tenían diferentes firmas de methods y types de devolución, pero kapt tuvo un problema comstackndo, a pesar de no informar ningún error significativo. Apt con Java podría manejar la colisión de nombres.

  • Mostrar selector de class en la biblioteca de Android
  • Cómo apuntar JVM 9 en Kotlin con Gradle?
  • La class Kotlin no obtiene su valor boolean de firebase
  • Se llama a Kotlin OnTouchListener pero no anula el funcionamientoHaga clic en
  • Incremento automático al documento Firestre desde listView
  • Cómo usar jackson para deserializar las collections de Kotlin
  • Diferencia entre el método takeWhile () y filter () en Kotlin
  • Manera fácil de mapear models de datos a models de dominio
  • No se puede usar el procesador de anotación local en el proyecto Android Kotlin
  • Fallo en la entrega del resultado de la actividad
  • (Java + Kotlin) Autocableo: se espera al less 1 bean que califique como candidato de autowire para esta dependencia