Android14+新架构下,PDF加载因CacheDir临时文件ENOENT崩溃
React Native PDF 在Android14新架构下缓存加载崩溃问题
环境信息
| 包/系统项 | 版本 |
|---|---|
react-native-pdf | 7.0.4 |
react-native-blob-util | 0.23.2 |
react-native | 0.82.1 |
| Android | 14 (API 34) |
| 新架构 | 已启用 (newArchEnabled=true) |
minSdkVersion | 34 |
问题描述
使用以下代码加载远程PDF时:
<Pdf source={{ uri: 'https://example.com/doc.pdf', cache: true, }} />
在开启新架构的Android14设备上,应用会崩溃。失败表现为未处理的Promise拒绝,绕过了this.lastRNBFTask上绑定的.catch()处理器,且错误从未传递到组件的onError属性。
控制台错误
Uncaught (in promise, id: 0): Error: /data/user/0/<package>/cache/<sha1>.pdf.tmp: open failed: ENOENT (No such file or directory)
复现步骤
- 开启新架构:
newArchEnabled=true - 将目标Android版本设置为14(
API 34) - 渲染上述
<Pdf>组件 - 在以下场景打开对应页面:
- 全新安装应用后
- 从Android设置清除应用缓存后
预期行为
- PDF成功加载
- 若加载失败,错误应通过
onError属性传递
实际行为
CacheDir内的.pdf.tmp文件触发ENOENT错误,导致未处理的Promise拒绝。错误绕过库的错误处理逻辑,表现为全局未处理拒绝,且onError回调从未被调用。
额外上下文
CacheDir路径解析正常- 生成的临时文件路径格式合法
- 文件打开/读取操作执行时,目标文件不存在
- 仅在开启新架构的Android14设备上可稳定复现
- Android13及以下版本无此问题
- 关闭新架构后无此问题
可能根因
这似乎是Android14开启新架构时,缓存/临时文件流程中存在竞争条件。CacheDir内的.pdf.tmp文件在物理创建完成前(或被系统重建/清理时)就被访问,导致react-native-blob-util抛出ENOENT错误。该Promise拒绝在react-native-pdf将其转发到onError之前就脱离了Promise链。
相关关联问题
react-native-blob-utilAndroid14 下的ENOENT问题- RN 0.76+版本上TurboModules/新架构的文件系统时序问题
内容的提问来源于stack exchange,提问作者Siddhant Shelake
相关产品推荐
相关产品推荐

