Android 4.4(KitKat)における OBBがマウントできない不具合の修正がいつになるかわからないので zipファイルとして作成してマウントしないで使う方法を研究。
zipファイル末尾にある EOCDレコードからファイル数を得ているのだけど、unsigned shortを singed shortとして読んでいるので 32768個以上のファイルがあるとファイル数が負数になってちゃんと読んでくれない。
他の箇所ではちゃんと対処しているのにここだけ抜けているんだよな。
と言うわけでパッチ。
asahina@lachesis:~/t/zip_file$ patch -p1 <ZipResourceFile_numEntries.diff
patching file src/com/android/vending/expansion/zipfile/ZipResourceFile.java
これで期待通り動作するようにはなったのだけど、ZipResourceFileってインスタンス作成時にインデックスを全て読み込むのだけど、このバグにひっかかるようなレベルだとかなりの時間を要する。
非圧縮のアーカイブなので動き出してしまえば動作速度自体は気になるような物ではないのだけど、インデックス読込で数十秒はざら。*1
まぁ 初回とメモリ不足で殺された時だけなので良しとしよう。
修正パッチを書いたついでに Android 4.4(KitKat)から追加された context#getObbDirs()への対応*2 &パッチファイルが無視されるバグの修正*3 パッチ。
asahina@lachesis:~/t/zip_file$ patch -p1 <APKExpansionSupport_getObbDirs.diff
patching file src/com/android/vending/expansion/zipfile/APKExpansionSupport.java