Delphi 10.4.2开发Android应用遇ARM TBI报错,如何配置allowNativeHeapPointerTagging?
问题背景
我用Delphi 10.4.2结合FireMonkey开发Android应用,Google Play商店多次反馈以下错误:
Pointer tag for 0x
was truncated, see Android官方关于Tagged Pointers的说明文档。
根据官方说明,错误原因是:
从Android 11开始,在支持ARM Top-byte Ignore (TBI)内核的设备上,64位进程的所有堆分配都会在指针的最高字节中设置一个实现定义的标签。任何修改该标签的应用在释放内存时会被终止,这是为未来支持ARM Memory Tagging Extension (MTE)的硬件做准备。
尝试添加过渡补丁android:allowNativeHeapPointerTagging="false"到AndroidManifest.xml的<application>标签时,Delphi抛出错误:
[PAClient Fehler] Fehler: E6408 D:\Loggy\Android64\Release\Loggy\AndroidManifest.xml:15: error: attribute android:allowNativeHeapPointerTagging not found.
解决android:allowNativeHeapPointerTagging属性找不到的问题
确认Android SDK版本
该属性是Android API 30(对应Android 11)才引入的,Delphi 10.4.2默认绑定的SDK版本可能低于30。需完成以下操作:- 打开SDK Manager,下载安装API 30及以上的SDK平台
- 在Delphi的项目选项 -> Android -> SDK中,将目标SDK版本设置为API 30或更高
正确添加属性(避免手动修改生成的Manifest)
Delphi会自动覆盖手动修改的AndroidManifest.xml,正确做法是:- 打开项目目录下的
AndroidManifest.template.xml文件 - 在
<application>标签内添加属性:android:allowNativeHeapPointerTagging="false" - 保存后重新编译部署,Delphi会基于模板生成正确的Manifest文件
- 打开项目目录下的
匹配Build Tools版本
确保项目选项中Android -> SDK里的Build Tools版本与API 30对应(比如30.0.3),避免版本不兼容导致的属性识别失败
关于删除评论的恢复及堆违规排查提示
- 已删除的Stack Exchange评论,普通用户无法自行恢复。可尝试直接@Remy Lebeau,询问他是否记得相关评论内容或类似问题的解决方案;也可搜索他发布的关于Delphi Android内存管理、堆违规的回答,可能找到相关提示。
- 堆违规模块排查方向:
- 检查第三方库或自定义Native代码是否存在直接操作指针最高字节的逻辑
- 启用Delphi的FastMM内存检测工具,在调试模式下捕捉内存操作异常
- 排查是否有指针类型转换错误(比如32位指针强制转64位时破坏标签位)
内容的提问来源于stack exchange,提问作者Peter Kloß

