Android 高德地图崩溃:Pointer tag was truncated

1 阅读1分钟

Android 高德地图崩溃:Pointer tag was truncated

环境

  • 设备:Android 16+、HyperOS
  • 最低系统环境:Android 11(API 30)以上 64 位设备
  • 高德地图com.amap.api:3dmap:9.8.3

错误

Abort message: 'Pointer tag for <addr> was truncated, see 'https://source.android.com/devices/tech/debug/tagged-pointers'.'

#00 libc.so (abort+156)
#01 libc.so (free+104)
#02 libAMapSDK_MAP_v9_8_3.so
...
#16 libAMapSDK_MAP_v9_8_3.so (Java_com_autonavi_base_ae_gmap_GLMapEngine_nativeDestroy+72)
#19 com.autonavi.base.ae.gmap.GLMapEngine.destroyAMapEngine
#21 com.amap.api.col.3l.cb.destroySurface
#25 android.opengl.GLSurfaceView$GLThread.guardedRun

关键错误:

Pointer tag was truncated

崩溃发生在高德地图执行 nativeDestroy 销毁地图引擎时,Native 层调用 free() 释放内存触发 Bionic 检查。

原因

Android 11 开始,64 位 ARM 设备支持 Native Heap Pointer Tagging,利用 64 位指针高位保存 Tag。旧版 Native SDK 在进行指针运算、转换或内存管理时可能丢失 Pointer Tag,之后将异常指针传给 free(),Bionic 检测到 Tag 被截断后直接执行 abort

高德 Native SDK
→ 指针 Tag 被截断
→ nativeDestroy
→ free()
→ Bionic 检测异常
→ abort

从堆栈看,问题集中在:

libAMapSDK_MAP_v9_8_3.so
→ GLMapEngine.nativeDestroyfree()

因此属于高德地图 9.8.3 Native 库与 Android Native Heap Pointer Tagging 的兼容问题。

解决

AndroidManifest.xml<application> 中关闭 Native Heap Pointer Tagging:

<application
    ...
    android:allowNativeHeapPointerTagging="false">
</application>

重新安装应用后生效。

该配置绕过 Pointer Tagging 检查,适合处理无法立即升级或修改的第三方 Native SDK 兼容问题;长期仍应优先升级存在兼容问题的 Native SDK。