博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Q SQLite性能问题调研
阅读量:2353 次
发布时间:2019-05-10

本文共 2450 字,大约阅读时间需要 8 分钟。

一: android q的androbench数据库三项测试性能明显不如p,原因在于:

p版本的文件frameworks/base/core/res/res/values/config.xml里面配置项db_compatibility_wal_supported为true。

导致androbench open test数据库时,会在文件frameworks/base/core/java/android/database/sqlite/SQLiteConnection.java

函数setWalModeFromConfiguration内判断出useCompatibilityWal为true,  从而把该test数据库日志模式设置为normal mode。

 

q版本的文件frameworks/base/core/res/res/values/config.xml里面并无配置项db_compatibility_wal_supported。

androbench open test数据库时,在上面同样的函数setWalModeFromConfiguration里面

判断isCompatibilityWalEnabled为false时,从而把该test数据库日志模式设置为full mode.

 

androbench数据库测试是对上面的test 数据库进行增删改测试的,配置成full mode时,测试时产生的fsync调用次数会比normal mode下,多出

至少4-5倍。

 

所以q版本的androbench数据库测试比p版本的性能差。

 

二:对上面原因的进一步详细说明:

1:通过加log分析anrobench启动数据库测试时的工作过程,发现无论是q还是p版本,androbench 操作test数据库时,只会调用

setWalModeFromConfiguration一次(在open数据库阶段),而配置或者修改数据库的日志模式只会在该函数中进行。

 

2:androbench open test数据库时,

p版本:

会根据配置项db_compatibility_wal_supported为true,设置useCompatibilityWal为true,

从而最终把test数据库日志模式设置为normal mode。

q版本:

换成了根据判断SQLiteCompatibilityWalFlags.isLegacyCompatibilityWalEnabled,只有这个为true时,才能最终配置test数据库日志模式设置为normal mode。

但是SQLiteCompatibilityWalFlags只会在手机开机时,systemserver初始化阶段,被初始化一次,设置LegacyCompatibilityWal为false。

所以open test数据库时,SQLiteCompatibilityWalFlags.isLegacyCompatibilityWalEnabled为false,从而最终配置test数据库日志模式设置为full mode。

 

3:通过执行logcat | grep -i "PRAGMA synchronous=" 和 logcat | grep -i "setSyncMode"命令,观察10个app启动时的数据库配置行为,发现:

p版本上:

app启动时,所有的数据库都被配置成了normal mode.

q版本上:

app启动时,相当多的数据库被配置成了full mode.

 

4:通过生成bugroport的方式,观察手机里dump出来的各个运行app的数据库配置参数mConfiguration.{openFlags,useCompatibilityWal},发现:

p版本上:

mConfiguration.openFlags很多都设置了useCompatibilityWal位,mConfiguration.useCompatibilityWal全部为true.

q版本上:

mConfiguration.openFlags全部没有设置useCompatibilityWal位,mConfiguration.isLegacyCompatibilityWalEnabled全部为false.

 

通过上面3和4,说明q版本上不止androbench被配置成了full mode, 其他app的数据库也被配置成了full mode.

p版本上测试的app数据库都被配置成了normal mode.

 

三:q版本上androbench数据库测试性能差的修补措施有两个:

1:函数setSyncMode里面加判断,如果mConfiguration.path中包含有“androbench”字眼的话,设置数据库为normal mode.

这样强制设置androbench数据库为normal mode.

2:在手机开机systemserver初始化阶段,设置SQLiteCompatibilityWalFlags.LegacyCompatibilityWalEnabled为true,这样会导致不止androbench,

其他app的数据库,都会被统一配置成normal模式。

 

方法2需要再进一步调研下,确认q版本上是否需要和p版本上一样,设置所有app的数据库都为normal模式。这样做会不会有什么负作用。

方法1简单直接利于解决相关jira,且androbench只是用来跑IO测试用的app,配置成normal对其没啥影响。况且函数setSyncMode在运行的手机里面,并不为热点函数,调用次数并不频繁,里面加字符串匹配不影响性能。

 

四:最后结论

经过跟谷歌工程师提issue,咨询后,觉得为了稳定性考虑,还是Android q上保持目前的数据库去除wal compatibel的设计架构,不去修改为好。

跟谷歌的交流沟通详见下面链接:

XXX

转载地址:http://yurvb.baihongyu.com/

你可能感兴趣的文章
解决java中文乱码,编码识别测试,汇总
查看>>
android定时,延时,倒计时源码
查看>>
Eclipse导入项目时常见问题解决汇总, Android Studio转为Eclipse项目问题汇总
查看>>
com.android.dex.DexIndexOverflowException
查看>>
AndroidStudio一个工程内查看多个项目的实现
查看>>
Gradle Build速度加快终极方法
查看>>
Could not find class 'com.umeng.analytics.d' 解决的方案分享
查看>>
谷歌游览器模拟手机请求网站测试
查看>>
在Fragment中OnActivityResult方法中接收Activity中返回的值
查看>>
外包采用Gradle生成多套app打包
查看>>
iOS和Android的app界面设计规范
查看>>
Android 代码混淆异常
查看>>
Android drawable微技巧,你所不知道的drawable的那些细节
查看>>
理解Fragment生命周期
查看>>
最靠谱的禁止ViewPager滑动方法
查看>>
android错误之android.content.res.Resources$NotFoundException:
查看>>
Android监听软键盘打开收起事件(软键盘自带收起按钮)
查看>>
huffman code and encode
查看>>
exception in c++
查看>>
java并发编程lock
查看>>