升级HERE SDK 3.18后生产环境Preconditions.java报NullPointerException异常
HERE SDK 3.18版本release包空指针崩溃排查方案
问题场景
我们使用Firebase Crashlytics监控生产环境崩溃情况,自升级至3.18版本后,仅在生产环境release包出现如下错误,开发环境从未复现。调用init方法前已做非空校验,可确认问题出自HERE SDK源代码。
错误堆栈
Fatal Exception: java.lang.NullPointerException: Context is null at java.util.Objects.requireNonNull(Objects.java:228) at com.nokia.maps.f4.a(Preconditions.java:1) at com.nokia.maps.v.<init>(AppContextImpl.java:13) at com.here.android.mpa.common.ApplicationContext.<init>(ApplicationContext.java:2) at com.here.android.mpa.mapping.AndroidXMapFragment.init(AndroidXMapFragment.java:1) at my.package.app.fragments.navegacionhere.MapFragmentView.initMapFragment(MapFragmentView.java:538) at my.package.app.fragments.navegacionhere.MapFragmentView.<init>(MapFragmentView.java:160) at my.package.app.activity.llamadas.DetalleLlamadaActivity.setupMapFragmentView(DetalleLlamadaActivity.java:1339)
根因分析
- 该问题为HERE SDK 3.18版本特有缺陷,仅在开启混淆的release包触发:混淆会裁剪掉SDK内部预定义的非空校验逻辑,导致Context传递链路断裂
- SDK内部
AppContextImpl初始化时,直接对持有的弱引用Context做强制非空校验,当页面重建、应用后台切前台导致页面Context临时被回收时,没有兜底逻辑,直接抛出空指针
修复方案
- 新增混淆规则:在项目的
proguard-rules.pro文件中添加HERE SDK专属保留规则,避免内部类被混淆裁剪:
# 保留HERE SDK所有内部类不被混淆 -keep class com.here.** { *; } -keep class com.nokia.maps.** { *; } -dontwarn com.here.** -dontwarn com.nokia.maps.**
- 调整初始化时机:将
AndroidXMapFragment.init方法的调用时机从MapFragmentView构造方法中后移到Fragment的onViewCreated生命周期阶段,确保此时Fragment已经成功绑定Activity,Context不会为空 - 添加上层兜底逻辑:调用init方法时优先取Fragment关联的Activity Context,如Context为空则传入应用全局ApplicationContext进行初始化,ApplicationContext生命周期与应用一致,不会出现空值问题
内容的提问来源于stack exchange,提问作者dariovaz
相关产品推荐
相关产品推荐

