閉じる

ZipResourceFileのファイル数制限

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

*1 CPUと言うより、ストレージへのアクセスが物を言うらしい。

*2 ContextCompat@Support Libraryを呼ぶので 4.4未満でも OK

*3 これ、今まで誰も気がつかなかったのか?

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)