Android 9 introduces a special mode of
SQLiteDatabase
called Compatibility write-ahead logging (WAL) that allows a database to use
journal_mode=WAL
while preserving the behavior of keeping a maximum of one
connection per database.
Compatibility WAL is enabled for an app's database by default unless the app has either:
- Opted-in or out of write-ahead logging by calling
SQLiteDatabase.enableWriteAheadLogging
ordisableWriteAheadLogging
- Explicitly requested journal mode by calling
SQLiteDatabase.OpenParams.setJournalMode(String mode)
Enabling the WAL journal mode can lead to a significant improvement in performance and reduction in the amount of writes. For example, on an ext4 file system, WAL can lead to a 4x improvement in write speed.
Compatibility WAL is enabled by default and doesn't require any additional implementation.
Disable Compatibility WAL
To disable the Compatibility WAL mode, overlay the
db_compatibility_wal_supported
config resource.
For example:
<bool name="db_compatibility_wal_supported">false</bool>
You may want to disable Compatibility WAL for configurations where the WAL journal mode doesn't provide a performance advantage over traditional rollback journal modes. For example, on a F2FS file system, although SQLite supports atomic writes and the DELETE journal performance is similar to WAL, WAL can increase the amount of writes by 10% to 15%.
Validation
To validate the Compatibility WAL mode, run CTS tests from the CtsDatabaseTestCases module. CTS tests will verify the expected behavior when Compatibility WAL is enabled.