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

Android14+新架构下,PDF加载因CacheDir临时文件ENOENT崩溃

React Native PDF 在Android14新架构下缓存加载崩溃问题

环境信息

包/系统项版本
react-native-pdf7.0.4
react-native-blob-util0.23.2
react-native0.82.1
Android14 (API 34)
新架构已启用 (newArchEnabled=true)
minSdkVersion34

问题描述

使用以下代码加载远程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-util Android14 下的ENOENT问题
  • RN 0.76+版本上TurboModules/新架构的文件系统时序问题

内容的提问来源于stack exchange,提问作者Siddhant Shelake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 00:03:10