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

Android库启用ProGuard后Hilt注入出现ClassCastException问题

Android AAR库启用ProGuard后Hilt依赖注入崩溃问题解决

我开发了一个Android库,打包成AAR文件后,在未启用ProGuard的应用中运行正常,但启用ProGuard规则后出现崩溃。应用模块中引用方式如下:

debugImplementation files('libs/stilib-debug.aar')

错误日志

java.lang.ClassCastException: com.example.app.sti.DaggerApp_HiltComponents_SingletonC$FragmentCImpl cannot be cast to com.example.app.stilib.ui.dialog.kyc.BenefitsDialog_GeneratedInjector
                                                                                                        at com.example.app.stilib.ui.dialog.kyc.Hilt_BenefitsDialog.inject(Hilt_BenefitsDialog.java:102)
                                                                                                        at com.example.app.stilib.ui.dialog.kyc.Hilt_BenefitsDialog.onAttach(Hilt_BenefitsDialog.java:52)
                                                                                                        at androidx.fragment.app.Fragment.onAttach(Fragment.java:1881)
                                                                                                        at androidx.fragment.app.DialogFragment.onAttach(DialogFragment.java:466)
                                                                                                        at com.example.app.stilib.ui.dialog.kyc.Hilt_BenefitsDialog.onAttach(Hilt_BenefitsDialog.java:39)
                                                                                                        at com.example.app.stilib.ui.dialog.kyc.Hilt_BenefitsDialog.onAttach(Hilt_BenefitsDialog.kt:90)
                                                                                                        at androidx.fragment.app.Fragment.performAttach(Fragment.java:3063)
                                                                                                        at androidx.fragment.app.FragmentStateManager.attach(FragmentStateManager.java:464)
                                                                                                        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:254)
                                                                                                        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1899)
                                                                                                        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1823)
                                                                                                        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1760)
                                                                                                        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:547)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:883)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:100)
                                                                                                        at android.os.Looper.loop(Looper.java:214)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7356)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

对话框代码

@AndroidEntryPoint
class BenefitsDialog : BottomSheetDialogFragment() {

companion object {
        fun newInstance(isShowFrom: String): BenefitsDialog {
            val dialog = BenefitsDialog()
            val bundle = Bundle()
            bundle.putString(BenefitsDialog.IS_SHOWN_FROM.name, isShowFrom)
            dialog.arguments = bundle
            return dialog
        }
    }

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = DialogBenefitsBinding.inflate(inflater, container, false)
        return binding?.root
    }

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        dialog?.apply {
            setCanceledOnTouchOutside(false)
            setCancelable(false)
        }
    }

}

Hilt配置

项目级build.gradle

plugins {
    alias(core.plugins.android.app) apply false
    alias(core.plugins.android.library) apply false
    alias(core.plugins.kotlin) apply false
    alias("com.google.dagger.hilt.android:2.44") apply false
}

应用模块build.gradle

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'com.google.dagger.hilt.android'
    id 'com.google.gms.google-services'
    id 'com.google.firebase.crashlytics'
    id 'kotlin-kapt'
}

dependencies {
    implementation 'com.google.dagger:hilt-android:2.44'
    kapt 'com.google.dagger:hilt-compiler:2.44'
}

库模块build.gradle

plugins {
    id 'maven-publish'
    id 'com.android.library'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
    id 'com.google.dagger.hilt.android'
    id 'androidx.navigation.safeargs.kotlin'
}

dependencies {
        implementation 'com.google.dagger:hilt-android:2.44'
        kapt 'com.google.dagger:hilt-compiler:2.44'
    }

buildTypes {
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

已添加的ProGuard规则

# Keep Dependency Injection Framework related classes and methods
    -keep class dagger.hilt.** { *; }
    -keep class javax.inject.** { *; }
    -keep class javax.annotation.** { *; }

# Keep Hilt generated classes
-keep class com.example.app.stilib.Hilt_* {*;}
-keep,allowobfuscation,allowshrinking @dagger.hilt.EntryPoint class *
-keep,allowobfuscation,allowshrinking @dagger.hilt.android.EarlyEntryPoint class *
-keepclasseswithmembers,includedescriptorclasses class * {
   @dagger.internal.InjectedFieldSignature <fields>;
}

# Keep classes generated by Hilt
    -keep class com.example.app.stilib.*Hilt* {
        *;
    }

## Dagger
-keep class dagger.** { *; }
-dontwarn dagger.internal.codegen.**


-keep,allowobfuscation,allowshrinking @dagger.hilt.EntryPoint class *
-keep,allowobfuscation,allowshrinking @dagger.hilt.android.EarlyEntryPoint class *

解决方案

核心问题分析

崩溃的根源是ProGuard混淆了Hilt生成的注入器接口和组件实现类,导致类型转换失败。Hilt会为@AndroidEntryPoint注解的类生成*_GeneratedInjector注入器类,这些类是依赖注入的核心,必须完整保留,不能被混淆或移除。

修正ProGuard规则

在库模块和应用模块的ProGuard规则中补充以下关键配置:

  1. 保留Hilt生成的注入器类
# 保留所有Hilt生成的注入器类
-keep class com.example.app.stilib.**_GeneratedInjector { *; }
  1. 保留Hilt组件相关的内部实现类
# 保留Hilt组件及内部类,避免类型转换异常
-keep class dagger.hilt.android.internal.managers.** { *; }
-keep class com.example.app.stilib.**HiltComponents** { *; }
  1. 确保注解类和Hilt包装类不被混淆
# 保留@AndroidEntryPoint注解的类及Hilt生成的包装类
-keep @dagger.hilt.android.AndroidEntryPoint class com.example.app.stilib.** { *; }
-keep class com.example.app.stilib.Hilt_** { *; }

额外注意事项

  • 库模块的混淆控制:如果库模块本身启用了ProGuard(如debug build开启minifyEnabled),必须在库的ProGuard规则中添加上述配置,确保AAR包中的Hilt相关类未被混淆——若库打包时已混淆这些类,应用端的规则无法恢复。
  • 版本一致性:确保应用模块和库模块使用的Hilt版本完全一致(当前均为2.44,符合要求),版本差异会导致生成的组件类不兼容。
  • 调试阶段优化:若库仅用于内部调试,可暂时关闭库模块debug build的minifyEnabled,减少混淆带来的调试成本。

验证步骤

  1. 更新库模块和应用模块的ProGuard规则。
  2. 重新编译库模块生成新的AAR文件。
  3. 替换应用模块中的旧AAR,执行Clean Project后重新构建运行。

内容的提问来源于stack exchange,提问作者Kalpesh Doru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:01:02