You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Maps所有含地图页面崩溃 报Bitmap.getWidth()空指针异常

崩溃根本原因

这个闪退是Google Maps Android SDK渲染层抛出的空指针异常,堆栈里的dynamite_mapsdynamite@21.48.15说明问题出在21.48.15版本的Google Maps动态加载模块,触发逻辑是SDK的GL渲染线程加载纹理资源时,拿到了空的Bitmap对象,未做非空判断直接调用getWidth()获取尺寸导致崩溃。
常见触发场景有三类:

  • 业务代码给地图Marker、地面覆盖物、自定义瓦片层设置自定义图标时,传入了基于空Bitmap、已回收Bitmap生成的BitmapDescriptor,比如异步加载图片未完成就提前设置图标、Bitmap被系统/图片框架回收后未重新加载就传给SDK
  • 21.48.15版本的Maps Dynamite模块本身存在容错缺陷,之前版本遇到空资源会静默降级为默认图标,该版本会直接在GL线程抛出异常,常规的全局异常捕获也拦不住GL线程的崩溃
  • 低内存场景下应用切后台,系统回收了Maps SDK内部缓存的纹理Bitmap,回到地图页面时SDK未触发资源重加载,直接拿空缓存渲染
修复方案

按优先级落地以下措施即可解决:

  • 所有传给Maps SDK的Bitmap资源增加合法性校验
    生成BitmapDescriptor之前必须同时满足两个条件:Bitmap实例非空、bitmap.isRecycled()返回false,校验不通过时直接降级使用SDK默认图标,绝对不要传空资源。示例代码:
    // 给Marker设置图标的安全封装
    fun setMarkerIconSafely(marker: Marker, targetBitmap: Bitmap?) {
        val validIcon = if (targetBitmap != null && !targetBitmap.isRecycled) {
            BitmapDescriptorFactory.fromBitmap(targetBitmap)
        } else {
            // 降级为默认红色Marker,禁止传null
            BitmapDescriptorFactory.defaultMarker()
        }
        marker.setIcon(validIcon)
    }
    
    如果是网络加载的图片做Marker图标,必须等图片加载成功回调里拿到合法Bitmap后再设置图标,不要提前传空占位。
  • 规避存在缺陷的SDK版本
    如果你在build.gradle中固定依赖了Maps SDK版本,直接升级到22.0.0及以上的官方稳定版,避开21.48.x的问题版本段。如果是依赖Google Play服务动态加载Maps模块的场景,可以在地图初始化前检测设备上的Maps Dynamite模块版本,命中21.48.15版本时临时关闭自定义图标渲染,或引导用户更新Google Play服务。
  • 补全生命周期资源兜底
    在地图所在页面的onResume生命周期回调中,检查所有已添加到地图上的Marker、覆盖物对应的Bitmap资源,如果资源已被回收则重新加载刷新。如果项目中用了Glide、Coil等带自动回收机制的图片框架,不要把框架内部管理的Bitmap直接传给Maps SDK,建议拷贝一份独立的Bitmap传入,在Marker移除、页面销毁时手动回收该Bitmap,避免被框架提前回收。
    不要尝试用反射修改SDK内部类规避问题,Maps Dynamite模块是Google动态下发的,混淆规则和类结构随版本变动,反射方案兼容性极差。

内容的提问来源于stack exchange,提问作者Harsh Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 12:24:59