2012年4月4日水曜日

APK Expansion Filesのサンプルを動かしてみた


超久々にブログを更新。
APK Expansion FilesというAndroidの機能をちょっと使ってみたので、そのときのメモ。


APK Expansion Filesとは


 APK Expansion Filesとは、50MBまでのAPKファイル以外に、2GBまでのファイルを二つまでGooglePlayからダウンロードしてくる仕組み。

GooglePlayの開発者コンソールで、APKの他に、2つの2GBまでのファイルを登録できる。
2つのファイルは、mainとpatchという種類で登録できる。


ファイル名


 この2つのファイルは、アップロードするファイル名に関係なく以下のファイル名でダウンロードされる。

[main|patch].<expansion-version>.<package-name>.obb

main or patch
 GooglePlayの開発者コンソールで選択したタイプ。

<expansion-version>
 APKのバージョン。マニフェストファイルのandroid:versionCode。

<package-name>
 JAVAスタイルのパッケージ名。


ダウンロードパス


ダウンロードされるパスは以下の場所、

<shared-storage>/Android/obb/<package-name>/

<shared-storage>
 getExternalStorageDirectory()で取得できる、外部ストレージのパス。

<package-name>
 getPackageName()で取得できる、パッケージ名。



obbファイルがダウンロードされるタイミング


GooglePlayからAPKと一緒にダウンロードされる場合と、APKファイルだけがダウンロードされる場合がある。
なので、アプリ起動時にobbファイルが正しくダウンロードされているか調べて、ダウンロードされていなければGooglePlayからダウンロードするコードをアプリに入れなければならない。(これが面倒。なんで必ずダウンロードしてくるようにならないんだろう?)


サンプル


このダウンロード処理のサンプルが用意されている。
SDK の下にインストールされる extras/google/market_apk_expansion/downloader_sample/ 


サウンプルを動かしたときのメモ

  • サンプルは、bbファイルがZIP形式のファイルであることが前提なので、テストするときはZIPファイルを用意すること。
  • サンプルは、なぜかCRCチェックが合わずにValidationエラーになる。
  • ファイルサイズと、バージョン番号を変え忘れないように。
  • 公開鍵の部分を書き換えないと、例外で落ちる。
  • テストは、GooglePlayの開発者コンソールで「保存」をすれば、「公開」しなくてもbbファイルのダウンロード可能。
  • 古いバージョンのbbファイルは、開発者コンソールで削除しない限りダウンロード可能。


6 件のコメント:

  1. Really nice! Thank you very much!

    返信削除
  2. 拡張ファイルの機能を実装中ですが「download failed because resources could be no found]」と表示され、正常に動作しません。ちなみにgoogle play store にはしっかりapkファイルとリソースファイル(圧縮版)をアップロードしております。お手数ですが、ご教授いただければ幸いです。

    返信削除
  3. >匿名さん
    はじめまして。
    私もAPK Expansion Filesのテストアプリを起動したことがあります。
    以下のことを確認してみて下さい。

    1. アップロードしてからどれくらい時間はどれくらい経ちましたか?
    アップロードしてから最大2時間掛かることがあるそうなので少し待ってみて下さい。

    2. 追加アカウントの場合、テストアカウントは登録されているでしょうか?
    デベロッパーコンソールに登録したアカウント以外(追加アカウント)でテストする場合
    「プロフィール編集」→「テストアカウント」にGmailアドレスと登録する必要があります。

    返信削除
  4. >匿名さん

    お返事ありがとうございます。
    お返事にもあるとおり、アップロードによるタイムラグが原因だったようです。
    時間をおいてから確認したら無事に起動しました。
    本当にありがとうございました。

    大変失礼ではありますが、重ねて質問させてください。
    SDカード内にダウンロードした「OBBファイルの読み込み」についてです。
    公式ドキュメントにある

    ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(appContext,
    mainVersion, patchVersion);

    InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

    という処理を組み込んでいますが、fileStreamの値がnullになってしまいます。
    pathToFileInsideZipにはOBBファイルへのフルパスを入れていますが、この部分が間違っているのでしょうか?
    重ねて申し訳ありませんが、ご教授をいただければと思います。
    どうぞ、よろしくお願い致します。

    返信削除
  5. >匿名さん(2012年7月19日 0:42の方)
    「匿名2012年7月18日 19:51」に発言した者です。
    私のサンプルが古いためそちらのコードは初めてだったため少し調べてみました。
    そこで以下のことを確認してみてください。

    ①. pathToFileInsideZipのファイルパスが合っていますか?
    恐らく以下のように取得するのと同じ値になっていると思います。
    String zipPath = android.os.Environment.getExternalStorageDirectory().getPath()+"Android/obb/"+"【ファイル名(例:main.1.com.test.obb)】"
    この場合のzipPathとpathToFileInsideZipは同一の値になると思います。
    なっていない場合は恐らくパスが間違っていると考えられます。

    ②. ファイルアクセスすることができますか?
    obbファイルも所詮はただのバイナリデータ。
    そのためファイルに直アクセスできるかどうか確認してみてください。例えば、
    File file = new File(pathToFileInsideZip);
    これでもしfileにnullが返ってくるようでしたらパスが間違っている、
    もしくはファイルがないかどちらかだと考えられます。

    ひとまず上記の2つを試してみてください。

    それでもダメな場合は引数で使っている
    mainVersion、patchVersion、pathToFileInsideZip
    の値を具体的に教えて下さい。

    返信削除
  6. すみません。誤りがありましたので訂正いたします。
    <誤>
    String zipPath = android.os.Environment.getExternalStorageDirectory().getPath()+"Android/obb/"+"【ファイル名(例:main.1.com.test.obb)】"

    <正>
    String zipPath = android.os.Environment.getExternalStorageDirectory().getPath()+"Android/obb/"+"【パッケージ名(例:com.test)】/"+"【ファイル名(例:main.1.com.test.obb)】"

    返信削除