BusyTimeoutSQLiteDriver
Wraps a SQLiteDriver so every connection it opens waits up to busyTimeoutMs for a competing connection's lock instead of failing immediately with SQLITE_BUSY ("Error code: 5, message: database is locked").
Each database normally holds a single connection (see configureCommon), but DatabaseManager's wedge recovery deliberately abandons a stalled connection and opens a replacement pool against the same file (see abandonWedgedDbBlock). Until the abandoned callback finishes, both connections are live — and the bundled driver's default busy timeout is zero, so any write on the replacement fails the moment the abandoned connection holds the write lock. In the field (2.8.1, build 29321949) that surfaced as a fatal uncaught SQLITE_BUSY from Room's own invalidation-tracker housekeeping (TriggerBasedInvalidationTracker.syncTriggers), which the app cannot catch. A busy timeout makes the replacement connection wait out the overlap instead.