@AndroidEntryPoint Activity未绑定@HiltAndroidApp的罕见异常排查
我们在使用Hilt 2.44版本时遇到以下问题:
- 几十万活跃用户中仅约40人触发,无法复现,但同一用户多次触发(事件数约为受影响用户数的8倍)
- 崩溃发生在启动Activity,Hilt配置无问题
- 抛出异常:
java.lang.IllegalStateException: Hilt Activity must be attached to an @HiltAndroidApp Application. Did you forget to specify your Application's class name in your manifest's <application />'s android:name attribute? - 异常来自
dagger.hilt.android.internal.managers.ActivityComponentManager的createComponent方法,核心判定条件!(activity.getApplication() instanceof GeneratedComponentManager)成立,怀疑activity.getApplication()返回的并非标注@HiltAndroidApp的真实Application类。
以下是该异常可能的触发原因:
厂商ROM定制化导致Application实例异常
部分定制化ROM(尤其是低版本Android系统)在极端场景下(如内存紧张后重启应用),可能跳过自定义Application的加载,直接使用系统默认的Application实例。这种情况会导致getApplication()返回的对象不实现GeneratedComponentManager接口,触发异常。多进程配置遗漏
如果应用包含多进程,且某个进程的Manifest配置中未正确设置android:name指向标注@HiltAndroidApp的Application类,当启动Activity运行在该进程时,getApplication()会返回该进程的默认Application实例,不符合Hilt的要求。需检查所有进程对应的<application>标签配置。第三方框架的代理/字节码修改干扰
性能监控、热修复、插件化等第三方框架可能通过代理模式或字节码修改替换Application实例。如果代理类未实现GeneratedComponentManager接口,就会导致Hilt判定失败。需排查近期引入的相关依赖,确认是否存在此类冲突。启动阶段初始化顺序异常
应用启动逻辑复杂、存在大量异步初始化任务时,可能出现Activity初始化先于自定义Application完成的极端情况。此时activity.getApplication()可能还未指向正确的实例,触发Hilt的校验逻辑。系统资源耗尽时的异常处理
设备处于低内存、系统资源紧张状态时,Android系统可能会简化应用启动流程,跳过自定义Application的部分初始化步骤,导致返回默认Application实例,触发崩溃。
内容的提问来源于stack exchange,提问作者Droidman

