[Android] Gingerbread: StorageManager and Obb

Reading time ~2 minutes

在Android Gingerbread引入了StorageManager這東西, 似乎是為了OBB(Opaque Binary Blobs)這功能而來的, 不過, 似乎是也還沒把tool含到SDK內, 也沒很詳細的說明文件, 所以看起來現在好像也沒啥人去用這個, 實際上試了一下, 最後還是有問題, 搞不好還有bug, 懶得繼續追下去了, 不過大致上理解怎來利用這東西

OBB是一個含有加過密的檔案系統的檔案, 唸起來頗繞口, 不過如果對Linux有點熟悉的話, 它是一個磁碟映像檔(image file), 最後會以loopback device的方式掛載入Android內(Android底層是Linux, 採用這種方式也不足為奇)

由於是加密過的, 所以, 應用程式可以把需要保密的內容放到這個檔內, 比如說私密的通訊資料庫啦, 或是見不得人的照片…(呃, 我講到哪去了)

要建立一個OBB的檔案需要幾個tool:

mkobb.sh

pdkdf2gen

obbtool

由於目前SDK好像還沒這幾個東西, 所以必須從aosp裡面去找, 前兩者是一組的, 要一起配合, 而且mkobb.sh只能在Linux底下跑, 如果你嘗試在Mac上跑(像我一樣), 是會失敗的 (不過想想, 目前沒支援Mac也很合理)

Linux下, 有幾個kernel module是一定必要被載入的

sudo modprobe cryptoloop

sudo modprobe twofish

sudo modprobe vfat

這樣你才可以建立一個被加密過的loopback file system image

執行的指令如下:

mkobb.sh -d obbdir -k password -o obbfile 

-d 後面那個obbdir可以改成任何一個存在的目錄, 建立好的obb檔會幫你含入所有這目錄裡面的檔案, -k 後面輸入加密的密碼, -o 後面加入輸出的檔名

執行後內容會如下:

最後一行裡的"5f88a3619e6544ef"這個salt很重要, 要抄下來, 之後會用到

接下來就要用obbtool加簽章了, obbtool用法如下:

加簽章: obbtool a -n com.yourcompany.app -v 1 obbtest.obb -s 5f88a3619e6544ef

移除: obbtool r ~/Dropbox/obbtest.obb

-n 後面是package name, 必須要跟你的應用程式的package name相同, -v 後面則是自定的版本, -s 後面接的就是剛剛做mkobb.sh後產生的salt了

這樣這個obb檔就完成了, 可以把它放到手機sdcard或其他地方讓你的程式存取

在程式內掛載obb的話就要用到StorageManager了:

不過目前, 我碰到的狀況就是, 明明state已經變成MOUNTED, 但我就是取不到mounted path, 怪怪的