关于AndroBench在Android 10以后性能衰减的问题分析
关于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以后性能衰减的问题分析相关推荐
- 【Android 10 源码】深入理解 Omx 初始化
MediaCodec 系列文章: [Android 10 源码]深入理解 MediaCodec 硬解码初始化 [Android 10 源码]深入理解 Omx 初始化 [Android 10 源码]深入 ...
- 诺基亚升级Android10,诺基亚Android 10系统更新,诺基亚7+的性能得到可完善
描述 诺基亚发布第五次Android 10系统更新.虽然目前还不清楚谷歌将来是否会在全球推广Android 10系统,但有一点很明显,此次推出Android 10的速度要比几个主要智能手机厂商的And ...
- 诺基亚7 android 9,诺基亚Android 10系统更新,诺基亚7+的性能得到可完善
诺基亚发布第五次Android 10系统更新.虽然目前还不清楚谷歌将来是否会在全球推广Android 10系统,但有一点很明显,此次推出Android 10的速度要比几个主要智能手机厂商的Androi ...
- Android Q SQLite性能问题调研
一: android q的androbench数据库三项测试性能明显不如p,原因在于: p版本的文件frameworks/base/core/res/res/values/config.xml里面配置 ...
- Android 10 新增的功能
个人表示看了2个多小时 ,基本了解如下 android 10 对应的API 版本为29 好像名字就是android 10 没看到什么甜品的名称了 可以在官网上看到android 对应的版本如下 an ...
- 北大电池新研究登上Nature:3万次循环测试,性能衰减不到30%,大幅提高锂空电池性能...
乾明 编辑整理 量子位 出品 | 公众号 QbitAI 电池研究又有新进展. 而且荣登Nature,来自北京大学. 工学院的郭少军团队研发出一类新型电催化剂,与商业化的两种催化剂相比,相应指标高出78 ...
- 最新android 手机型号,各大安卓手机厂商Android 10系统更新汇总,你的机型支持吗?...
原标题:各大安卓手机厂商Android 10系统更新汇总,你的机型支持吗? 对于安卓手机来说系统更新是一件非常好的事情,这意味着手机新增很多功能,同时新系统也能够给用户带来更好的体验.对于谷歌今年9月 ...
- 诺基亚7plus更新android10,诺基亚发布第五次Android 10更新 诺基亚7+可升级
1月8日消息,诺基亚发布第五次Android 10系统更新.虽然目前还不清楚谷歌将来是否会在全球推广Android 10系统,但有一点很明显,此次推出Android 10的速度要比几个主要智能手机厂商 ...
- 谷歌开发者大会焦点:大中华区新掌门亮相,Android 10原生支持5G,TF2.0大更新...
新智元报道 编辑:鹏飞.大明.张佳 [新智元导读]为期两天的2019谷歌开发者大会刚刚落下帷幕,谷歌推出了最新的Android 10.TensorFlow 2.0.Flutter 1.9等产品 ...
最新文章
- Crystal Reports中的字段
- Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
- Oracle 10g如何对用户姓名,按首字母排序、查询
- 机器学习理论《统计学习方法》学习笔记:第十一章 条件随机场(CRF)
- 使用Hive和iReport进行大数据分析
- Ubuntu下apache2启动、停止、重启、配置
- 与变异风险词赛跑 阿里探索AI治理网络风险
- OpenJudge NOI 1.7 28:单词倒排
- frame、bounds表示大小和位置的属性以及center、position、anchorPosition
- Git和Github代码管理实践
- [转] 面向对象软件开发和过程(四)重用
- 调用网易云api接口
- 我的周刊(第028期)
- 数学建模(六) 主成分分析,聚类分析,对策论,马氏链
- Practical GameMaker Projects 免积分下载
- vba excel 开发游戏_自动化神器—VBA
- 程序员的呐喊--读书感悟
- Android连接WiFi再探索
- ps景观平面图转鸟瞰图_ps如何制作鸟瞰图 ps制作鸟瞰图教程
- c盘越来越大怎么清理?清理C:\Windows\System32\DriverStore\FileRepository