読者です 読者をやめる 読者になる 読者になる

キノコの自省録

ソフトウェアメインの技術ネタ、本の紹介など

Expansion Filesについて(1) - obb作成編

Android OBB

※13/07/16に、全面的に記事を修正しました。


Google Playでは50MBを越えるAPKをアップロードできません。
ただし、APKに付随する拡張ファイル(Expansion Files)を、本体のAPKとは別の拡張ファイルを2種類各2GB=4GBまでアップロードすることができます。
どうしても50MBに収まりきらないときは、この方法を取ることを検討します。
もし、何らかの形で50MBに収まるなら、頑張って収めた方がいいです。
結構面倒くさいです。


Google Playにアップロードする拡張ファイルは、どのような形式でも構いません。
zip, mp3, pdfでもなんでも構いません。
ただ、pngファイル詰め合わせやバイナリデータ詰め合わせなど、
複数のデータを1ファイルに詰め込む場合は、zipかobb形式を利用すると良いでしょう。

  • zipとobbの比較

obb形式とは、Opaque Binary Blobの頭文字で、
その中身は一種の暗号化付きディスクイメージファイルです。
つまり、USBのようにマウントしたりアンマウントしたりして使います。


obb形式は、マウントやファイル取り出しは高速に行えますが、
反面、未圧縮のため、ファイルサイズが大きくなります。
また、FAT16で作成される形式のため、
小さいファイルを大量に詰め込むと、obbファイルのサイズも実際よりかなり膨れ上がります。
zipはサイズが小さくなりますが、展開処理のコストがかかります。
あまりファイルが大きいと、起動に1分以上待たされるという状況になりかねません。


個人的にオススメなのは、mainの拡張ファイルをobbにして、
小さい変更はAPKに入れるか、patchの拡張ファイルをzipにして追加する方針です。
mainは基本的に更新せず、変更をapkとpatchで吸収する、というやり方です。

  • obbの作り方

(android sdk)/tools/jobb.batというバッチファイルがありますので、これを使うと作成できます。
jobbを実行すると、usageがコンソール上に流れますので、
それを参考にすれば特に問題なく作れると思います。
例)
jobb -pn jp.hogehoge.foobar -pv 1 -d c:\obb\data -o foobar.obb


−kオプションでパスワードを指定することができます。
パスワードは、マウント時に使用します。


なお、obb形式では、ルートディレクトリに512個以上のファイルを配置することはできません。
これは、obbがFAT16であるためです。
ルートのファイルが512を越えると、例外が発生してobbファイルの作成が止まります。
サブディレクトリなら65535個まで置けるので、
ファイル数が多い場合は、サブディレクトリを作成して、そこに配置しましょう。
当然、アプリケーション側にとっても参照するディレクトリが変更になることに注意してください。

  • 拡張ファイルのアップロード

作成した拡張ファイルをGoogle Playにただアップロードするだけでいいのですが、
アップロード箇所が意外とわかりにくかったりします。
拡張ファイルのアップロードは、APKファイルのアップロードが完了したときに表示される、
結果画面で実行できます。
この画面を閉じて、APKのアップロードをフィックスしてしまうと、
このバージョンのAPKに拡張ファイルをアタッチすることはできなくなります。
これはつまり、「APKのバージョンを更新しないと、拡張ファイルも更新できない」ということです。
拡張ファイルだけ更新したい場合であっても、
少なくともバージョン番号の異なるAPKを同時にアップロードする必要が有ります。
なお、拡張ファイルには、mainとpatchの2種類があります。
2013/07/14追記:
 リザルト画面は、初回APKアップロード時にはなぜか表示されません。
 つまり、1回アップロードした後、バージョンだけ変えてもう一回APKをアップロードする必要があります。


また、アップロードされた拡張ファイルは、
(main or patch).(version).(packagename).obb
というファイル名になります。
メインの拡張ファイルで、バージョン1、パッケージ名がjp.hogehoge.foobarなら、
main.1.jp.hogehoge.foobar.obbというファイル名になります。
中身がzipであろうとmp4であろうと、拡張子はobbになります。
非常にわかりにくいですが、
Googleは当初、obbファイルのみ受け付けることを想定していたのかなあと思います。


参考:
http://developer.android.com/google/play/expansion-files.html