Android5.0上运行SQLCipher库出现readonly database的解决方案

这是第一次在简书上写文章,没想到写的就是纯技术类的文章,最近被这个小清新风格的网站吸引住了,也想换换风格,平时一般都是逛逛技术类的博客,但是发现简书这个网站,特别是被灌了一些鸡汤后,决定以后迁移到这个网站了,估计写的话也是一些关于技术类的文章把,谁让咱是一名不折不扣的攻城狮呢。

好的,闲话不多说,下面进入主题。

公司的一些产品中采用了 SQLCipher 这个库来来对数据库中的数据进行加密,但是在Android5.0版本上SQLCipher会出现readonly database错误:

net.sqlcipher.database.SQLiteException: attempt to write a readonly database

一直以为这是SQLCipher的问题,在Github上也有人提出过这个问题,但是这些方案没能解决我遇到的问题。

https://github.com/sqlcipher/android-database-sqlcipher/issues/161

这个问题只有在Android5.0上才会出现,但是目前采用5.0版本的机型应该不会很多(很多机型要么4.4要么就直接 >5.0)而且采用SQLCipher加密库的App也不是很多,所以这个问题出现的几率并不高,但是谁让我们的用户偏偏就用了Android5.0的机型呢,所以不得不去啃这块硬骨头(攻城狮嘛,攻不下城怎么能叫攻城狮呢)。

经过不懈的努力后,终于找到了解决方案:

Workaround for Nexus 9 SQLite file write operations on external dirs?

其实这并不是SQLCipher的问题,而是Android5.0的一个BUG,Google在Android的下一个版本中进行了修复,所以这个问题只有在Android5.0上才会出现。

国外大神也给出了非官方的解决方案:

https://android-review.googlesource.com/#/c/115351/

Store inodes in unsigned long long

In 32 bit ABIs, ino_t is a 32 bit type, while the st_ino field

in struct stat is 64 bits wide in both 32 and 64 bit processes.

This means that struct stat can expose inode numbers that are

truncated when stored in an ino_t.

The SDCard fuse daemon (/system/bin/sdcard) uses raw pointer

values as inode numbers, so on 64 bit devices, we're very likely

to observe inodes that need > 32 bits to represent.

The fileHasMoved function in sqlite compares the stored

inode value with a new one from stat, and when the stored

value is truncated, this check will falsely indicate that

the file has been moved. When the fileHasMoved function

triggers, other functions start returning errors indicating

that the database is in read-only mode.

NOTE: Bionic differs from glibc in that struct stat's st_ino

is *always* 64 bits wide, and not the same width as ino_t.

如果要修复该BUG的话,肯定得自己下载SQLCipher源码自己进行编译了,源码是C编写的,所以需要下载NDK才能进行编译。

NDK环境的搭建这里就不再叙述了,网上有很多的教程。

NDK环境搭建好之后,可以根据官方的教程进行编译:

https://www.zetetic.net/sqlcipher/sqlcipher-for-android/

当然在编译之前需要对源码进行修改,打开

https://android-review.googlesource.com/#/c/115351/3/dist/sqlite3.c

可以看到 sqlite.c 文件需要修改的地方:

25322    ino_t ino; /* Inode number */

修改为:

25322    #ifdef ANDROID

25323    // Bionic's struct stat has a 64 bit st_ino on both 32 and

25324    // 64 bit architectures. ino_t remains 32 bits wide on 32 bit

25325    // architectures and can lead to inode truncation.

25326    unsigned long long ino; /* Inode number */

25327    #else

25328    ino_t ino; /* Inode number */

25329    #endif

修改完成后保存文件,然后按照官方教程进行编译,编译完成后得到的so文件和jar文件即可用在Android5.0版本上。

----

给需要的朋友分享一个我自己编译的sqlcipher库http://pan.baidu.com/s/1i47SQSd

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • 文/小漂 分享一下我们家乡过年食材之干鱼。先上一个成品图大家看看。 从妈妈那里取经,现在跟大家分享一下。 第一步:...
    小太阳漂漂漂阅读 529评论 0 1
  • “生存法则很简单,就是忍人所不忍,能人所不能。忍是一条线,能是一条线,两者的间距就是生存机会。如果咱们忍人所不忍,...
    经钟阅读 237评论 0 0
  • 一:金句仿写 1.this will relieve pressure on the train to some ...
    z张文阅读 226评论 0 0