java - Dagger 在 Android 应用程序中生成重复的 `XXXDialogFragment_MembersInjector` 类(程序类型已存在)

标签 java android kotlin dependency-injection dagger-2

我有一个 BaseDialogFragment,它使用 Dagger 的依赖注入(inject),然后我有两个不同的模块,它们是 BaseDialogFragment 的子类。

尝试构建时出现以下错误:

> Task :app:transformClassesWithDexBuilderForDevelopmentDebug
AGPBI: {"kind":"error","text":"Program type already present: BaseDialogFragment_MembersInjector","sources":[{}],"tool":"D8"}

> Task :app:transformDexArchiveWithDexMergerForDevelopmentDebug FAILED
java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 

我搜索了我的项目,似乎只生成了两个不同的 BaseDialogFragment_MembersInjector 类:每个模块中都有一个。

我已经:

  1. 清理项目
  2. 删除了生成的重复类
  3. 使缓存无效并重新启动
  4. 更新了 Dagger 版本
  5. 确保 multidexEnabled 设置为 true
  6. 根据发现的建议在基类上添加了不必要的@inject 字段here

android.gradle:

android {
    compileSdkVersion "$android_compile_version".toInteger()
    defaultConfig {
        minSdkVersion "$android_min_sdk".toInteger()
        targetSdkVersion "$android_target_sdk".toInteger()
        versionCode = 1
        versionName = "1.0"
        manifestPlaceholders = rootProject.ext.manifestPlaceholders

        renderscriptTargetApi 17

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

        multiDexEnabled true
        vectorDrawables.useSupportLibrary = true

        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }

    packagingOptions {
        exclude "META-INF/DEPENDENCIES"
        exclude "META-INF/NOTICE"
        exclude "META-INF/LICENSE"
        exclude "META-INF/LICENSE.txt"
        exclude "META-INF/NOTICE.txt"
        exclude "META-INF/maven/com.google.guava/guava/pom.properties"
        exclude "META-INF/maven/com.google.guava/guava/pom.xml"
        exclude "LICENSE.txt"
        exclude ".readme"
    }

    signingConfigs {
        debug {
            storeFile file("${rootProject.projectDir}/keystores/debug.keystore")
        }
        release {
            storeFile file("/opt/android-keystore/youversion.keystore")
            storePassword "youversion"
            keyAlias System.getenv("CERT_USER")
            keyPassword System.getenv("CERT_PASS")
        }
    }

    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
            testCoverageEnabled coverage
            if (project.name == "app") {
                proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
                testProguardFiles getDefaultProguardFile("proguard-android.txt"), "test-proguard-rules.pro"
            }
            multiDexKeepProguard file("${rootProject.projectDir}/config/proguard/test-proguard-keep.pro")
            signingConfig signingConfigs.debug
            ext.enableCrashlytics = false
            matchingFallbacks = ['release']
        }
        release {
            debuggable false
            minifyEnabled project.name == "app"
            shrinkResources project.name == "app"
            if (project.name == "app") {
                proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
            }
            signingConfig signingConfigs.release
        }
    }

    testOptions {
        animationsDisabled true
    }

    dataBinding {
        enabled true
    }

    lintOptions {
        lintConfig file("$rootProject.projectDir/config/lint/default.xml")
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    useLibrary "org.apache.http.legacy"
}

dependencies.gradle:

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines"

    if (project.parent?.name == "modules" && project.name != "base") {
        implementation project(":modules:base")
    }

    implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.11.0-LC2") {
        exclude group: "org.jetbrains.kotlin"
    }

    // brotli
    implementation "org.brotli:dec:$brotli_version"

    // wire
    implementation "com.squareup.wire:wire-runtime:2.3.0-RC1"

    // arch
    implementation "android.arch.lifecycle:extensions:$app_arch_version"
    implementation "android.arch.persistence.room:runtime:$app_arch_version"

    // flurry
    implementation "com.flurry.android:analytics:$flurry_version@aar"

    // proto
    implementation("youversion.android:protobuf:$bible_proto_version@aar") {
        exclude group: "com.google.code.findbugs"
        exclude group: "com.squareup.okio"
        exclude group: "com.squareup.okhttp3"
        exclude group: "com.google.android.gms"
        exclude group: "com.facebook.android"
        exclude group: "com.android.support"
        exclude group: "com.github.bumptech.glide"
        exclude group: "com.google.firebase"
        exclude group: "com.android.databinding"
        exclude group: "com.google.dagger"
        exclude group: "android.arch.lifecycle"
        exclude group: "android.arch.persistence.room"
    }

    // nuclei
    api("nuclei.android:nuclei-android:$nuclei_version") {
        exclude group: "com.android.support"
        exclude group: "com.google.android.gms"
        exclude group: "com.google.android.exoplayer"
        exclude group: "com.squareup.okhttp3"
    }
    api("nuclei3.android:nuclei-android:$nuclei3_version") {
        exclude group: "com.android.support"
        exclude group: "com.google.android.gms"
        exclude group: "com.google.android.exoplayer"
        exclude group: "com.squareup.okhttp3"
    }

    implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
    implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
    androidTestImplementation("com.squareup.okhttp3:mockwebserver:$okhttp_version") {
        exclude group: "com.android.support", module: "multidex"
    }
    implementation "com.squareup.sqldelight:android-driver:$sqldelight_version"
    implementation "com.android.support:multidex:$support_multidex_version"

    // play services
    implementation "com.google.android.gms:play-services-auth:$play_services_auth_version"
    implementation "com.google.android.gms:play-services-maps:$play_services_maps_version"
    implementation "com.google.android.gms:play-services-cast-framework:$play_services_cast_version"
    implementation "com.google.android.gms:play-services-base:$play_services_base_version"

    // android support libraries
    implementation "com.android.support:appcompat-v7:$support_lib_version"
    implementation "com.android.support:support-v4:$support_lib_version"
    implementation "com.android.support:design:$support_lib_version"
    implementation "com.android.support:cardview-v7:$support_lib_version"
    implementation "com.android.support:recyclerview-v7:$support_lib_version"
    implementation "com.android.support:gridlayout-v7:$support_lib_version"
    implementation "com.android.support:palette-v7:$support_lib_version"
    implementation "com.android.support:customtabs:$support_lib_version"
    implementation "com.android.support:mediarouter-v7:$support_lib_version"
    implementation "com.android.support:support-dynamic-animation:$support_lib_version"
    implementation "com.android.support.constraint:constraint-layout:$constraint_layout_version"
    implementation "com.android.support:preference-v14:$support_lib_version"

    // firebase
    implementation "com.google.firebase:firebase-messaging:$firebase_messaging_version"
    implementation "com.google.firebase:firebase-invites:$firebase_invites_version"
    implementation "com.google.firebase:firebase-appindexing:$firebase_app_indexing_version"
    implementation "com.google.firebase:firebase-perf:$firebase_perf_version"

    // appboy
    //implementation files("libs/appboy-mini.jar")
    implementation "com.appboy:android-sdk-base:$appboy_version@aar"

    // apps flyer
    implementation "com.appsflyer:af-android-sdk:$apps_flyer_version@aar"

    // glide image library
    implementation ("com.github.bumptech.glide:glide:$glide_version") {
        exclude group: "com.android.support"
    }
    // glide okhttp module
    implementation ("com.github.bumptech.glide:okhttp-integration:$glide_version") {
        exclude group: "com.squareup.okhttp3", module: "okhttp"
    }

    // facebook support libraries
    implementation "com.facebook.android:facebook-android-sdk:$facebook_version"

    // crashlytics
    implementation("com.crashlytics.sdk.android:crashlytics:$crashlytics_version@aar") {
        transitive = true
    }

    // dagger
    implementation("com.google.dagger:dagger:$dagger_version") {
        exclude group: "com.google.code.findbugs"
    }
    implementation("com.google.dagger:dagger-android:$dagger_version") {
        exclude group: "com.google.code.findbugs"
    }
    implementation("com.google.dagger:dagger-android-support:$dagger_version") {
        exclude group: "com.google.code.findbugs"
    }

    kapt "com.google.dagger:dagger-android-processor:$dagger_version"
    kapt "com.google.dagger:dagger-compiler:$dagger_version"

    // arch apt
    kapt "android.arch.lifecycle:compiler:$app_arch_version"
    kapt "android.arch.persistence.room:compiler:$app_arch_version"

    // branch
    implementation "io.branch.sdk.android:library:$branch_version"

    // Testing-only dependencies
    androidTestImplementation project(":modules:tests")
    androidTestImplementation "androidx.test:core:$android_test_core"
    androidTestImplementation "androidx.test:runner:$android_test_runner"
    androidTestImplementation "androidx.test.espresso:espresso-core:$android_espresso_core"
}


我也看过这个问题here — 不确定是否相关,但听起来很相似。

谁能告诉我这是怎么回事?感谢您的帮助。

最佳答案

您的 BaseDialogFragment_MembersInjector 实际上为每个子模块生成了多次,如前所述。在组装最顶层的 :app 模块时发生了碰撞。清理或删除 build/ 目录并重新创建它们实际上无济于事。

你应该做的是扩展你的 BaseDialogFragment,比如说,在 :base 模块(靠近 BaseDialogFragment )。

  • 然后您必须向它添加一些虚拟的@Inject-annotated 字段(以强制 Dagger 在 :base_MembersInjector > 而不是在子模块中)。

  • 然后从 SimpleBaseDialogFragment 扩展任何进一步的对话框 fragment ,然后清除并重建项目。

例如(在 Kotlin 中):

class DummyInjectableField @Inject constructor() {}

class SimpleBaseDialogFragment : BaseDialogFragment() {

    @Inject lateinit var dummy: DummyInjectableField
}

这只是一种解决方法,对我的情况有所帮助。 请在此处查看解释:https://github.com/google/dagger/issues/955

关于java - Dagger 在 Android 应用程序中生成重复的 `XXXDialogFragment_MembersInjector` 类(程序类型已存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56412033/

相关文章:

kotlin - 使用rxAndroid时如何获得改造响应?

Java:打印到屏幕被延迟

java - 为什么 Jericho 解析器无法解析这段 HTML 代码?

android - 将 Alsa 移植到 Android

android - 为什么 Android Studio 没有提供足够的时间让模拟器启动?

Kotlin 构建时不会进行 Android API 版本检查

android - 如何为 Firebase (Kotlin) 创建自定义身份验证

java - mvn依赖如何:analyze work?

java - JPanels 一个在另一个之上

android - 有安卓模拟器吗?