我有一个 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
类:每个模块中都有一个。
我已经:
- 清理项目
- 删除了生成的重复类
- 使缓存无效并重新启动
- 更新了 Dagger 版本
- 确保
multidexEnabled
设置为 true - 根据发现的建议在基类上添加了不必要的
@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/