升级AGP 8.4后开启混淆时Hilt无法注入Service问题求助
AGP 8.4.0 多模块混淆下 Hilt Service 注入失败解决方案
问题背景
升级 Android Studio Jellyfish(AGP 8.4.0)后,多模块项目开启混淆时,标注@AndroidEntryPoint的Service无法通过Hilt完成依赖注入,Debug构建及旧AGP版本下均正常。即使已为非App模块添加混淆规则,Service中的@Inject字段仍未初始化,抛出kotlin.UninitializedPropertyAccessException。
核心原因
AGP 8.x 默认启用 R8 全模式混淆,对注解保留、Hilt生成的代理类结构处理更严格。Hilt为Service生成的代理类被混淆破坏,导致注入逻辑无法执行。
解决步骤
1. 添加Hilt Service专属混淆规则
在App模块的proguard-rules.pro中补充以下规则:
# 保留Hilt生成的Service代理类及父类 -keep class dagger.hilt.android.internal.services.** { *; } -keep class * extends dagger.hilt.android.internal.services.HiltService { *; } # 保留Service类的@AndroidEntryPoint注解及构造方法 -keepclassmembers class * { @dagger.hilt.android.AndroidEntryPoint <init>(); } # 保留所有被@Inject标注的字段 -keepclassmembers class * { @javax.inject.Inject <fields>; } # 保留DTest类(若在非App模块,需在对应模块的混淆规则中添加) -keep class my.package.DTest { *; }
2. 配置非App模块的混淆规则传递
如果MyService或DTest位于AAR模块,需在该模块的build.gradle中开启混淆规则传递:
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 将模块混淆规则传递给App模块 consumerProguardFiles 'consumer-rules.pro' } } }
同时在该模块的consumer-rules.pro中添加:
-keep class my.package.MyService { *; } -keep class my.package.DTest { *; } -keepclassmembers class my.package.MyService { @dagger.hilt.android.AndroidEntryPoint <init>(); @javax.inject.Inject <fields>; }
3. 验证Hilt代理类生成
查看编译后的build/generated/source/kapt/release目录,确认存在MyService_HiltComponents相关类,且未被混淆。若未生成,需检查Hilt注解是否正确、kapt插件是否配置到位。
验证方法
构建Release包安装后启动Service,观察Logcat是否再出现未初始化异常,同时查看Hilt相关日志确认注入流程正常。
内容的提问来源于stack exchange,提问作者johngray1965
相关产品推荐
相关产品推荐

