Cloud Firestore(24.10.0)内部错误:CursorWindowAllocationException求助
解决Cloud Firestore的CursorWindowAllocationException错误
我的应用已发布2年,从发布首日起就罕见但持续收到如下错误提示:Internal error in Cloud Firestore (24.10.0) - android.database.CursorWindowAllocationException: Cursor window allocation。错误显示为“Internal Error”,不确定这是否是Firebase的bug,也不清楚能否自行处理。
Firebase依赖配置
implementation platform('com.google.firebase:firebase-bom:32.7.0') implementation 'com.google.firebase:firebase-analytics' implementation 'com.google.firebase:firebase-auth' implementation 'com.google.firebase:firebase-firestore' implementation 'com.google.firebase:firebase-crashlytics' implementation 'com.google.firebase:firebase-appcheck-playintegrity' implementation 'com.google.firebase:firebase-appcheck-debug'
完整堆栈跟踪
Fatal Exception: java.lang.RuntimeException: Internal error in Cloud Firestore (24.10.0). at com.google.firebase.firestore.util.AsyncQueue.lambda$panic$3(AsyncQueue.java:545) at android.os.Handler.handleCallback(Handler.java:907) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:216) at android.app.ActivityThread.main(ActivityThread.java:7625) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Caused by java.lang.RuntimeException: android.database.CursorWindowAllocationException: Cursor window allocation of 2097152 bytes failed. at com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor.lambda$executeAndReportResult$1(AsyncQueue.java:333) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor$DelayedStartFactory.run(AsyncQueue.java:235) at java.lang.Thread.run(Thread.java:784)
Caused by android.database.CursorWindowAllocationException: Cursor window allocation of 2097152 bytes failed. at android.database.CursorWindow.<init>(CursorWindow.java:136) at android.database.CursorWindow.<init>(CursorWindow.java:114) at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198) at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143) at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:137) at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:220) at android.database.AbstractCursor.moveToNext(AbstractCursor.java:269) at com.google.firebase.firestore.local.SQLitePersistence$Query.forEach(SQLitePersistence.java:493) at com.google.firebase.firestore.local.SQLiteRemoteDocumentCache.getAll(SQLiteRemoteDocumentCache.java:143) at com.google.firebase.firestore.local.LocalStore.lambda$writeLocally$2(LocalStore.java:248) at com.google.firebase.firestore.local.SQLitePersistence.runTransaction(SQLitePersistence.java:228) at com.google.firebase.firestore.local.LocalStore.writeLocally(LocalStore.java:240) at com.google.firebase.firestore.core.SyncEngine.writeMutations(SyncEngine.java:286) at com.google.firebase.firestore.core.FirestoreClient.lambda$write$12(FirestoreClient.java:233) at com.google.firebase.firestore.util.AsyncQueue.lambda$enqueue$2(AsyncQueue.java:444) at com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor.lambda$executeAndReportResult$1(AsyncQueue.java:330) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor$DelayedStartFactory.run(AsyncQueue.java:235) at java.lang.Thread.run(Thread.java:784)
可行的修复措施
1. 升级Firebase依赖版本
当前使用的BOM版本32.7.0对应的Firestore 24.10.0存在已知的CursorWindow内存分配问题。建议升级到最新稳定版Firebase BOM,新版本会修复底层SQLite操作的内存管理缺陷:
implementation platform('com.google.firebase:firebase-bom:33.1.0')
其他Firebase依赖无需单独指定版本,BOM会自动管理所有库的兼容版本。
2. 优化Firestore本地缓存
错误源于Firestore读取本地SQLite缓存时无法分配2MB的CursorWindow,通常是缓存文档过多或单文档体积过大导致:
- 在合适时机调用
FirebaseFirestore.getInstance().clearPersistence()清理本地缓存,比如应用启动时或用户主动触发,但注意这会导致下次启动需重新同步数据; - 通过
FirestoreSettings限制缓存大小,避免无限增长:FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() .setCacheSizeBytes(100 * 1024 * 1024) // 设置为100MB,可根据需求调整 .build(); FirebaseFirestore.getInstance().setFirestoreSettings(settings);
3. 拆分批量写入操作
堆栈显示错误发生在写入操作的本地持久化阶段,若应用存在批量写入大量文档的场景,拆分操作分批次执行,避免一次性触发大量SQLite操作导致内存压力过载。
4. 监控设备内存状态
低内存设备更容易触发该问题,可在应用中添加内存监控,当设备内存不足时,暂停非必要的Firestore操作,或提示用户清理存储空间。
5. 反馈给Firebase官方
若升级依赖和应用层面优化后问题仍存在,可将完整崩溃日志、设备信息(Android版本、型号)提交给Firebase支持,确认是否为未修复的底层bug。
内容的提问来源于stack exchange,提问作者Adam Varhegyi
相关产品推荐
相关产品推荐

