在我的 android 应用程序中,我使用 Room 和 sqlcipher 库进行加密/解密。我经常在 Crashlytic 中看到以下崩溃:
java.util.concurrent.TimeoutException:net.sqlcipher.database.SQLiteCompiledSql.finalize() 在 java.util.concurrent.locks.LockSupport.park(LockSupport 的 sun.misc.Unsafe.park(Native Method) 处的 10 秒后超时.java:190) 在 java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:902) 在 java.util.concurrent. locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1227) at java.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:231) at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java: 294) 在 net.sqlcipher.database.SQLiteDatabase.lock(SQLiteDatabase.java:567) 在 net.sqlcipher.database.SQLiteCompiledSql。releaseSqlStatement(SQLiteCompiledSql.java:104) 在 net.sqlcipher.database.SQLiteCompiledSql.finalize(SQLiteCompiledSql.java:146) 在 java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:289) 在 java.lang.Daemons$FinalizerDaemon .runInternal(Daemons.java:276) 在 java.lang.Daemons$Daemon.run(Daemons.java:137) 在 java.lang.Thread.run(Thread.java:929)
它崩溃的线是SQLiteDatabase.lock() line 567
以前是第 566 行,但在那个方法中我插入了一个检查:如果数据库未打开 -> 返回并且不继续锁定,但它没有帮助并且崩溃再次出现。我认为这个崩溃可能是因为垃圾收集发生在应用程序在后台时(我们的应用程序有一个一直工作的前台服务)。但不确定如何解决。至于房间:我没有关闭它,它一直打开,因为我的应用程序一直在运行,所以经常需要它。每次查询数据库后关闭它是不好的做法。
我询问了 sqlcipher 的开发人员,但他们不知道,什么会导致这个崩溃。也许有人知道?