未使用Tilt却触发Google Maps SDK NaN值崩溃,求排查方向
崩溃异常信息
Exception java.lang.IllegalArgumentException: 倾斜角(Tilt)必须介于0到90之间(包含边界值):NaN
at m.nq.c(:com.google.android.gms.dynamite_mapsdynamite@233614037@23.36.14(150400-0):10)
at com.google.android.gms.maps.model.CameraPosition.(:com.google.android.gms.dynamite_mapsdynamite@233614037@23.36.14(150400-0):35)
at com.google.android.gms.maps.model.d.a(:com.google.android.gms.dynamite_mapsdynamite@233614037@23.36.14(150400-0):3)
at com.google.maps.api.android.lib6.gmm6.api.d.b(:com.google.android.gms.dynamite_mapsdynamite@233614037@23.36.14(150400-0):15)
at com.google.maps.api.android.lib6.gmm6.api.a.run(:com.google.android.gms.dynamite_mapsdynamite@233614037@23.36.14(150400-0):13)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:8010)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
可能的触发原因
SDK内部状态异常
即使未主动设置Tilt参数,Maps SDK在场景恢复(如应用前后台切换、配置变更重建)时,可能尝试加载之前存储的相机状态。如果该状态中的Tilt值因内部逻辑漏洞被篡改或初始化为NaN,就会触发参数校验异常。18.1.0版本的SDK存在此类已知的内部参数初始化问题。间接相机操作的意外修改
调用moveCamera()、animateCamera()等相机API时,传入的CameraUpdate对象可能被全局逻辑(如自定义包装类、拦截器)意外修改,注入了NaN的Tilt值。即使使用newLatLngZoom()这类看似不涉及Tilt的方法,也可能受全局修改逻辑影响。相机状态序列化/反序列化错误
如果应用存在保存相机状态到本地存储(SharedPreferences、数据库)的逻辑,读取时可能因数据损坏、类型转换错误导致Tilt值变为NaN,恢复状态时传入SDK触发异常。第三方库或混淆干扰
集成的第三方地图相关插件(如路线规划、标记工具)可能内部调用相机参数设置,不慎传入NaN值。此外,ProGuard混淆配置错误可能破坏SDK内部相机参数类的结构,导致参数值异常。设备传感器或系统异常
部分设备的陀螺仪等传感器故障,会导致SDK处理倾斜手势时读取到无效数据,计算出NaN的Tilt值;系统内存不足时,SDK内部的相机参数对象可能被破坏,引发Tilt值异常。
排查建议
- 检查应用中保存/恢复相机状态的逻辑,验证存储的Tilt值是否在合法范围内。
- 排查所有涉及
CameraUpdate的代码,确认无意外修改Tilt参数的逻辑。 - 尝试升级Maps SDK至最新稳定版本,修复已知的内部参数漏洞。
- 临时禁用地图的倾斜手势,观察异常是否复现。
- 检查ProGuard配置,确保
com.google.android.gms.maps相关类未被错误混淆。
内容的提问来源于stack exchange,提问作者djdance

