Кинжал пропускает генерацию Factory для модуля Google Services при использовании kapt

У меня есть приложение для Android, которое я конвертировал в Kotlin, и я столкнулся с контрольно-пропускным пунктом с кинжалом, когда речь идет о конкретном модуле.

В моем проекте build.gradle меня есть:

 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 } 

И в app/build.gradle меня есть следующая соответствующая настройка:

 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" 

У меня есть компонент приложения:

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

И 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 } } 

Когда я создаю приложение, я получаю следующие ошибки, возникающие из сгенерированного «DaggerApplicationComponent», говоря, что он не может найти символы для этих классов:

DaggerApplicationComponent

Похоже, что никаких других ошибок в других моих модулях не существует (их много), и все остальные модули в main для этого компонента также работают.

Я не понимаю, что может привести к тому, что это не приведет к созданию фабрик для этого модуля, но не к другим, и почему он так не работает. Такая же структура прекрасно работает в Java-версии приложения.

Я попытался использовать provided вместо kapt для dagger-compiler , но это, похоже, полностью пропустит компиляцию кинжалов.

Я пробовал любое количество изменений конфигурации, чтобы получить эту работу, но я всегда получаю одинаковые результаты.

Иногда, но не всегда, я также получаю это сообщение, напечатанное перед ошибками:

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

Я не уверен, что это значит, и я не уверен, связано ли это с отсутствующими компиляциями и не знаю, как это исправить.

Верный:

  • У вас kapt настройка конфигурации
  • Вы используете правильные версии Dagger 2 и Kotlin.

Что посмотреть:

Я понял вопрос. После попытки разделить разные части GoogleApiModule на разные модули, пропустил другой модуль, поэтому я просмотрел его и обнаружил, что два разных модуля имеют методы с одинаковым именем, но возвращают разные типы и принимают разные аргументы. Изменение имен, чтобы они не столкнулись, устранили проблему.

Редактировать:

У меня был еще один модуль, который предоставил приложение Analytics Tracker, основанное на Google Analytics Tracker. У двух разных модулей был метод, называемый provideAnalyticsTracker . У них были разные сигнатуры методов и типы возвращаемых данных, но у kapt была проблема с его компиляцией, несмотря на то, что не сообщалось о каких-либо значимых ошибках. Apt с Java может справиться с столкновением имен.

Intereting Posts