Android5.0上運行SQLCipher庫出現(xiàn)readonly database的解決方案

這是第一次在簡書上寫文章救欧,沒想到寫的就是純技術(shù)類的文章值戳,最近被這個小清新風格的網(wǎng)站吸引住了西篓,也想換換風格愈腾,平時一般都是逛逛技術(shù)類的博客,但是發(fā)現(xiàn)簡書這個網(wǎng)站污淋,特別是被灌了一些雞湯后顶滩,決定以后遷移到這個網(wǎng)站了,估計寫的話也是一些關(guān)于技術(shù)類的文章把寸爆,誰讓咱是一名不折不扣的攻城獅呢礁鲁。

好的,閑話不多說赁豆,下面進入主題仅醇。

公司的一些產(chǎn)品中采用了?SQLCipher?這個庫來來對數(shù)據(jù)庫中的數(shù)據(jù)進行加密,但是在Android5.0版本上SQLCipher會出現(xiàn)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上才會出現(xiàn)节预,但是目前采用5.0版本的機型應(yīng)該不會很多(很多機型要么4.4要么就直接 >5.0)而且采用SQLCipher加密庫的App也不是很多叶摄,所以這個問題出現(xiàn)的幾率并不高,但是誰讓我們的用戶偏偏就用了Android5.0的機型呢安拟,所以不得不去啃這塊硬骨頭(攻城獅嘛蛤吓,攻不下城怎么能叫攻城獅呢)。

經(jīng)過不懈的努力后糠赦,終于找到了解決方案:

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

其實這并不是SQLCipher的問題会傲,而是Android5.0的一個BUG锅棕,Google在Android的下一個版本中進行了修復,所以這個問題只有在Android5.0上才會出現(xiàn)淌山。

國外大神也給出了非官方的解決方案:

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環(huán)境的搭建這里就不再敘述了,網(wǎng)上有很多的教程王浴。

NDK環(huán)境搭建好之后脆炎,可以根據(jù)官方的教程進行編譯:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钞啸,一起剝皮案震驚了整個濱河市几蜻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌体斩,老刑警劉巖梭稚,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異絮吵,居然都是意外死亡弧烤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門蹬敲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暇昂,“玉大人,你說我怎么就攤上這事伴嗡〖辈ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵瘪校,是天一觀的道長澄暮。 經(jīng)常有香客問我,道長阱扬,這世上最難降的妖魔是什么泣懊? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮麻惶,結(jié)果婚禮上馍刮,老公的妹妹穿的比我還像新娘。我一直安慰自己用踩,他們只是感情好渠退,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脐彩,像睡著了一般碎乃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惠奸,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天梅誓,我揣著相機與錄音,去河邊找鬼佛南。 笑死梗掰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的嗅回。 我是一名探鬼主播及穗,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绵载!你這毒婦竟也來了埂陆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤娃豹,失蹤者是張志新(化名)和其女友劉穎焚虱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懂版,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡鹃栽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躯畴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片民鼓。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖私股,靈堂內(nèi)的尸體忽然破棺而出摹察,到底是詐尸還是另有隱情,我是刑警寧澤倡鲸,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布供嚎,位于F島的核電站,受9級特大地震影響峭状,放射性物質(zhì)發(fā)生泄漏克滴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一优床、第九天 我趴在偏房一處隱蔽的房頂上張望劝赔。 院中可真熱鬧,春花似錦胆敞、人聲如沸着帽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仍翰。三九已至赫粥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間予借,已是汗流浹背越平。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灵迫,地道東北人秦叛。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像瀑粥,于是被迫代替她去往敵國和親挣跋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 文/小漂 分享一下我們家鄉(xiāng)過年食材之干魚利凑。先上一個成品圖大家看看浆劲。 從媽媽那里取經(jīng),現(xiàn)在跟大家分享一下哀澈。 第一步:...
    小太陽漂漂漂閱讀 551評論 0 1
  • “生存法則很簡單牌借,就是忍人所不忍,能人所不能割按。忍是一條線膨报,能是一條線,兩者的間距就是生存機會适荣。如果咱們?nèi)倘怂蝗蹋?..
    經(jīng)鐘閱讀 269評論 0 0
  • 一:金句仿寫 1.this will relieve pressure on the train to some ...
    z張文閱讀 236評論 0 0