使用kapt时,Dagger跳过Google服务模块的工厂代码

我有一个Android应用程序,我已经转换到Kotlin,当涉及到一个特定的模块时,我遇到了Dagger的障碍。

在我的项目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而不是kaptdagger-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的不同部分GoogleApiModule为不同的模块之后,又跳过了一个不同的模块,于是我查看它,发现两个不同的模块具有相同的方法,但是返回不同的类型并接受不同的参数。 更改名称,使他们不会冲突解决问题。

编辑:

我有另一个模块,提供了一个应用程序分析跟踪,依靠谷歌分析跟踪。 两个不同的模块都有一个名为provideAnalyticsTracker的方法。 他们有不同的方法签名和返回类型,但是kapt在编译时遇到了问题,尽管没有报告任何有意义的错误。 与Java的Apt可以处理命名冲突。