React Native中重复访问Blob内容URI偶现“Blob not found”异常的排查求助
React Native中重复访问Blob内容URI偶现“Blob not found”异常的排查求助
大家好,我们团队在基于React Native 0.75.2开发的项目中,遇到了一个关于Blob内容URI的偶现问题,折腾了两周还没找到根因,想向各位大佬求助排查思路。
我们的Blob处理流程
我们的应用里所有附件都通过Blob/内容URI管理,不直接使用外部URL,具体流程是:
- 用
XMLHttpRequest从后端获取二进制文件 - 拿到完整二进制数据后,调用
URL.createObjectURL生成内容URI(示例:content://com.gaia.blob/d7809c88-a0e7-4fe6-b049-68d9154d8794?offset=0&size=59301) - 将这个URI传给展示组件(比如RN的
Image组件)
这套流程在Web版(React框架)里运行完全正常,我们还会在确定不再需要Blob时调用revokeObjectURL释放资源,但RN不支持这个API,所以RN端没做资源释放操作。
问题现象
首次将内容URI传给组件展示时完全没问题,但后续在某些场景下再次访问这个URI(比如执行下载、分享、用系统应用打开等操作),偶尔会抛出以下异常:
[13:22:21.245Z][Console] [java.io.FileNotFoundException: Cannot open content://com.gaia.blob/d7809c88-a0e7-4fe6-b049-68d9154d8794?offset=0&size=59301, blob not found.]
最棘手的是这个问题无法稳定复现:有时候用户打开并关闭底部弹窗后,重复操作2-3次才会触发;有时候第一次操作就失败;切换页面再返回操作也可能触发,完全找不到明确的触发规律。
已做的排查工作
- 查看RN源码发现,
react-native/Libraries/Blob/Blob.js的第135行有个close方法,作用就是回收Blob资源,但我们给这个方法加了日志后,确认整个流程中它从未被调用过。 - Logcat里偶尔会出现这条警告,但不确定是否和当前问题相关:
2024-11-19 13:58:32.739 12664-12672 System com.gaia W A resource failed to call close.
- 我们猜测可能是Hermes的垃圾回收机制把二进制数据回收了,但目前没有证据支撑这个猜想。
核心疑问
现在我们卡在了排查方向上,想请教大家:
- 有没有办法验证Hermes是否真的回收了对应的二进制Blob数据?
- 是否可以调整Hermes的GC行为(比如修改回收时机、资源保留规则等)?
如果需要我们提供特定代码片段,我们可以尝试提取,但由于项目是闭源的,无法提供完整可复现的Demo,非常抱歉。
备注:内容来源于stack exchange,提问作者Artemios Antonio Balbach
相关产品推荐
相关产品推荐

