2011年1月15日 星期六

[Android] Gingerbread: StorageManager and Obb

在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, 怪怪的