[UE5]超やさしいAndroidアプリをGoogle Play Consoleで内部テストできるまで
はじめに
超やさしいシリーズ第2弾です。
UE5でAndroidアプリを作成し、実機テストがうまくいったのでGoogle Play Storeにリリースしようと思ったのですが、パッケージ化してできたapkやらobbやらaabやら何のファイルがどう必要なのか全くわからず、調べれば調べるほど沼にハマり、マウスより重いものが持てなくなるほど極限状態になりかけたころ、ようやく内部テストができたその結果がまさかの容量オーバーだったことに気づかされました。
クッ、さすが内部テスト・・・!バタッ
このようにかなり奮闘したのでその備忘録と、参考記事が少なすぎて挫折しかけた私のような犠牲者を生まないための救済措置です。
内部テストってなぁに?
Google Play Storeでリリースするまでに、以下の手順で進める必要があります。
- aabファイルの作成
- 内部テスト
- クローズドテスト(内部テストを行えばスキップ可)
- オープンテスト(内部テストを行えばスキップ可)
- 製品版審査
- リリース
配布用にビルドしたものをアップロードし、デバッグを繰り返すのが内部テストのフェーズであり、配布用の致命的なエラーはここで解決します。
このフェーズで実際にアプリをストア(非公開)からダウンロードし、プレイすることができるようになります。
プレイするテスターは、テスターとして登録した人にリンクを送付する形で共有、インストールすることができ、本番に近い環境でテストすることができます。
内部テストのフェーズまで進められれば、あとはなんとかなると思います。
しかし、この内部テストにたどり着くまでがなかなかに苦労しましたし、内部テストでも苦労しました。
記事内で説明しないこと
- 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の登録に関しては、次の記事が参考になります。
25ドル必要なのと、登録完了まで数日かかる場合があります。全体の流れ
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 Version
とTarget 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.0GB以内
- 1.5GB以内
- 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 Plugin
とOnly Distribution
をtrueにします。
あとはAndroidでパッケージ化するだけです。
2.2. 1.5GB以内
おやおや、ギリギリ1.0GBを超えてしまったそこのあなた。
おめでとうございます。ここからは少し面倒な作業が待っています。
見事ここに入ってしまった皆様は、
- install-timeとfast-followを使う
- install-timeとCDNを使う
このどちらかの対応を取る必要があります。
下の雑談にも書きましたが、1のfast-followを使うのはやめておいた方がいいです。
おとなしくAWSかAzure等でCDNを作りましょう。
2.3. 1.5GB超え
この場合も先ほどと同様に、
- install-time、fast-follow、on-demandを使う
- 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製のアプリがどんどん配信されることを願っています。
参考文献
おまけ エラー解決集
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.jar
をdx.exe
とdx.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
に配置する。
サイズ変わるようなことしてないのにサイズオーバー的なエラーが出る(エラー文忘れた)
プロジェクトフォルダにあるDerivedDataCache
、Intermediate
、Saved
を削除して再度ビルドすると大抵直る。
急に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