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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:37:38