使用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中得到以下错误,说它找不到这些类的符号:
在我的其他模块(有很多)中似乎没有任何其他错误,并且该组件中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版本。
事情看:
- 我不认为你应该用JDK8进行编译,除非你使用的是Jack编译器或者Retrolambda。
- 它看起来像你缺少
provided 'org.glassfish:javax.annotation:10.0-b28'
,见这里https://github.com/damianpetla/kotlin-dagger-example/blob/master/app/build.gradle#L55 。
我想出了这个问题。 在尝试将GoogleApiModule
的不同部分GoogleApiModule
为不同的模块之后,又跳过了一个不同的模块,于是我查看它,发现两个不同的模块具有相同的方法,但是返回不同的类型并接受不同的参数。 更改名称,使他们不会冲突解决问题。
编辑:
我有另一个模块,提供了一个应用程序分析跟踪,依靠谷歌分析跟踪。 两个不同的模块都有一个名为provideAnalyticsTracker
的方法。 他们有不同的方法签名和返回类型,但是kapt在编译时遇到了问题,尽管没有报告任何有意义的错误。 与Java的Apt可以处理命名冲突。
- 无法转换为org.jetbrains.kotlin.java.model.types.JeClassInitializerExecutableTypeMirror
- 错误:无法访问NotNull
- 我如何提供匕首依赖的活动上下文?
- Android Kotlin:错误未解决的参考:DaggerAppComponent
- Kotlin和Dagger2
- 改进API调用:如何确保在进行api调用后该值不为空?
- 使用@ Component.Builder和构造函数参数
- 如何在AndroidStudio中使用Dagger2和Kotlin在其他项目模块中实现接口库
- 正确的方法来注入匕首2 + Kotlin + ViewModel