关于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);rawQuery.moveToNext();System.out.println("journal_mode=" + rawQuery.getString(0));rawQuery.close();}

这种情况下,Android framework只会将字符串直接下发给sqlite,而不会去判断其参数的分类,从而导致此时同步模式依旧为非WAL的默认值——FULL;

Q:为什么Android P版本此处是NORMAL?

A:因为在Android P上,Google引入了compatibility wal模式的默认支持,因此除非应用显示禁用WAL模式:

如下是Android P上通过日志模式确认同步模式的代码,Android 10上是类似的,就不分别列举了:

    private void setWalModeFromConfiguration() {if (!mConfiguration.isInMemoryDb() && !mIsReadOnlyConnection) {// 此处会在AndroBench通过rawQuery修改日志模式之前执行,并且由于其没有通过API调用,因此此处始终为false;final boolean walEnabled =(mConfiguration.openFlags & SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING) != 0;// Use compatibility WAL unless an app explicitly set journal/synchronous mode// or DISABLE_COMPATIBILITY_WAL flag is set// 此处Android P上默认为true,Android 10上默认为falsefinal boolean useCompatibilityWal = mConfiguration.useCompatibilityWal();if (walEnabled || useCompatibilityWal) {//Android P走这里面setJournalMode("WAL");if (mConfiguration.syncMode != null) {setSyncMode(mConfiguration.syncMode);} else if (useCompatibilityWal && SQLiteCompatibilityWalFlags.areFlagsSet()) {setSyncMode(SQLiteCompatibilityWalFlags.getWALSyncMode());} else {setSyncMode(SQLiteGlobal.getWALSyncMode());}} else {//Android 10走这里面setJournalMode(mConfiguration.journalMode == null? SQLiteGlobal.getDefaultJournalMode() : mConfiguration.journalMode);setSyncMode(mConfiguration.syncMode == null? SQLiteGlobal.getDefaultSyncMode() : mConfiguration.syncMode);}}}

2. 验证效果

如果上述分析正确,那么通过修改SQLiteGlobal.java中的getDefaultSyncMode()方法的参数,则可作用于AndroBench的同步模式;

以某SM7250平台手机(6GB + 128GB)为例,在user版本上进行验证:

(非正式版,此处仅用于展示改动前后的变化,具体数值在正式版上可能会有差异)

默认情况下:

Insert:   1822.90    1828.72    1896.34
Update:    2452.78    2499.33    2559.36
Delete:   2783.88    2760.58    2789.39

通过adb shell setprop debug.sqlite.syncmode NORMAL后:

Insert:   3100.91    3128.59    3045.44
Update:   3863.16    3956.29    3999.25
Delete:   4966.03    4933.55    4834.18

简单取平均值后对比发现,当WAL工作在NORMAL同步模式下时,AndroBench成绩较FULL同步模式分别提升:

           FULL       NORMAL     DIFF
Insert:   1849.32    3091.65    167%
Update:   2503.82    3939.57    157%
Delete:   2777.95    4911.25    176%

3. 改进措施

a. 通过在父类SQLiteOpenHelper的onConfigure回调之后进行判断,如果Android framework API检测到WAL没有启用(!db.isWriteAheadLoggingEnabled()),但实际通过rawQuery获取到的journal_mode确是WAL,此时认为App通过了rawQuery修改日志模式,此时显式调用一次enableWriteAheadLogging()即可;b. 通过对SQL语句进行拦截,对PRAGMA journal_mode与PRAGMA synchronous两个参数的设置进行判断、绑定,使其与Android framework API的表现一致;

目前a方案已经开发完成,但是考虑到其可能存在部分特殊App功能发生改变:

如果存在某一应用,同时使用了PRAGMA journal_mode=wal,与PRAGMA synchronous=FULL(或OFF),方案a会覆盖其同步模式为NORMAL,这改变了App本身的逻辑,不符合修改的基本要求;

因此建议使用b方案实现;

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

  1. 【Android 10 源码】深入理解 Omx 初始化

    MediaCodec 系列文章: [Android 10 源码]深入理解 MediaCodec 硬解码初始化 [Android 10 源码]深入理解 Omx 初始化 [Android 10 源码]深入 ...

  2. 诺基亚升级Android10,诺基亚Android 10系统更新,诺基亚7+的性能得到可完善

    描述 诺基亚发布第五次Android 10系统更新.虽然目前还不清楚谷歌将来是否会在全球推广Android 10系统,但有一点很明显,此次推出Android 10的速度要比几个主要智能手机厂商的And ...

  3. 诺基亚7 android 9,诺基亚Android 10系统更新,诺基亚7+的性能得到可完善

    诺基亚发布第五次Android 10系统更新.虽然目前还不清楚谷歌将来是否会在全球推广Android 10系统,但有一点很明显,此次推出Android 10的速度要比几个主要智能手机厂商的Androi ...

  4. Android Q SQLite性能问题调研

    一: android q的androbench数据库三项测试性能明显不如p,原因在于: p版本的文件frameworks/base/core/res/res/values/config.xml里面配置 ...

  5. Android 10 新增的功能

    个人表示看了2个多小时 ,基本了解如下 android 10 对应的API 版本为29  好像名字就是android 10 没看到什么甜品的名称了 可以在官网上看到android 对应的版本如下 an ...

  6. 北大电池新研究登上Nature:3万次循环测试,性能衰减不到30%,大幅提高锂空电池性能...

    乾明 编辑整理 量子位 出品 | 公众号 QbitAI 电池研究又有新进展. 而且荣登Nature,来自北京大学. 工学院的郭少军团队研发出一类新型电催化剂,与商业化的两种催化剂相比,相应指标高出78 ...

  7. 最新android 手机型号,各大安卓手机厂商Android 10系统更新汇总,你的机型支持吗?...

    原标题:各大安卓手机厂商Android 10系统更新汇总,你的机型支持吗? 对于安卓手机来说系统更新是一件非常好的事情,这意味着手机新增很多功能,同时新系统也能够给用户带来更好的体验.对于谷歌今年9月 ...

  8. 诺基亚7plus更新android10,诺基亚发布第五次Android 10更新 诺基亚7+可升级

    1月8日消息,诺基亚发布第五次Android 10系统更新.虽然目前还不清楚谷歌将来是否会在全球推广Android 10系统,但有一点很明显,此次推出Android 10的速度要比几个主要智能手机厂商 ...

  9. 谷歌开发者大会焦点:大中华区新掌门亮相,Android 10原生支持5G,TF2.0大更新...

      新智元报道   编辑:鹏飞.大明.张佳 [新智元导读]为期两天的2019谷歌开发者大会刚刚落下帷幕,谷歌推出了最新的Android 10.TensorFlow 2.0.Flutter 1.9等产品 ...

最新文章

  1. Crystal Reports中的字段
  2. Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
  3. Oracle 10g如何对用户姓名,按首字母排序、查询
  4. 机器学习理论《统计学习方法》学习笔记:第十一章 条件随机场(CRF)
  5. 使用Hive和iReport进行大数据分析
  6. Ubuntu下apache2启动、停止、重启、配置
  7. 与变异风险词赛跑 阿里探索AI治理网络风险
  8. OpenJudge NOI 1.7 28:单词倒排
  9. frame、bounds表示大小和位置的属性以及center、position、anchorPosition
  10. Git和Github代码管理实践
  11. [转] 面向对象软件开发和过程(四)重用
  12. 调用网易云api接口
  13. 我的周刊(第028期)
  14. 数学建模(六) 主成分分析,聚类分析,对策论,马氏链
  15. Practical GameMaker Projects 免积分下载
  16. vba excel 开发游戏_自动化神器—VBA
  17. 程序员的呐喊--读书感悟
  18. Android连接WiFi再探索
  19. ps景观平面图转鸟瞰图_ps如何制作鸟瞰图 ps制作鸟瞰图教程
  20. c盘越来越大怎么清理?清理C:\Windows\System32\DriverStore\FileRepository

热门文章

  1. ps 制作虚线框背景
  2. 简单的购物卡管理系统 可开源
  3. 怎样安装win服务器系统,win服务器系统安装教程
  4. 基于Echarts实现可视化数据大屏大数据平台车辆监控系统HTML模板
  5. 三星s6经常信号无服务器,看看你中招了没?盘点三星S6 Edge六大常见问题
  6. 打印Service运行时间与Aspect相关注解使用
  7. jupyter notebook是一种Web 应用,能让用户将说明文本、数学方程、代码和可视化内容全部组合到一个易于共享的文档中
  8. 作业调度算法--先来先服务
  9. 当Python遇到分形数学魔法 --> 树叶
  10. Linux磁盘管理和文件系统