Firebase Crashlytics报Google Maps空指针崩溃,手动测试仅告警
Google Maps相关NullPointerException崩溃排查方案
问题概述
Firebase Crashlytics捕获到Google Maps相关的NullPointerException崩溃,但本地手动测试仅出现告警,核心功能无异常。更新com.google.android.gms:play-services后问题依旧,且崩溃涉及不同版本的Play Services。
崩溃日志分析
崩溃触发于系统低内存回收流程(onLowMemory/onTrimMemory),SupportMapFragment处理低内存事件时,调用了一个空接口对象的方法,属于Google Maps Dynamite模块内部的逻辑问题:
Fatal Exception: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.impl.br.v()' on a null object reference at com.google.maps.api.android.lib6.impl.co.h(:com.google.android.gms.dynamite_mapsdynamite@224312037@22.43.12 (150400-0)) at com.google.android.gms.maps.internal.o.ba(:com.google.android.gms.dynamite_mapsdynamite@224312037@22.43.12 (150400-0):15) at ey.onTransact(:com.google.android.gms.dynamite_mapsdynamite@224312037@22.43.12 (150400-0):4) at android.os.Binder.transact(Binder.java:1046) at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@18.1.0:2) at com.google.android.gms.maps.internal.zzk.onLowMemory(com.google.android.gms:play-services-maps@@18.1.0:2) at com.google.android.gms.maps.zzau.onLowMemory(com.google.android.gms:play-services-maps@@18.1.0:1) at com.google.android.gms.dynamic.DeferredLifecycleHelper.onLowMemory(com.google.android.gms:play-services-base@@18.0.1:1) at com.google.android.gms.maps.SupportMapFragment.onLowMemory(com.google.android.gms:play-services-maps@@18.1.0:1) at androidx.fragment.app.Fragment.performLowMemory(Fragment.java:3223) at androidx.fragment.app.FragmentManager.dispatchLowMemory(FragmentManager.java:3006) ...
本地告警日志分析
本地测试的SecurityException属于配置问题,是Google证书验证失败导致Consent Verifier无法更新快照,和崩溃无直接关联:
Unable to update local snapshot for com.google.android.libraries.consentverifier#com.app.package, may result in stale flags. java.util.concurrent.ExecutionException: java.lang.SecurityException: GoogleCertificatesRslt: not allowed: pkg=com.app.package, sha256=[e8173febe247a2e7243253c1ef9ce437fc2d0b4fabffef1ae063e706303f297c], atk=false, ver=224312044.true (go/gsrlt) ... Caused by: java.lang.SecurityException: GoogleCertificatesRslt: not allowed: pkg=com.app.package, sha256=[e8173febe247a2e7243253c1ef9ce437fc2d0b4fabffef1ae063e706303f297c], atk=false, ver=224312044.true (go/gsrlt)
解决方案
1. 捕获低内存场景的异常
自定义Fragment包装SupportMapFragment,重写低内存相关方法捕获内部空指针:
class SafeSupportMapFragment : SupportMapFragment() { override fun onLowMemory() { try { super.onLowMemory() } catch (e: NullPointerException) { Log.w("SafeMapFragment", "Google Maps onLowMemory NPE caught", e) } catch (e: Exception) { Log.w("SafeMapFragment", "Google Maps onLowMemory exception caught", e) } } override fun onTrimMemory(level: Int) { try { super.onTrimMemory(level) } catch (e: NullPointerException) { Log.w("SafeMapFragment", "Google Maps onTrimMemory NPE caught", e) } catch (e: Exception) { Log.w("SafeMapFragment", "Google Maps onTrimMemory exception caught", e) } } }
将布局中的SupportMapFragment替换为该自定义Fragment。
2. 单独升级Play Services Maps版本
跳过整体play-services更新,直接指定play-services-maps的最新稳定版:
implementation 'com.google.android.gms:play-services-maps:18.2.0' // 替换为当前最新稳定版
Google后续版本可能修复了低内存回收时的空指针问题。
3. 优化Fragment生命周期管理
- 在
onDestroyView中清空GoogleMap及相关引用:
override fun onDestroyView() { super.onDestroyView() mapView?.onDestroy() googleMap = null // 清空GoogleMap实例引用 }
- 避免在Fragment销毁后仍持有Map相关对象引用。
4. 解决本地告警的配置问题
在Google Cloud Console中:
- 确认应用包名
com.app.package已正确注册 - 将本地测试签名的SHA256指纹添加到API密钥的允许列表中
该操作仅解决本地告警,不影响崩溃修复。
总结
该崩溃是Google Maps Dynamite模块在低内存场景下的内部空指针问题,通过自定义Fragment捕获异常、升级Maps库版本、优化生命周期管理可有效解决。本地告警属于签名配置问题,需补充Cloud Console中的签名信息。
内容的提问来源于stack exchange,提问作者alx_gord
相关产品推荐
相关产品推荐

