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

未使用SQLite的Flutter Android应用出现SQLiteDiskIOException问题排查

问题分析:未直接使用SQLite却出现SQLiteDiskIOException(SQLITE_IOERR_SHMSIZE)

我开发的一款面向Android平台的Flutter应用已上线运行一段时间,近日在Android 11系统的SDMC TV设备上,Firebase Crashlytics捕获到如下致命异常:

Fatal Exception: android.database.sqlite.SQLiteDiskIOException
disk I/O error (code 4874 SQLITE_IOERR_SHMSIZE): , while compiling: PRAGMA journal_mode

奇怪的是,我的应用完全没有使用SQLite数据库,仅使用了Hive。以下是我使用的依赖包列表:

app_install_date: ^0.1.3
carousel_slider: ^4.2.1
encrypt: ^5.0.3
firebase_analytics: ^10.7.4
firebase_core: ^2.24.2
firebase_crashlytics: ^3.4.8
flutter_local_notifications: ^16.2.0
flutter_svg: ^2.0.9
flutter_timezone: ^1.0.8
google_mobile_ads: ^4.0.0
hive: ^2.2.3
hive_flutter: ^1.1.0
in_app_purchase: ^3.1.11
in_app_review: ^2.0.8
intl: ^0.18.1
json_annotation: ^4.8.1
json_serializable: ^6.7.1
just_audio: ^0.9.36
lottie: ^2.7.0
numberpicker: ^2.1.2
path_provider: ^2.1.1
provider: ^6.1.1
wakelock_plus: ^1.1.4


可能的原因分析

1. 第三方依赖间接调用SQLite

你没有直接集成SQLite,但部分依赖的Android底层实现会默认使用SQLite:

  • Firebase系列依赖:firebase_analytics和firebase_crashlytics会在本地用SQLite存储事件日志、崩溃缓存,等待网络同步。
  • flutter_local_notifications:Android端的通知库需要SQLite存储调度通知、通知历史等元数据。
  • in_app_purchase:Google Play Billing的底层实现依赖SQLite缓存购买记录。

这些依赖会在初始化或运行时自动创建SQLite数据库,而SDMC TV的特殊环境触发了I/O错误。

2. SQLITE_IOERR_SHMSIZE错误的核心原因

错误码4874对应SQLITE_IOERR_SHMSIZE,本质是SQLite尝试分配共享内存区域时失败,常见场景:

  • 设备剩余存储空间不足,无法容纳SQLite的日志文件或共享内存映射。
  • SDMC TV的定制系统对应用的共享内存配额做了严格限制,低于SQLite的需求值。
  • 存储介质(如内置闪存)存在硬件或驱动异常,导致I/O操作失败。

3. Android 11存储权限与TV设备的适配问题

Android 11的Scoped Storage限制了应用的存储访问范围,虽然你用path_provider获取了合法目录,但部分依赖可能在TV设备的特殊目录下创建数据库,或者系统目录的权限配置异常,导致读写失败。

4. SDMC TV的定制化系统限制

SDMC TV通常是深度定制的Android系统,可能存在:

  • 存储分区过小,剩余空间不足以支撑SQLite的临时文件创建。
  • 系统对应用的内存/存储配额做了额外限制,导致SQLite无法初始化共享内存。
  • 底层存储驱动存在bug,处理SQLite的I/O操作时触发异常。

排查建议

  • 检查出现问题的SDMC TV设备剩余存储容量,确认是否因空间不足触发错误。
  • 排查依赖包的更新日志,尝试升级flutter_local_notifications、Firebase SDK等可能涉及SQLite的依赖到最新版本。
  • 在同型号SDMC TV上复现问题,观察应用启动、触发通知、上报分析数据等操作时是否出现崩溃。
  • 针对依赖的SQLite操作,若允许添加全局异常捕获,避免致命崩溃影响应用运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:01:07