📱

[UE5]超やさしいAndroidアプリをGoogle Play Consoleで内部テストできるまで

2023/12/20に公開

はじめに

超やさしいシリーズ第2弾です。
UE5でAndroidアプリを作成し、実機テストがうまくいったのでGoogle Play Storeにリリースしようと思ったのですが、パッケージ化してできたapkやらobbやらaabやら何のファイルがどう必要なのか全くわからず、調べれば調べるほど沼にハマり、マウスより重いものが持てなくなるほど極限状態になりかけたころ、ようやく内部テストができたその結果がまさかの容量オーバーだったことに気づかされました。
クッ、さすが内部テスト・・・!バタッ
このようにかなり奮闘したのでその備忘録と、参考記事が少なすぎて挫折しかけた私のような犠牲者を生まないための救済措置です。

内部テストってなぁに?

Google Play Storeでリリースするまでに、以下の手順で進める必要があります。

  1. aabファイルの作成
  2. 内部テスト
  3. クローズドテスト(内部テストを行えばスキップ可)
  4. オープンテスト(内部テストを行えばスキップ可)
  5. 製品版審査
  6. リリース

配布用にビルドしたものをアップロードし、デバッグを繰り返すのが内部テストのフェーズであり、配布用の致命的なエラーはここで解決します。
このフェーズで実際にアプリをストア(非公開)からダウンロードし、プレイすることができるようになります。
プレイするテスターは、テスターとして登録した人にリンクを送付する形で共有、インストールすることができ、本番に近い環境でテストすることができます。

内部テストのフェーズまで進められれば、あとはなんとかなると思います。
しかし、この内部テストにたどり着くまでがなかなかに苦労しましたし、内部テストでも苦労しました。

記事内で説明しないこと

  • Google Play Consoleの登録方法
  • 広告付きアプリの設定
  • Contents Delivery Network(CDN)での配信方法
  • Google PADのfast-follow、on-demandでのpakファイル配信
  • 内部テストより先の進め方

開発環境

  • Windows11
  • UE5.1.0
  • Visual Studio2022
  • Android Studio 4.0

検証端末

Xperia 1 Ⅱ(Android 12)

事前準備

  • Google Play Consoleの登録
  • Androidパッケージ化が可能なプロジェクトの用意

Google Play Consoleの登録に関しては、次の記事が参考になります。
https://yakiimosan.com/android-dev-account-step/
25ドル必要なのと、登録完了まで数日かかる場合があります。

全体の流れ

  1. パッケージ化してアプリサイズを確認する
  2. アプリサイズによるプロジェクト設定
  3. 内部テストにaabをアップロード
  4. 実機端末でプレイ

1. パッケージ化してアプリサイズを確認する

1.1. キーストアの作成

公式ドキュメント通りに進めます。
Android Studioをデフォルト設定のままインストールした場合、C:\Program Files\Android\Android Studio\jre\bin\keytool.exeにあります。
管理者権限でコマンドプロンプトを開き、keytoolのパスまで移動します。
Windows11の場合、スタートボタンを右クリックすると、ターミナル(管理者)という項目があるのでそれを実行します。

プロンプトが出てきたら、下のコードをコピーしてプロンプトに貼り付けてEnterを押します。

cd C:\"Program Files"\Android\"Android Studio"\jre\bin\

次は下のコードをコピーして、プロンプトに貼り付けてEnterを押します。

keytool -genkey -v -keystore ExampleKey.keystore -alias MyKey -keyalg RSA -keysize 2048 -validity 10000

入力例を貼っておきます。

完了すると、C:\"Program Files"\Android\"Android Studio"\jre\bin\ExampleKey.keystoreが生成されているので、~\プロジェクト\Build\Android\に移動させます。

1.2. キーストアの情報をプロジェクト設定に入力する

プロジェクトを起動してプロジェクト設定を開きます。
「Project Settings」→「Platforms」→「Android」の中に、「Distribution Signing」があるので、そこにキーの情報を記入します。パスワードはご自身で設定したものを入力してください。

1.3. 配布用のプロジェクト設定をする

「Project Settings」→「Project」→「Packaging」

List of maps to include in a packaged buildの項目は、私のプロジェクトによるものなので0で大丈夫です。

「Project Settings」→「Platforms」→「Android」

Minimum SDK VersionTarget SDK Versionはご自身の環境に直してください。
Key Store Passwardも先ほど生成した際に入力したパスワードを入力してください。

1.4. Androidでパッケージ化する

下記画像のようにパッケージ化します。

Androidの項目におなじみのドロイド君が出ていない場合、Android SDKの設定がうまくいっていない可能性がありますが、一度パッケージ化してみることをおすすめします。
たまにSDKの設定がうまくいっているのにドロイド君が出現せず、そのまま続けると成功するパターンが何度かあったからです。
下記画像が出ても一旦Continueしてみましょう。

パッケージ化が終わったらフォルダを開き、obbファイルのサイズを確認します。

私のアプリの場合は約0.7GBになりました。

apk、obb、aabってなに?
apkとは

Android Application Packageの略称で、Windowsでいうexe拡張子と同じ位置。
Windowsでソフトウェアをインストールする際、exe拡張子を実行すると思いますが、Andoridの場合はapk拡張子を実行することでアプリをインストールできます。

aabとは

Android App Bundleの略称で、様々なAndroid端末に最適なapkを提供する拡張子。
Androidは様々なメーカーが独自の端末として製品化しており、apkを様々な端末に合わせるのは大変なので、「デバイスたくさんあって最適なapkの生成がめんどい?そんならわいが最適なapk生成して提供しとくで?」と開発者なら思わずトゥンクしてしまう仕事人なのです。
Google Playだけでなく、他のアプリストアでも使えます。

UEの場合、標準でaabを出力する設定になっていないので、プロジェクト設定をいじる必要があります。

obbとは

Opaque Binary Blobの略称で、一応こいつにUEで作ったアセットたちが入っています。
なのでUEで最適化を施し、各種アセットのサイズを落とせばobbのサイズも落ちることになります。
存在意義的にはapkを拡張するためのものらしく、apkのダウンロードと同時にobbもダウンロードされ、追加コンテンツのダウンロード的な奴は不要でアプリインストール後すぐに開始できるようにするためのものらしいです。

2. アプリサイズによるプロジェクト設定

ここからアプリサイズによって対応が変わります。
種類でいうと3パターンあり、上がより実装が簡単なパターンです。

  1. 1.0GB以内
  2. 1.5GB以内
  3. 1.5GB超え

2.1. 1.0GB以内

chunkの生成をオンに、Google PADのプラグインをオンにする必要があります。

chunkとは?

アプリの追加コンテンツや、よくゲームにあるDLCのような、アセットが詰め込まれたパッケージの1単位をchunkと呼んでいます。

基本的にGoogle Play Consoleは150MBを超えるアプリはアップロードできません。
しかし、chunkを生成し、Google PADを利用することで150MBを超えるアプリをアップロードすることができるようになります。
Google PADについては、以下のプルダウンを読んでください。

Google PADとは?

Google Play Asset Delivery(Google PAD)は、CDNを使わずとも大容量のアセットを柔軟に配信できるようにする仕組みです。
UEにはGoogle PADのプラグインが標準装備されており、有効にすると専用のノードが使えるようになります。
Google PADには3つの配信モードがあり、以下それぞれの説明です。

・install-time

アプリのインストールと同時にダウンロード・インストールされるアセットパックです。
アプリインストール後すぐに使えるため、起動に必要なUIや、起動後すぐに再生するオープニングムービー等はここに含める必要があります。
また、Playストアに表示されるアプリサイズはこのアセットパックを含めた合計サイズになります。
このアセットパックに含められる合計サイズは1.0GBです。

・fast-follow

アプリのインストール完了後、すぐに自動でダウンロードされるアセットパックです。
このアセットパックは正直使いどころが微妙(Google様ごめんなさい)で、インストール完了後にダウンロードが開始するため、インストール完了直後にアプリを開くとこのアセットパックに含めたアセットたちは使えない可能性があります。
上記のことから、fast-followを利用するということはエラーハンドリングをしなければならないという意味でもあります。
どうせエラーハンドリングするなら次のon-demandを利用した方がいいと思います。
また、Playストアに表示されるアプリサイズはこのアセットパックも含めた合計サイズになります。
このアセットパックに含められる合計サイズは512MBです。

・on-demand

アプリ実行中に、任意のタイミングでダウンロードできるアセットパックです。
このアセットパックは削除することも可能で、必要に応じてダウンロードして使用、必要なくなったら削除ができるため、ベースのアプリサイズを小さくして、追加で大きいアセットをダウンロードすることでストレージに優しい設計にできます。
まあそのぶん通信量がかかりますので、Wi-fi必須ですね。
このアセットパックに含められる合計サイズは512MBです。

obbが1.0GB以内であればinstall-timeを利用することで内部テストにアップロード可能になります。
設定はとても簡単です。
「Project Settings」→「Project」→「Packaging」のGenerate Chunksをtrueにします。

「Plugins」からGooglePADを有効にし、再起動します。

「Project Settings」→「Plugins」→「GooglePAD」のEnable PluginOnly Distributionをtrueにします。

あとはAndroidでパッケージ化するだけです。

2.2. 1.5GB以内

おやおや、ギリギリ1.0GBを超えてしまったそこのあなた。
おめでとうございます。ここからは少し面倒な作業が待っています。

見事ここに入ってしまった皆様は、

  1. install-timeとfast-followを使う
  2. install-timeとCDNを使う

このどちらかの対応を取る必要があります。
下の雑談にも書きましたが、1のfast-followを使うのはやめておいた方がいいです。
おとなしくAWSかAzure等でCDNを作りましょう。

2.3. 1.5GB超え

この場合も先ほどと同様に、

  1. install-time、fast-follow、on-demandを使う
  2. install-timeとCDNを使う

このどちらかで対応する必要があります。
大事なことなのでもう一度言いますが、fast-follow、on-demandを使うのはやめておいた方がいいです。
誤解を招きそうなので言っておきます。私は決してGoogleアンチではありません。

2.4. 雑談

様々なアプリをダウンロードしている皆様ならお気づきかもしれませんが、大体のアプリはCDNで配信されています。
on-demandに関しては分かりませんが、少なくともfast-followを使っているアプリを私は見たことがありません。
おそらくCDNを作ればiOSにも対応できるからでしょう。Google PADはAndroidだけですからね。
サーバーレスで大容量アセットに対応できるのは素晴らしいですが、iOSと同時に開発している場合は開発コストが増えるのが難点かと。

ここから私の苦労話。

まず前提として、Google PADやCDNに限らず、Runtime時にアセットを追加でダウンロードした場合、Mountという処理を実行しないと使えるようになりません。
UEにはMountノードを含め、Mobileの開発に必要なノードはMobile Patchingというカテゴリの中に詰め込まれています。
最初私は1.4GBのアプリケーションを生みだしてしまい、「CDNとかよくわからんからfast-followつーかお」と色々調べてやってみましたが、どうしてもMountができず、fast-followを使うのは諦めました。
結局AWSのCloudFrontとS3を使ってCDNを作ることになりましたが、結構すんなり作れたのでfast-followを使うか悩んでいる方にはCDNをおすすめします。
お金はかかりますけどね・・・。
このCDNを作って対応させた話は長くなるので割愛しますが、参考記事のリンクは下の参考文献のところに貼っておきます。
いつか記事にできればいいなあ(+_+)

3. 内部テストにaabをアップロード

3.1. Google Play Consoleでアプリを作成する

Google Play Consoleにログインします。
ホームの右上にあるアプリを作成ボタンをクリックします。
アプリ名、有料か無料等の情報を入力し、右下にあるアプリ作成をクリックします。

作成が完了するとダッシュボードが表示されます。

3.2. 署名鍵の設定

左側のリリースの項目の内部テストをクリックし、新しいリリースを作成します。

App Bundleの署名鍵を選択をクリックし、ポップアップのGoogle生成の鍵を使用をクリックします。

数秒後、先ほどの警告が消えて、リリースはGoogle Playで署名されていますとなればOKです。

3.3. App Bundleをアップロードする

aabファイルをアップロードします。
サイズによってはアップロードに少し時間がかかるので、その間に下のリリース名とリリースノートを記入しましょう。

ここのリリース名は、Google Play Console内のApp Bundleの識別に使われるだけなので、なんでもいいですし、次のアップロードのときに同じ名前でも問題ありません。無難にバージョンにしておきます。
内部テストなのでリリースノートを書く必要はないですが、一応使われる場所は下記画像のところです。

aabのアップロードが終わったら次に進みます。

3.4. エラーを解消する

すみません、この記事用のaabを作るのがめんどかったので、aabをアップロードした体で記事は続きます。ご了承ください・・・。

おそらくエラーがたくさん出ているので、このエラーをなくすとようやく内部テストができるようになります。
警告は解消しなくても内部テストできます。

それぞれの項目に対して、〇〇に移動というリンクがあるので、一つ一つリンク先に飛んで対応するだけです。
チェックをつけるだけの項目がほとんどなので、ご自身のアプリに合わせて記入していってください。
エラー項目が全てなくなると右下の保存ができるようになります。

3.5. テスターを登録する

内部テストをインストールできるテスターを登録します。
この登録をしないと、インストール前の認証で弾かれてしまいます。

メーリングリストの作成をクリックします。

リスト名はチーム名だったり、部署名だったり、なんでもいいです。
自分のメアドを登録して変更を保存をクリックします。

作成したリストにチェックを入れ、フィードバック用のメアドを設定します。
これも自分にしておきます。

下のリンクをコピーをクリックし、スマホからアクセスできるようにメールかSNS等で保存しておきます。

4. 実機端末でプレイ

先ほど保存したリンクにスマホからアクセスします。
メールリストに登録してあるGoogleアカウントなら以下の画面がでてきます。

リンクをクリックすると、Google Playの画面に遷移し、非公開の内部テストアプリのインストールができるようになります。

これにて内部テストの一連の流れは終わりです。
あとは内部テストで問題がなくなるまでひたすらパッケージ化とテストを繰り返します。

2回目以降の内部テストの流れ

ちなみにaabをアップロードして保存をした時点でそのStore Versionはもう使えないので、UEのプロジェクト設定で+1する必要があります。

なので、2回目以降の流れとしては、
UEのプロジェクト設定でStore Versionを+1する → パッケージ化する → 新しいリリースを作成する → aabをアップロードする → 実機端末にインストールし、テストする
この繰り返しです。

まとめ

正直初めてのモバイル開発はしんどいことが多すぎました。
わからないことだらけのまま進めて、合ってたかもわからないまま先へ先へ・・・。
今回の開発でAndroidとiOSの開発の両方を経験し、ストアへのパブリッシュまでの要領がわかったので、この経験をみんなと分かち合って、面白いUE製のアプリがどんどん配信されることを願っています。

参考文献

https://docs.unrealengine.com/5.1/ja/using-google-play-asset-delivery-in-unreal-engine/
https://docs.unrealengine.com/5.1/ja/cooking-content-and-creating-chunks-in-unreal-engine/
https://www.docswell.com/s/EpicGamesJapan/5Q14NZ-ue4-95204920#p1
https://www.docswell.com/s/EpicGamesJapan/5RQMEK-ue4-chunk-id#p1
https://www.docswell.com/s/EpicGamesJapan/56G8XK-UFE21w_Xeen_Seiken3_Mobile#p1
https://japanese-rooster.com/game-61
https://qiita.com/kotarotaro_A/items/97140ec8f9e4ddd7738c
https://habr.com/ru/articles/534212/
https://habr.com/ru/companies/socialquantum/articles/572554/
https://unrealengine.hatenablog.com/entry/2016/12/04/000000
https://qiita.com/EGJ-Kaz_Okada/items/f18bca3fb5c8fc1aea9c
https://note.com/yu_rien/n/nf892f6d1182c
https://qiita.com/aguroshou0413/items/dfb53ba145f3cbb3e8c3

おまけ エラー解決集

Invalid keystore format

キーストアを作成して、プロジェクト設定にキーストア情報を記入してパッケージ化すると発生するエラー。
おそらくAndroid Studioが原因だった。
デフォルトの設定のままでAndroid Studio4.0をインストールし、公式ドキュメント通りにやれば普通にできたが、何がだめだったのかわからない。
Oracle JDKのkeytoolを使うとか、Android Studioのバージョンを上げるとかでは解決できなかった。
ちゃんとプロジェクト設定のJDKに使用しているC:\Program Files\Android\Android Studio\jre\bin\keytool.exe管理者権限のコマンドプロンプトから実行すること。
一応関係ありそうな設定のところをスクショで載せておく。

d8.exeとd8.jarはdxに直すべき?

記事を調べてたら、C:\Users\~\AppData\Local\Android\Sdk\build-tools\〇〇(〇〇はSDK build toolsバージョン)の30以上のバージョンに入っているd8.exe\lib\d8.jardx.exedx.jarに直すという記事をちらほら見かけたが、変更しなくても問題なくできた。
やらなくてもよいと思われる。

aabファイルにobbファイル(chunk0)が含まれない

赤枠で囲った設定がtrueだと含まれないっぽい。
チェック外すとしっかり含まれるようになった。

attribute ‘split’ in tag is not a valid split name.

chunkファイル名にハイフンが入っているのが悪い?
デフォルトだと、pakchunk1-Android_ASTC.pakのような名前だと思うが、pakchunk1.pakに変更し、フォルダ名も変更する。
pakchunk1.pakを例にすると、\Build\Android\gradle\assetpacks\fast-follow\pakchunk1\src\main\assetsに配置する。

サイズ変わるようなことしてないのにサイズオーバー的なエラーが出る(エラー文忘れた)

プロジェクトフォルダにあるDerivedDataCacheIntermediateSavedを削除して再度ビルドすると大抵直る。

急にaabファイルの容量が増えた

aabファイルの中身を見てみる。
私はWinRARから開いて確認してる。
私の場合、急に増えた原因は本来fast-followに入るであろうpakchunk1が含まれていた。
pakchunk1をaabから排除するために、プロジェクトフォルダのConfig\DefaultEngine.iniの一番下に下記のコードを追加する。

[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
+ObbFilters="-*pakchunk1*"
fast-follow、on-demandのMountができません!!!

Mountノードの中身を見てみると、Manifestファイルの有無をif文で判断し、なければfalse = Mount失敗を返します。
なのでManifestファイルを用意しなければなりませんが、残念ながらfast-follow、on-demandのManifestファイルの作り方がわかりませんでした・・・泣。
DLC絶対マウントするニキ、こっそり下のコメントで教えてください。

内部テストのリンクからインストールした際に、fast-followのダウンロードが開始せずインストールが完了してしまう or 前のバージョンのまま更新されてない

内部テストでaabのアップロードが完了した後、すぐにリンクを踏んでインストールした際に発生する。
おそらく新しいaabアップロード後から、リンク先のアプリが更新されるまでのラグが原因。
アップロード完了してリリースを保存したら一旦落ち着いてティータイムでも挟むと良い。
私は10分後くらいに再度インストールすると正常になった。

このプラグインだけはオフにしてはいけない
  • Asset Mannager Editor
    アセットがどのchunkに含まれているかと、参照関係を調べるのに超便利なAsset AuditとReference Viewerが消え去るので絶対にオフにしてはいけない。反省。

  • CryptoKeys
    アセットの暗号化をするのに必要な「Project Settings」→「Project」→「Encryption」が消え去るので絶対にオフにしてはいけない。反省。

libUnreal.soが見つからない的なエラー(エラー文忘れた)

「Project Settings」→「Project」→「Android」のStore Version offset(arm64)の値を0にしたら直った。
もしかしてこれいらないの?

Discussion