关于AndroBench在Android 10以后性能衰减的问题分析

  • Published2025-11-21 07:30:41

关于AndroBench在Android 10以后性能衰减的问题分析

背景

自Android 10发布以来,由于Google默认禁用了在Android P时引入的Compatibility WAL,加之AndroBench这一应用在代码层面存在于Android SQLite API不兼容的情况,导致Android 10以后的AndroBench SQLite部分跑分出现大幅下滑;

通过反编译AndroBench,我们得知,主要原因在于AndroBench没有使用Android framework API (enableWriteAheadLogging),而是使用raw语句来设置日志模式(PRAGMA journal_mode=wal),这导致Android framework无法获知日志模式发生改变,继而无法自动切换与之匹配的默认同步模式(PRAGMA synchronous)。

原生AOSP对于日志模式与同步模式的默认匹配如下:

WAL - NORMAL

非WAL - FULL

默认由于默认禁用了Compatibility WAL,因此Android framework默认认为所有SQLite数据库的日志模式为DELETE(可在config.xml中修改db_default_journal_mode的值来改变这一默认日志模式),因此对应的同步模式为FULL

正常情况下,如果APP调用enableWriteAheadLogging来显式切换日志模式为WAL,Android framework会自动切换默认的同步模式;

而AndroBench是通过rawQuery进行参数传导,这导致Android framework API无法监测并及时修改默认的同步模式,从而使AndroBench在Android 10以上的版本中测试SQLite时使用WAL的日志模式,却在没有显式修改同步模式的情况下,没有使用默认的NORMAL同步模式;

分析步骤

1. 反编译AndroBench:

AndroBench没有使用混淆、加固等手段,因此使用d2j-dex2jar即可反编译;

定位到Testing_SQLite_DBHelper.java后发现,其在onConfigure回调中做了如下操作:

public void onConfigure(final SQLiteDatabase sqLiteDatabase) {

final Cursor rawQuery = sqLiteDatabase.rawQuery("PRAGMA journal_mode=" + this.journalMode, (String[])null);