挖井

类库大魔王的挖井日记

挖一口属于自己的井


SQLCipher Android平台升级踩坑

公司项目里使用SQLCipher用于本地加密存储数据,之前发现在iOS上打开数据库后执行第一条CRUD特别慢,经过几番优化尝试,发现只要在编译选项指定使用Apple Common Crypto,就能比使用OpenSSL提升100倍性能。但是Android平台上也只能使用OpenSSL,性能问题两年多来一直没解决。

一个多月前,公司的安全部门说我们用的SQLCipher版本太老了,要求我们升级,经过大半个月折腾,我们终于把它从3.4.1升级到了当时最新的4.0.1,相关人士都欢欣鼓舞,直到这个星期。

Android team为了适应Google play的要求,把API target升级到了28,显示通知栏图标的逻辑变成了先调用startForegroundService再调用startForeground,结果在这两次调用中间,因为执行数据库的初始化读写操作,导致两次调用时间间隔超过5秒(SQLCipher就是这么慢!),App被系统干掉!于是开始了我们在Android上的优化。

鉴于一直没有更好的像Apple Common Crypto方案,我们直接放弃了提升SQLCipher性能的尝试。而是把所有数据库初始化操作都放到后台线程,然后把几乎所有相关的读写操作都加了锁(简单粗暴)。而后又发现还有主线程会有数据库操作在等后台线程初始化的锁,于是还是很容易遇到ANR。最后实在没办法了,尝试把SQLCipher又回滚到3.4.1版本,发现一切都变好了!就是这么神奇!我看github上也有人报SQLCipher 4.0.1在Android上插入数据很慢,官方并没有好的解决方案,给出的关掉内存清扫的安全选项我测试下来并没多少改善。

吃一堑,长一智。这给我们的教训是:升级第三方库要尽量放在每个release开始时做,做完了还有较多的时间进行内部测试,发现问题最差也能回滚到之前的状态。

本文地址:

https://minidump.info/blog/2019/04/sqlcipher-android-upgrade-memior/

感觉本文不错,不妨小额鼓励我一下!
如果你有Visa、MasterCard之类的国际银行卡,也可以考虑以下选项:
上一篇

年会中奖KPW3一台

昨晚公司,本来都有点不太想去,因为往年的经历开一次年会失一次望,不如回家陪妹子。跟妹子聊起这个事,妹子倒劝我还是去参加吧,抽奖奖品我确实很想要一台带背光的Kindle,家里已有的Kindle4和DXG都没背光,晚上吊顶的灯光不适合看。于是还是去参加了,还当了一回苦力拉了几箱东西,包括所有抽奖奖...…

Life 全文阅读
下一篇

C++中RAII的实现手法

Go语言中有defer可以在退出当前作用域时执行一个函数调用,C++中以前常用的做法是创建一个类的对象,在该类的析构函数中写入需要执行的代码。而这个对象可以创建在栈中,也可以放在std::auto_prt<>或std::unique_prt<>之类的地方,只要退出作用域...…

CPPOOPGPXP 全文阅读