You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:27:36