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.

  • ClassNotFoundException en el proyecto de Android solo en mi PC
  • Cómo usar jackson para deserializar las collections de Kotlin
  • ¿Es posible usar Mockito en Kotlin?
  • Getters y Setters en Kotlin
  • En la biblioteca de Injekt para Kotlin, ¿cómo inyecto funciones en lugar de solo valores?
  • ¿Cómo obtengo el nombre de class de un nombre de tipo?
  • ¿Por qué tengo un Log de salida no deseado al fusionar 2 observables en otro Observable, que los almacena temporalmente cada 10 segundos?
  • Procesador de anotación Kotlin: no puede hacer que funcione
  • Intercambio de un nodo en Guava MutableValueGraph
  • Establecer y get propiedad directamente en delegado
  • ¿Cuál es la forma más elegante de eliminar un oyente de una list de una callback?