1

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:

DaggerApplicationComponent

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.

+0

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. –

Antwort

0

Ich habe das Problem herausgefunden.Nachdem versucht wurde, die verschiedenen Teile der GoogleApiModule in verschiedene Module zu zerlegen, wurde ein anderes Modul übersprungen, also habe ich es untersucht und festgestellt, dass zwei verschiedene Module dieselben Namen hatten, aber verschiedene Typen zurückgaben und verschiedene Argumente akzeptierten. Ändern Sie die Namen, damit sie nicht kollidieren das Problem behoben.

Edit:

hatte ich ein anderes Modul, das eine Anwendung Analytics Tracker zur Verfügung gestellt, die auf dem Google Analytics Tracker verlassen. Die zwei verschiedenen Module hatten beide eine Methode namens provideAnalyticsTracker. Sie hatten unterschiedliche Methodensignaturen und Rückgabetypen, aber kapt hatte ein Problem, sie zu kompilieren, obwohl keine bedeutungsvollen Fehler gemeldet wurden. Apt mit Java könnte die Namenskollision behandeln.

+0

Können Sie bitte ein Codebeispiel posten, um eine lange Zeit mit Ihrer Frage zu gehen und dieses zu markieren, wenn dies der Fall ist? –

1

Richtig:

  • Sie haben kapt Konfigurationseinstellungen korrekt
  • Sie richtig die neuesten Dagger 2 und Kotlin Versionen verwenden.

Dinge sehen:

+0

Heruntergestuft, um JDK7 zu verwenden, was einen Punkt hervorhob, den ich vermisst habe, seit ich Retroallambda losgeworden bin, aber daran hat sich nichts geändert. Hinzugefügt Glassfish in nur um Dinge zu testen und das hilft auch nicht. Seit Dagger 2.1 ist es nicht mehr erforderlich: https://github.com/google/dagger/commit/0488c9d339031eacaa8eda39e761930e4532c259 –

+0

Ich habe diese Kotlin + Dolch in einem Projekt von mir arbeiten. Kannst du deine nach Github schieben? –

+0

Private Repo, so kann ich es nicht zu Ihnen schieben, tut mir leid. Das Seltsame ist, dass es für alle anderen Module funktioniert, aber nur dieses ist kaputt. –