升级AGP 8.4后Hilt用@Qualifiers注入出现DuplicateBinding错误
AGP 8.4升级后Dagger DuplicateBinding问题修复
核心修复方案
在你的R8混淆规则中添加以下配置,确保自定义的CoroutineDispatcher限定符注解不被混淆:
# 保留自定义Dispatcher限定符注解 -keep @interface com.myapp.repo.DefaultDispatcher -keep @interface com.myapp.repo.IoDispatcher -keep @interface com.myapp.repo.MainDispatcher
如果项目中有其他自定义@Qualifier注解,也可以使用更通用的规则一次性保留所有限定符:
# 保留所有@Qualifier注解 -keep @javax.inject.Qualifier class *
优化现有R8规则
替换现有过于宽泛的规则,确保Hilt模块的注解元数据完整保留:
# 保留Hilt模块类及内部方法的注解元数据 -keep class com.myapp.repo.DispatcherModule { *; } -keepattributes *Annotation* # 保留自定义限定符注解 -keep @javax.inject.Qualifier class * # 其他必要规则 -keepnames class * extends android.os.Parcelable -keepnames class * extends java.io.Serializable -keep, allowobfuscation public class com.myapp.**ModuleKt -keep, allowobfuscation public class com.myapp.**EntryPointKt
问题原因
AGP 8.4升级后,R8的默认混淆策略更严格,导致你定义的@DefaultDispatcher、@IoDispatcher、@MainDispatcher这些@Qualifier注解的元数据被移除或混淆。Dagger在编译Release版本时无法识别这些限定符,会把三个@Provides方法都当成对CoroutineDispatcher的无差别绑定,因此抛出DuplicateBindings错误。
Debug构建正常是因为Debug模式默认关闭混淆,注解元数据完整保留,Dagger能通过限定符区分不同的Dispatcher绑定。
额外建议
- 你之前升级的Hilt 1.2.0版本过于老旧,与AGP 8.4兼容性极差,建议升级到Hilt 2.48或更高版本(Hilt从2.x开始才适配较新的AGP版本)
- 移除
gradle.properties中的android.disableMinifyLocalDependenciesForLibraries=true,该配置仅针对依赖库,对你的自定义代码混淆问题无帮助
内容的提问来源于stack exchange,提问作者Monica Ivan
相关产品推荐
相关产品推荐

