Android 存儲優(yōu)化系列專題

閃存
Android 存儲優(yōu)化系列專題
  • SharedPreferences 系列

Android 之不要濫用 SharedPreferences(上)
Android 之不要濫用 SharedPreferences(下)

  • ContentProvider 系列(待更)

Android 存儲選項(xiàng)之 ContentProvider 啟動存在的暗坑
《Android 存儲選項(xiàng)之 ContentProvider 深入分析》

  • 對象序列化系列

Android 對象序列化之你不知道的 Serializable
Android 對象序列化之 Parcelable 取代 Serializable ?
Android 對象序列化之追求性能完美的 Serial

  • 數(shù)據(jù)序列化系列(待更)

《Android 數(shù)據(jù)序列化之 JSON》
《Android 數(shù)據(jù)序列化之 Protocol Buffer 使用》
《Android 數(shù)據(jù)序列化之 Protocol Buffer 源碼分析》

  • SQLite 存儲系列

Android 存儲選項(xiàng)之 SQLiteDatabase 創(chuàng)建過程源碼分析
Android 存儲選項(xiàng)之 SQLiteDatabase 源碼分析
數(shù)據(jù)庫連接池 SQLiteConnectionPool 源碼分析
SQLiteDatabase 啟用事務(wù)源碼分析
SQLite 數(shù)據(jù)庫 WAL 模式工作原理簡介
SQLite 數(shù)據(jù)庫鎖機(jī)制與事務(wù)簡介
SQLite 數(shù)據(jù)庫優(yōu)化那些事兒


Android 存儲基礎(chǔ)

在講具體的存儲方法之前,我們先來了解下 Android 系統(tǒng)存儲相關(guān)的一些基礎(chǔ)知識汞扎。

1. Android 分區(qū)

說到存儲季稳,對于 Android 來說,我們首先應(yīng)該對 Android 分區(qū)的架構(gòu)和作用有所了解澈魄。在大家熟悉的 Windows 世界里景鼠,系統(tǒng)一般安裝在 C 盤,然后還會有幾個用來存放應(yīng)用程序和數(shù)據(jù)的分區(qū)痹扇。

Android 系統(tǒng)可以通過 /proc/partitions 或者 df 命令來查看各個分區(qū)情況铛漓,下圖是華為 Magic 2 中 df 命令的運(yùn)行結(jié)果溯香。

df分區(qū)

什么是分區(qū)呢?分區(qū)簡單來說就是將設(shè)備中的存儲劃分為一些不重疊的部分浓恶,每個部分都可以單獨(dú)格式化玫坛,用作不同的目的。這樣系統(tǒng)就可以靈活地針對單獨(dú)分區(qū)做不同的操作包晰,例如在系統(tǒng)還原(recovery)過程湿镀,我們不希望會影響到用戶存儲的數(shù)據(jù)。

Android系統(tǒng)分區(qū)

從上面的表中你可以看到杜窄,每個分區(qū)非常獨(dú)立肠骆,不同的分區(qū)可以使用的不同的文件系統(tǒng)算途。其中比較重要的有:

  • /system 分區(qū):它是存放所有 Google 提供的 Android 組件的地方塞耕。這個分區(qū)只能以只讀方式 mount。這樣主要基于穩(wěn)定性和安全考慮嘴瓤,即使發(fā)生用戶突然斷電的秦光扫外,也依然需要保證 /system 分區(qū)的內(nèi)容不會受到破壞和篡改。
  • /data 分區(qū):它是所有用戶數(shù)據(jù)存放的地方廓脆。主要是為了實(shí)現(xiàn)數(shù)據(jù)隔離筛谚,既系統(tǒng)升級和恢復(fù)的時候會擦出整個 /system 分區(qū),但是卻不會影響 /data 的用戶數(shù)據(jù)停忿。而恢復(fù)出廠設(shè)置驾讲,只會擦出 /data 的數(shù)據(jù)。
  • /vendor 分區(qū):它是存放廠商特殊系統(tǒng)修改的地方席赂。特別是在 Android 8.0 以后吮铭,隆重推出了 “Treble” 項(xiàng)目。廠商 OTA 時可以只更新自己的 /vendor 分區(qū)即可颅停,讓廠商能夠以更低的成本谓晌,更輕松、更快速地將設(shè)備更新到新版 Android 系統(tǒng)癞揉。
2. Android 存儲安全

除了數(shù)據(jù)的分區(qū)隔離纸肉,存儲安全也是 Android 系統(tǒng)非常重要的一部分,存儲安全首先考慮的是權(quán)限控制喊熟。

第一柏肪,權(quán)限控制

Android 的每個應(yīng)用都在自己的應(yīng)用沙盒內(nèi)運(yùn)行,在 Android 4.3 之前的版本中芥牌,這些沙盒使用了標(biāo)準(zhǔn) Linux 的保護(hù)機(jī)制预吆,通過為每個應(yīng)用創(chuàng)建獨(dú)一無二的 Linux UID 來定義。簡單來說胳泉,就是需要保證微信不能訪問 QQ 的數(shù)據(jù)拐叉,并且在沒有權(quán)限的情況下也不能訪問系統(tǒng)的一些保護(hù)文件岩遗。

在 Android 4.3 引入了 SELinux(Security Enhanced Linux)機(jī)制進(jìn)一步定義 Android 應(yīng)用沙盒的邊界。那它有什么特別的呢凤瘦?它的作用是即使我們進(jìn)程有 root 權(quán)限也不能為所欲為宿礁,如果想在 SELinux 系統(tǒng)中干任何事情,都必須現(xiàn)在專門的安全策略文件中賦予權(quán)限蔬芥。

第二梆靖,數(shù)據(jù)加密

除了權(quán)限的控制,用戶還會擔(dān)心在手機(jī)丟失或者被盜導(dǎo)致個人隱私數(shù)據(jù)泄露笔诵。加密獲取是一個不錯的選擇返吻,它可以保護(hù)丟失或被盜設(shè)備上的數(shù)據(jù)。

Android 有兩種設(shè)備加密方法:全盤加密和文件級加密乎婿。全盤加密是在 Android 4.4 中引入的测僵,并在 Android 5.0 中默認(rèn)打開。它會將 /data 分區(qū)的用戶數(shù)據(jù)操作加密 / 解密谢翎,對性能會有一定的影響捍靠,但是新版本的芯片都會在硬件中提供直接支持。

基于文件系統(tǒng)的加密森逮,如果設(shè)備被解鎖了榨婆,加密也就沒有用了。所以 Android 7.0 增加了基于文件的加密褒侧。在這種加密模式下良风,將會給每個文件都分配一個必須用用戶的 passcode 推導(dǎo)出來的秘鑰。特定的文件被屏幕鎖屏之后闷供,直到用戶下次解鎖屏幕期間都不能訪問烟央。

那 Android 的這兩種設(shè)備加密方法跟應(yīng)用的加密有什么不同,我們在應(yīng)用存儲還需要單獨(dú)的給敏感文件加密嗎这吻?

其實(shí)設(shè)備加密方法對應(yīng)用程序來說是透明的吊档,它保證我們讀取到的是解密后的數(shù)據(jù)。對于應(yīng)用程序特別敏感的數(shù)據(jù)唾糯,我們也需要采用 RSA怠硼、AES、chacha20 等常用方式做進(jìn)一步的存儲加密移怯。

常見的數(shù)據(jù)存儲方法

Android 為我們提供了很多種持久化存儲的方案香璃,存儲實(shí)際就是把特定的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化成可以被記錄和還原的格式,這個數(shù)據(jù)格式可以是二進(jìn)制的舟误,也可以是 XML葡秒、JSON、Protocol Buffer 這些格式。

對于閃存來說眯牧,一切歸根到底還是二進(jìn)制的蹋岩,XML、JSON 它們只是提供了一套通用的二進(jìn)制編碼格式規(guī)范学少。

1. 關(guān)鍵要素

既然有那么多的數(shù)據(jù)存儲的方案剪个,那我們在選擇數(shù)據(jù)存儲方法時一般需要考慮哪些關(guān)鍵因素呢?這里直接借鑒大神的總結(jié)給你版确。

要素 描述
正確性 選擇存儲方案的時候扣囊,第一個需要判斷它是否靠譜。這套存儲方案設(shè)計(jì)是否完備绒疗,有沒有支持多線程或者跨進(jìn)程同步操作侵歇。內(nèi)部是否健壯,有沒有考慮異常情況下數(shù)據(jù)的檢驗(yàn)和恢復(fù)吓蘑,比如采用雙寫或者備份文件策略惕虑,即使主文件因?yàn)橄到y(tǒng)底層導(dǎo)致?lián)p壞,也可以一定程度上恢復(fù)大部分?jǐn)?shù)據(jù)士修。
時間開銷 這里說的時間開銷包括了CPU時間和I/O時間枷遂,I/O操作相比CPU和內(nèi)存樱衷,I/O存儲的速度是非常慢的棋嘲。但是如果存儲方法中比如編解碼或者加密/解密等設(shè)計(jì)的比較復(fù)雜,整個數(shù)據(jù)存儲過程也會出現(xiàn)CPU時間變得更長的情況矩桂。
空間開銷 即使相同的數(shù)據(jù)如果使用不同的編碼方式沸移,最后占用的存儲空間也會有所不同。舉一個簡單的例子侄榴,相同的數(shù)據(jù)所占的空間大小是XML>JSON>Protocol Buffer雹锣。除了編碼方式的差異,在一些場景我們可能還需要引入壓縮策略進(jìn)一步減少存儲空間癞蚕,例如zip蕊爵、lzma等。數(shù)據(jù)存儲的空間開銷還需要考慮到內(nèi)存空間的占用量桦山,整個存儲過程會不會導(dǎo)致應(yīng)用出現(xiàn)大量GC攒射、OOM等蒂破。
安全 應(yīng)用中可能會有一些非常敏感的數(shù)據(jù)缺前,即使它們存儲在data/data中,我們依然必須將它們加密诫隅。根據(jù)加密的強(qiáng)度不同钉凌,可以選擇RSA咧最、AES、chacha20、TEA這些常用的加密算法矢沿。
開發(fā)成本 有些存儲方案看起來非常高大上滥搭,但是需要業(yè)務(wù)做很大改造才能接入。這里我們當(dāng)然希望無縫的接入到業(yè)務(wù)中捣鲸,在整個開發(fā)過程中越簡單越好论熙。
兼容性 業(yè)務(wù)不停地向前演進(jìn),我們的存儲字段或者格式有時候也會不得不有所變化摄狱。兼容性首先考慮的是向前脓诡、向后的兼容性,老的數(shù)據(jù)在升級時能能夠遷移過來媒役,新的數(shù)據(jù)在老版本能否降級使用祝谚。兼容性另外一個需要考慮的可能是多語言的問題,不同的語言是否支持轉(zhuǎn)換酣衷。

那上面這些要素哪個最重要呢交惯?數(shù)據(jù)存儲方法不能脫離場景來考慮,我們不可能把這六要素都做成完美:如果首要考慮的是正確性穿仪,那我們可能需要采用冗余席爽、雙寫等方案,那就要容忍對事件開銷產(chǎn)生的額外影響啊片。同樣如果非常在意安全只锻,加解密環(huán)節(jié)的開銷也不必可少。如果想針對啟動場景紫谷,我們希望選擇在初始化時間和讀取時間更有優(yōu)勢的方案齐饮。

2. 存儲選項(xiàng)

總的來說,應(yīng)用需要結(jié)合使用場景選擇合適的數(shù)據(jù)存儲方法笤昨。Android 為應(yīng)用提供的數(shù)據(jù)存儲方法你可以參考存儲選項(xiàng)祖驱,總體看有下面幾種方法。

  • SharedPreferences
  • ContentProvider
  • 文件
  • 數(shù)據(jù)庫

3. 數(shù)據(jù)存儲選項(xiàng)

  • Serializable
  • Parcelable
  • Serial(Twitter 開源)

它們的原理以及源碼解析你可以參考文章開頭給出的分析系列瞒窒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捺僻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崇裁,更是在濱河造成了極大的恐慌匕坯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寇壳,死亡現(xiàn)場離奇詭異醒颖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)壳炎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門泞歉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逼侦,“玉大人,你說我怎么就攤上這事腰耙¢欢” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵挺庞,是天一觀的道長晰赞。 經(jīng)常有香客問我,道長选侨,這世上最難降的妖魔是什么掖鱼? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮援制,結(jié)果婚禮上戏挡,老公的妹妹穿的比我還像新娘。我一直安慰自己晨仑,他們只是感情好褐墅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洪己,像睡著了一般妥凳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上答捕,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天逝钥,我揣著相機(jī)與錄音,去河邊找鬼噪珊。 笑死晌缘,一個胖子當(dāng)著我的面吹牛齐莲,可吹牛的內(nèi)容都是我干的痢站。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼选酗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芒填?” 一聲冷哼從身側(cè)響起呜叫,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤殿衰,失蹤者是張志新(化名)和其女友劉穎朱庆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闷祥,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娱颊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箱硕。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拴竹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剧罩,到底是詐尸還是另有隱情栓拜,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布惠昔,位于F島的核電站幕与,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏镇防。R本人自食惡果不足惜纽门,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望营罢。 院中可真熱鬧赏陵,春花似錦、人聲如沸饲漾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽考传。三九已至吃型,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間僚楞,已是汗流浹背勤晚。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泉褐,地道東北人赐写。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像膜赃,于是被迫代替她去往敵國和親挺邀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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