华为设备HMS初始化时HMSPackageManager报DeadSystemException崩溃
问题根因
这个崩溃是旧版HMS Core SDK的已知缺陷,触发点在HMS SDK自初始化的版本校验环节:SDK内部调用PackageManager.queryIntentServices查询HMS服务信息时,没有对DeadSystemException做捕获兜底。当系统出现内存紧张回收进程、HMS Core后台更新重启、系统服务binder链路临时断裂的场景时,PackageManager调用就会抛出该异常,而SDK内部逻辑跑在独立的HandlerThread上,没有异常保护,直接导致应用闪退。
该问题和Android系统版本无关,确实仅在搭载HMS Core的华为设备上复现,非华为设备不会触发HMS SDK自初始化流程,因此不会出现这类崩溃。即使业务代码没有主动调用HMS相关接口,SDK默认的自初始化逻辑也会自动执行该查询流程。
修复方案
按落地成本和效果优先级排序:
- 优先升级所有HMS Core相关依赖到最新稳定版:华为在6.2.0.300及之后版本的SDK中已经给该查询逻辑补充了异常捕获,升级后可以直接修复问题,检查项目下所有
com.huawei.hms分组的依赖,统一升级到最新正式版本即可。 - 暂时无法升级SDK的场景,可以加全局异常拦截兜底:在Application的
attachBaseContext阶段注册自定义未捕获异常处理器,识别堆栈来自HMS、异常链包含DeadSystemException的场景直接拦截,不需要执行闪退逻辑。参考实现代码:
// 先持有系统默认的异常处理器 private Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { if (isHmsDeadSystemException(throwable)) { // HMS触发的系统服务死亡异常属于偶发问题,拦截即可,下次启动可恢复正常 return; } // 其余异常交给默认处理器处理 defaultHandler.uncaughtException(thread, throwable); }); } private boolean isHmsDeadSystemException(Throwable throwable) { if (throwable == null) return false; // 遍历异常链判断是否包含DeadSystemException Throwable cur = throwable; boolean hasDeadSystemEx = false; while (cur != null) { if (cur instanceof android.os.DeadSystemException) { hasDeadSystemEx = true; break; } cur = cur.getCause(); } if (!hasDeadSystemEx) return false; // 校验异常堆栈是否归属HMS SDK for (StackTraceElement element : throwable.getStackTrace()) { if (element.getClassName().startsWith("com.huawei.hms")) { return true; } } return false; }
- 如果项目本身没有用到任何HMS Core能力,可以直接移除HMS相关依赖彻底规避问题。注意部分第三方SDK(推送、支付、地图类居多)会间接传递引入HMS依赖,这种情况可以在gradle中配置排除传递依赖:
implementation('com.example:third-party-sdk:1.0.0') { exclude group: 'com.huawei.hms' }
补充说明
DeadSystemException本身是系统服务临时不可用的偶发异常,即使不做处理,用户下次冷启动应用时绝大多数场景都能正常运行,不需要额外加业务兼容逻辑,只要做好拦截避免闪退即可。
内容的提问来源于stack exchange,提问作者pilot
相关产品推荐
相关产品推荐

