デ部第7回ミーティングの忘年会セッションで Android 2.3 での API 変更点を流し読みする企画があった。その際に OBB(Opaque Binary Blobs) というファイルを扱う API が追加されていたので調べてみた。
以下の情報は、gingerbread ブランチのソースコードを元に私が読み取った情報を含んでいます。当然公式の仕様ではないのであくまで参考程度にしてください。念の為。
OBBとは要するにディスクイメージファイルだ(StorageManager 参照)。
以下のことができる。
StorageManager の mountObb(...) でファイルシステム上のどこかにマウントされる。実際にどこにマウントされたかは getMountedObbPath(String) で取得できるので、このメソッドが返すパス文字列を元にファイルの読み込みを行うことになる。
また、OBB ファイル自体の情報を扱うためのクラスとして、 android.content.res.ObbScanner クラスが追加されている。 ObbScanner#getObbInfo(...) でOBB ファイルのメタ情報を読み込み、ObbInfo オブジェクトとして返してくれる。ObbInfo からは OBB ファイル形式のバージョンやフラグの情報が取得できる。
Android 2.3 Platform Highlights によると、OBB ファイルの作成は2011年リリース予定の SDK でサポートされるとのことなので現状では作成することはできない。そこで、ObbInfo の読み込み部分から OBB ファイルの構造を探ってみた(主に frameworks/base/libs/utils/ObbFile.cpp の bool ObbFile::parseObbFile(int fd))。
OBB ファイルは、ファイル先頭からの大部分がファイルシステム内のコンテンツになっていて、ファイルの末尾に OBBファイル自身のメタデータ(ソースコード中では footer と呼ばれている)が記述されている。メタデータ中の数値は全てリトルエンディアンに統一されていた。以下が OBB ファイルのメタデータの構造。
フィールド名 | フィールドサイズ(octet) | 説明 |
signature version | 4 | footer 形式のバージョン(1) |
package version | 4 | パッケージバージョン(?) |
flag | 4 | OBBファイルのフラグ。現状定義されているのはオーバーレイパッチかどうかのフラグ |
salt | 8 | コンテンツの暗号化に使用されているソルト |
package name size | 4 | パッケージ名のオクテット数(> 0) |
package name | package name size の値 | パッケージ名のUTF-8表現。パッケージ名はオーバーレイに関係する情報か? |
footer size | 4 | footer の先頭から、footer size フィールド直前までのサイズ(> 24)。 |
footer marker | 4 | このファイルが OBBファイルであることの目印(0x01059983 で固定)。 |
コンテンツ部分についてもそのうち調べる。
frameworks/base/tools/obbtool に OBB ファイルを作成するツールがある。ここにある mkobb.sh を見ると、コンテンツ部分のファイルシステムは vfat, 暗号化する場合は twofish らしい。
vE6aV4 <a href="http://eqwmagelpncp.com/">eqwmagelpncp</a>, [url=http://jwhaazzrzezv.com/]jwhaazzrzezv[/url], [link=http://ielnahgizeye.com/]ielnahgizeye[/link], http://netjhkafieny.com/
I77WvQ <a href="http://erxybugapbmp.com/">erxybugapbmp</a>, [url=http://ffhdyzfqwfvt.com/]ffhdyzfqwfvt[/url], [link=http://eeqnsapecmns.com/]eeqnsapecmns[/link], http://fukrxylwcfoj.com/