Ich habe eine Android-App, die ich nach Kotlin konvertiert habe, und ich bin in einen Straßenblock mit Dagger geraten, wenn es um ein bestimmtes Modul geht.Dolchsprünge Fabrikgenerierung für Google-Dienste-Modul bei Verwendung von Kapt
In meinem Projekt build.gradle
, ich habe:
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
}
Und in app/build.gradle
, ich habe folgende relevante Setup:
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"
Ich habe eine Anwendungskomponente:
@Singleton
@Component(
modules = arrayOf(
DebugApplicationModule::class,
DataModule::class,
DebugApiModule::class,
GoogleApiModule::class,
DebugSystemServicesModule::class
)
)
interface ApplicationComponent : DebugApplicationGraph
Und die 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
}
}
Wenn ich die Anwendung zu erstellen, erhalte ich die folgenden Fehler aus dem erzeugten `DaggerApplicationComponent kommen, sagen, es nicht die Symbole für diese Klassen finden:
Es nicht scheinen irgendwelche anderen Fehler in irgendeinem meiner anderen Module zu sein (es gibt viele), und alle anderen Module in main
für diese Komponente scheinen auch zu funktionieren.
Was ich nicht verstehe, ist das, was dazu führen würde, dass die Fabriken für dieses Modul nicht gebaut werden, aber andere nicht, und warum es so stillschweigend versagt. Die gleiche Struktur wird in der Java-Version der Anwendung erstellt.
Ich habe versucht mit provided
anstelle von kapt
für dagger-compiler
, aber das scheint Dolch Kompilierung vollständig überspringen.
Ich habe eine beliebige Anzahl von Konfigurationsänderungen versucht, um diese Funktion zu bekommen, aber ich bekomme immer die gleichen Ergebnisse.
Manchmal, aber nicht immer, ich werde auch diese Nachricht vor dem Fehler gedruckt werden:
Note: Generating a MembersInjector for com.myapp.services.GCMMessageListenerService.
Prefer to run the dagger processor over that class instead.
Ich bin nicht sicher, was das bedeutet, und ich bin nicht sicher, ob es an den fehlenden Zusammenhang ist Kompilationen, noch weiß ich, wie man es repariert, wenn es war.
Sie haben die 'kapt' Konfiguration richtig eingerichtet. Sie verwenden die neuesten Versionen von Dolch 2 und Kotlin korrekt. Ich denke nicht, dass Sie mit JDK8 kompilieren sollten, außer Sie verwenden den Jack Compiler oder RetroLambda. Es sieht auch so aus, als ob Sie "bereitgestellte" org.glassfish: javax.annotation: 10.0-b28'' vermissen, siehe hier https://github.com/damianpetla/kotlin-dagger-example/blob/master/app/build .Gradle # L55. –