华为设备同时支持GMS与HMS Core时HMS Core运行异常的技术咨询
HMS与GMS核心差异及双服务共存异常解决方案
一、HMS与GMS核心区别
- 服务主体与适配范围:GMS是谷歌推出的安卓基础服务框架,仅在预装谷歌服务的设备上可正常调用,你用到的
FusedLocation、通知推送分别对应GMS的位置服务、Firebase Cloud Messaging能力;HMS Core是华为推出的替代类移动服务框架,仅在搭载HMS Core的设备可用,对应能力为Location Kit、Push Kit,两套服务的接口设计、鉴权逻辑、回调机制完全独立,互不兼容。 - 调度优先级规则:华为设备上如果同时搭载两套服务,系统会根据应用的适配标识、安装来源判定服务调用优先级,从AppGallery下载的适配HMS的应用会被默认优先调度HMS Core能力,若应用内部未做兼容判断,很容易出现服务冲突。
- 权限与配置要求差异:两套服务的调用权限、后台运行规则、开发者后台配置要求完全不互通,GMS要求在谷歌开发者后台配置应用签名、包名信息,HMS则要求在AppGallery完成对应配置,配置不匹配会直接导致服务调用失败。
二、双服务共存场景异常修复方案
你遇到的共存场景异常,本质是应用没有做双服务的兼容调度逻辑,可通过以下方式修复:
- 应用初始化阶段先做服务可用性判断,不要固定只调用HMS能力,参考逻辑如下:
// 检测GMS可用性 val isGmsAvailable = GoogleApiAvailability.getInstance() .isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS // 检测HMS可用性 val isHmsAvailable = HuaweiApiAvailability.getInstance() .isHuaweiMobileServicesAvailable(context) == ConnectionResult.SUCCESS when { isGmsAvailable -> { // GMS可用时优先调用GMS定位、推送接口 initGmsLocation() initGmsNotification() } isHmsAvailable -> { // 仅GMS不可用时调用HMS对应接口 initHmsLocation() initHmsNotification() } else -> { // 两套服务都不可用时调用安卓原生能力兜底 initNativeLocation() initNativeNotification() } }
- 检查你在AppGallery后台配置的应用签名指纹,确认同时包含了测试包和正式包的签名信息,签名不匹配会导致HMS Core鉴权失败,进而出现回调无响应的问题。
- 给定位、推送的回调逻辑增加超时检测和异常捕获,当HMS调用失败时自动降级到GMS或者原生能力,避免功能完全不可用。
内容的提问来源于stack exchange,提问作者Faizan Ahmad
相关产品推荐
相关产品推荐

