Help us understand the problem. What is going on with this article?

Androidの拡張ファイル(.obb)の罠

More than 3 years have passed since last update.

Androidアプリのサイズが100MBを超えるとapkとobbに分割する必要がある。
しかし一部の端末でobbが読み込めずアプリが正常動作しないというバグがある。
再現条件や対処法について書く。

TL;DR

  • 根本的な解決策はなさそう:innocent:
    • 何かご存じの方いらっしゃいましたらぜひコメント等で教えて下さい!:bow:
  • 端末を再起動すると何故か読めるようになる:confused:
  • Samsung製:milky_way:端末全般、ZTE製MO-01Jで再現した
  • 結論
    • 100MB超えないようにする:arrow_double_down:
    • それができない場合はREAD_EXTERNAL_STORAGEパーミッションを付加することで回避:disappointed_relieved:

対象読者

Androidアプリ開発者

問題にぶち当たった経緯

Unityで大きな動画ファイルを内包したアプリを開発していた。
いよいよ公開準備という段になり、念のためPlayストアからクローズドβテストを行った。
するとあるSamsung製端末で最初のシーン以降が動作しない(最初のシーンから次のシーンに遷移できない)という現象が発覚した。
テスト時はうまく行っていたのに…:sob:

違いといえばストアに公開するためapkを分割したことくらいである。
(それまでは巨大なapk1つでインストールしていた)

調査開始

ログを見る

特にエラーは出ていない。
シーン切り替え部分で処理が進まなくなっているように見える。

obbが無いのでは?

ちょうど2つ目のシーンから先に進めないので、obbが無いと考えると辻褄が合う。
(※apkには1つ目のシーンだけが含まれ、obbにはその他が含まれる)
ファイラーアプリでAndroid/obb/[package name]を見てみると、obbは確かに存在している。
バイト数も一致しているし、ファイルが無い・壊れているということではなさそう。

obb無しでインストール

apk+obbに分割ビルドしたものを、apkファイルだけでインストールしてみた。
すると最初のシーンは正常に動作し、2つ目のシーンから先に進めない。
今回の事象と同じ挙動になった。
ますますobbがあやしい。

obbを手動でインストール

このあたりを参考にapk+obbを手動でインストール。
https://www.quora.com/How-can-I-install-OBB-data-file-on-an-Android/answer/Gangani-Roshan
しかし再現しない。2つ目のシーンも正常に動作する。
(apk+obbを手動でインストールする方法については後でまとめたい)

いろいろ試す

タスクキル→動作せず:neutral_face:
再インストール→動作せず:frowning2:
端末再起動→正常動作!:open_mouth:

ググる

色々なキーワードでググッた結果、シンプルに「android obb bug」でそれらしい結果がヒット!
APK with expansion file (OBB) fails to load the second scene until the phone has been restarted
タイトルがまさに今回の事象にジャストフィット。

a regression (bug) appeared and Android apps now requires again the "WRITE_EXTERNAL_STORAGE" permission if they use obb files (source, that was very difficult to find...). Unity did not patch this as this is more of an undocumented android bug, but there we are... Now, the fix that made the trick for us is the following: in your custom Assets/Plugins/Android/AndroidManifest.xml, make sure you require WRITE_EXTERNAL_STORAGE permission on all versions of android and not up to maxSdk 18:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" />

Androidのバグ…?

https://issuetracker.google.com/issues/37544273#comment11
インストール時と再起動後でオーナーが違うらしい…度し難い…

やってみる

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE">
を追加すれば良いらしい。ということでやってみた。

…動いた!

参考

あとがき

Samsung製端末といえばBluetoothスピーカーの音量が小さすぎるバグがあったなぁ…

harigel
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした