sqlite3在android 操作返回readonly錯誤

近期使用sqlite3源代碼編譯了一個sqlite3的庫跑在安卓平臺上,但發現部分安卓機器會操作失敗,返回readonly。經過覈查所有需要設定的權限全部都有,經過長時間的排查,終於發現只有在anroid5.0的系統上纔會出現。所以定位爲系統兼容問題,又經過大量調試發現原因所在:在sqlite3源代碼中引用到了一種系統庫的數據類型 ino_t ,該數據類型在android5.0上的定義有問題,它在5.0下的定義是如果內核是32位則定義爲32bit,如果是64位則定義64bit。而sqlite3所需要的是不關心內核的統一的64bit。所以在32bit的內核機器上如果裝有android5.0則導致sqlite數據被截斷而出錯。具體修復方式如下:

修改sqlite3.c代碼

源代碼:

ino_t ino; /* Inode number */

修改後:

#ifdef ANDROID
// Bionic's struct stat has a 64 bit st_ino on both 32 and 64 bit architectures. 
// ino_t remains 32 bits wide on 32 bit architectures and can lead to inode truncation.

unsigned long long ino; /* Inode number */

#else

ino_t ino; /* Inode number */

#endif

攻城獅一定要堅持才能攻破bug!!!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章