[Unreal Engine 4.26.2] Google Play ConsoleへAndroidのアプリを提出するときに発生したエラーの改善方法のメモ

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [はじめに](#はじめに)
1. [開発環境](#開発環境)
1. [APIレベル31以上にした状態でビルドをする方法](#apiレベル31以上にした状態でビルドをする方法)
1. [aabファイルに署名を追加する際のエラー](#aabファイルに署名を追加する際のエラー)
1. [aabファイルが150MB以下でなければアプリを提出できないエラー](#aabファイルが150mb以下でなければアプリを提出できないエラー)
1. [64または32ビットの対応ができていないエラー](#64または32ビットの対応ができていないエラー)
1. [GooglePlayBillingLibraryのエラー](#googleplaybillinglibraryのエラー)
1. [アプリ名が正しく表示されない不具合_未解決です](#アプリ名が正しく表示されない不具合_未解決です)
1. [おわりに](#おわりに)


# はじめに

Unreal Engineで開発したゲームをGoogle Play Consoleへ公開しようとしましたが、ゲーム開発初心者の私には色々と分からないことが多かったので、他の方々が参考にしていただくための記録を残そうと思います。

一から手順を説明するのではなく、特に解決することが難しかったエラーの解決方法を主に記載します。
断片的な内容となっていますので、同じエラーに悩んだ場合にのみ、該当の記事を読んでいただくのが良いかと思います。

※なるべく正確な情報を掲載できるように心がけていますが、誤った情報・私が理解できていない部分などがあります。そのときは、コメントでお伝えしていただけると助かります。m(_ _)m

余談ですが、スマホ向けの実装を完了してから、Google Play Consoleへアプリの提出を完了するまで22時間もかかってしまっていました…。
私のエラー解決能力のなさが問題ではあるのですが、私と同じゲーム開発初心者の方はある程度の心構えをしていただくと、挫折を防げるかもしれません…。

# 開発環境
パソコン： Windows10 (Mac Book ProをBootcampで動かしています。)
Unreal Engineのバージョン：4.26.2

# APIレベル31以上にした状態でビルドをする方法

APIレベルとは「Android OSのバージョンがアップグレードされるたびに、新しいAPIが導入されます。各APIレベルには、アプリケーションが使用できる新しい機能や、セキュリティの改善などが含まれます。」ということらしいです。

AndroidのアプリをGoogle Play Consoleへ提出することを目的としていない場合は、APIレベル30でビルドをする対応でも問題がないと思います。
その場合は、以下の記事を参考にしていただくと良いと思います。

https://qiita.com/EGJ-Takashi_Suzuki/items/d7fc3930a397b848adf6

APIレベル30の状態でGoogle Play Consoleへアプリを提出しようとすると、以下のエラーが発生してしまいます。

>アップロードされた APK または Android App Bundle には、インテント フィルタを使用するアクティビティ、アクティビティ エイリアス、サービス、またはブロードキャスト レシーバが含まれていますが、'android:exported' プロパティ セットは使用されていません。このファイルは Android 12 以降にはインストールできません。詳細: developer.android.com/about/versions/12/behavior-changes-12#exported

2023年3月1日現在、GooglePlayConsoleへアプリを提出するためにはAPIレベル31以上である必要があります。
※将来的には、APIレベル31ではGooglePlayConsoleへアプリを提出できなくなると思います。そのときは、この手順で対応できない可能性が高いです。

#### 解決方法

以下のウェブサイトを参考にしました。

https://stackoverflow.com/questions/68387270/android-studio-error-installed-build-tools-revision-31-0-0-is-corrupted

まずAndroidStudioのSettingsのウィンドウ内にて、SDK Toolsタブを開き、右下の「Show Package Details」にチェックを付けます。
「Android SDK Build-Tools 34-rc1」以下の「31.0.0」にチェックを付け、右下のApplyを押します。
<img width="700" alt="mojikyo45_640-2.gif" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/aaccba56-e7e1-3498-2b16-73b862a57c08.png>

この状態でAndroidビルドを実行すると、以下のエラーが発生してしまいます。

>Build-tool 31.0.0 is missing DX at C:\Users\wanko\AppData\Local\Android\Sdk\build-tools\31.0.0\dx.bat
FAILURE: Build failed with an exception.
What went wrong:
Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.
> Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Manager.

「C:\Users\\[ユーザー名]\AppData\Local\Android\Sdk\build-tools\31.0.0」
上記のフォルダにある「d8.bat」を「dx.bat」へ名前を変更します。

「C:\Users\\[ユーザー名]\AppData\Local\Android\Sdk\build-tools\31.0.0\lib」
上記のフォルダにある「d8.jar」を「dx.jar」へ名前を変更します。

※「AppData」フォルダは、隠しフォルダであるため、デフォルトの設定では非表示となってしまいます。
その場合は、エクスプローラーの「隠しファイル」のチェックを付けてください。
<img width="700" alt="mojikyo45_640-2.gif" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/c8cdf179-4f92-803c-d4d3-148c8aee271e.png>
以上の設定を済ませた上で、Androidビルドを実行すると、うまく解決すると思います。

# aabファイルに署名を追加する際のエラー

まだKeystoreを作成していない方は、公式ドキュメントの「プロジェクト リリースの承認方法」の記事が参考に手順通りに進めると良いと思います。

https://docs.unrealengine.com/4.26/ja/SharingAndReleasing/Mobile/Android/DistributionSigning/

この状態で作成した.aabファイルをGoogle Play Consoleへ提出しようとすると、以下のエラーが発生してしまいます。

>Android App Bundle は署名されていません。

このエラーを解決するためには、以下のYouTubeの解説動画の手順通りに進めると解決できると思います。

https://youtu.be/3OZX2yqo96I

上記の動画と同じ内容ではありますが、手順を説明します。

大まかな流れとしましては、Unreal Engine上でAndroidビルドを実行し、次にAndroidStudioでAndroidManifest.xmlを一部修正し、Keystoreを設定してビルドを実行することになります。具体的な手順を以下に掲載します。

Unreal EngineでAndroidビルドを実行し、成功していることを確認してください。

AndroidStudioを開き、「Open an existing Android Studio proj…」を選択し、「[Unreal Engineのプロジェクト名]\Intermediate\Android\gradle」を開きます。


<img width="600" alt="mojikyo45_640-2.gif" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/12d72079-d30a-fb5b-3529-4f8824f4185b.png>

<img width="500" alt="mojikyo45_640-2.gif" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/4c398adc-ccc1-a7c3-a2bc-4a7c542671c7.png>

「AndroidManifest.xml」に1箇所修正する必要がある部分があります。

「AndroidManifest.xml」の中に、以下の1行が含まれていると思います。

```xml
<activity android:exported="true" android:name="com.epicgames.ue4.SplashActivity" android:label="@string/app_name" android:theme="@style/UE4SplashTheme" android:launchMode="singleTask" android:screenOrientation="sensorLandscape" android:debuggable="false">
```
「<activity ★ android:name="com.epicgames.ue4.SplashActivity"」この★の部分に、「android:exported="true"」を追加して、「<activity android:exported="true" android:name="com.epicgames.ue4.SplashActivity"」と追加します。
```xml
<activity android:exported="true" android:name="com.epicgames.ue4.SplashActivity" android:label="@string/app_name" android:theme="@style/UE4SplashTheme" android:launchMode="singleTask" android:screenOrientation="sensorLandscape" android:debuggable="false">
```
私の場合では、4行目にありましたが、プロジェクトの設定などで変化する可能性があります。
また、画像上の39行目にあるとおり、
```xml
<receiver android:name="com.epicgames.ue4.MulticastBroadcastReceiver" android:exported="true">
```
この部分に「android:exported="true"」が書かれていることを確認してください。(既に書かれているため、自身で追加する必要はありません。)

<img width="1000" alt="mojikyo45_640-2.gif" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/f18b0adf-9969-6741-95a8-6ad4a5180f6d.png>

※Unreal Engine側でビルドが成功したときに、「[プロジェクト名]\Intermediate\Android\gradle\app\src\main」内に「AndroidManifest.xml」が生成され、上書きされます。そのため、Unreal Engine側でビルドを実行するたびに、「AndroidManifest.xml」へ「android:exported="true"」を追加する必要があります。

次に、「Build」 → 「Generate Signed Bundle / APK ...」を選択し、以下の手順通りに進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/212894e1-09af-e69a-f01c-a94b9f93bb22.png)

「Android App Bundle」を選択した状態で「Next」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/2a6b8ca3-2963-59d6-aeb8-d76f099359ec.png)

Key store pathは、「[プロジェクト名]\Build\Android\ExampleKey.keystore」など各自の設定した内容を参考にし、それぞれ入力して「Next」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/424aa51a-a6f2-dedf-592e-8693fa733aa2.png)

「Destination Folder」は、.aabファイルが作成される場所です。
「release」を選択した状態で「Finish」を押すことで、ビルドが開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/93230392-a72e-4a89-e869-64673cb2c069.png)

この手順によってビルドしたファイルであれば、「Android App Bundle は署名されていません。」のエラーが発生しないと思います。

# aabファイルが150MB以下でなければアプリを提出できないエラー
.aabが150MBを超えている状態でGoogle Play Consoleへ提出しようとすると、以下のエラーが発生すると思います。

>App Bundle に含まれている設定（ARM64_V8A）で、初期インストールのサイズは 150 MB 以下である必要があります。

どうしても150MBを超えてしまう場合は、「Google Play Asset Delivery」を使う必要があるかもしれません。
https://docs.unrealengine.com/4.27/ja/SharingAndReleasing/Mobile/Android/Distribution/GooglePlayAssetDeliveryReference/
(私のアプリでは150MB以下となったため、上記の設定方法は分かりません…。m(_ _)m)

150MB以下にアプリのサイズを抑えるために、不要なファイルを削除するなど、色々と試してみましたが、その中で最も効果があったものを紹介します。
Androidのビルドをする際に、「Multi・ASTC・DXT・ETC2」を選択しますが、このときに「ETC2」を選択すると大幅にアプリのサイズを削減することができました。
ビルドしたデータを確認したところ、Multiは172MB、ETC2は119MBとなっていました。

# 64または32ビットの対応ができていないエラー
Google Play Consoleにてアプリを提出後、以下のエラーが発生することがありました。

>このリリースは Google Play の 64 ビット要件に準拠していません
以下の APK または App Bundle は 64 ビットのデバイスで利用できますが、32 ビット向けネイティブ コードしか含まれていません。2
アプリには 64 ビットと 32 ビットのネイティブ コードを含めます。Android App Bundle 公開形式を使用して、各デバイスのアーキテクチャが自動的に必要なネイティブ コードだけを受け取るようにします。これにより、アプリ全体のサイズが増大することを回避できます。

この対応は、Unreal Engine上で「ProjectSettings->APK Packaging->armv7 arm64」の両方にチェックするだけで解決しました。

この設定をしたときに、.aabのファイルが166MBとなってしまいましたが、32Bit・64Bitのファイルが合わさったことが影響していると思います。
150MBの制限を超えている状態でしたが、そのままGooglePlayConsoleへ問題なくアップロードでき、ウェブサイト上で提出したときに表示されたサイズは、131MBとなっていました。

# GooglePlayBillingLibraryのエラー
Google Play Consoleにてアプリを提出後、以下のエラーが発生することがありました。

>このアプリで、サポートされていないバージョンの Play 請求サービスが使用されていることが検出されました。このアプリを公開するには、Google Play Billing Library バージョン 4 以降にアップグレードしてください。

このエラーを解決する手段として、2つの方法がありました。

#### 1つ目の方法：プラグイン「Android Play Billing」を追加する方法
手順の説明は省略しますが、以下のプラグイン「Android Play Billing」を追加することで解決できました。

https://www.unrealengine.com/marketplace/en-US/product/android-play-billing

※私が開発したアプリでは、課金などは未実装であったため、このプラグインによって課金などの実装に対応できるか分かりません。m(_ _)m

※また、Google Play Store上で確認したところ、課金要素を含まないにも関わらず、「アプリ内課金あり」と表示されるようになってしまいました…。そのため、　課金要素を含まない場合は別の方法を使用したほうが良いかもしれません。
<img width="700" alt="mojikyo45_640-2.gif" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/0010d0fa-2a57-d002-02b9-99f12d20c235.png>

#### 2つ目の方法：android.permission.BILLINGを削除する方法
※こちらの設定によってエラーを解決できるとTwitter上で教えていただきましたが、私の環境ではうまくいかず、エラーが解決しないままでした…。
おそらく何かしらの設定によって、うまくいく場合と、そうでない場合があるのかもしれません。

課金などの実装がない場合は、請求サービスを使用しない設定とすることで解決できます。

「[プロジェクト名]\Build\Android」を開き、「ManifestRequirementsOverride.txt」を追加します。

「[プロジェクト名]\Intermediate\Android\gradle\app\src\main」内にある「AndroidManifest.xml」を開きます。
「\<!-- Requirements -->」から「\<!-- Supported texture compression formats (cooked) -->」までをコピーし、先ほど追加した「ManifestRequirementsOverride.txt」にペーストします。
```xml
  <!-- Requirements -->
  <uses-feature android:glEsVersion="0x00030001" android:required="true" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  <uses-permission android:name="android.permission.VIBRATE" />
  <uses-permission android:name="com.android.vending.BILLING" />
  <!-- Supported texture compression formats (cooked) -->
```

ペーストした文字列の中で、「\<uses-permission android:name="com.android.vending.BILLING" />」は請求サービスに関する内容なので、削除して保存します。
これにより、次回以降からビルドをするたびに生成される「AndroidManifest.xml」に「\<uses-permission android:name="com.android.vending.BILLING" />」が削除された状態となるため、今回のエラーを解決できる…はずです。

[参考資料]

https://qiita.com/suramaru517/items/52a01d16e9a50f9f1d3e

# アプリ名が正しく表示されない不具合_未解決です

アプリをダウンロードし、スマホのホーム画面内で、本来は「プロロボ」と表示されることが正しいはずですが、実際は「PuzzleTest」と表示されてしまいました。
<img width="400" alt="mojikyo45_640-2.gif" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/05604c81-de21-50fd-4cfb-1c25cb102ad4.png>
おそらくですが、UE4のプロジェクト名がそのまま表示されてしまっているのかなと思います。

色々と検索してみた結果、以下のサイトが参考になりそうかな…と思いました。

https://www.tubezgames.com/2018/07/ue4-android-appname-localization/

記事を書いておきながら恐縮ですが、この不具合は放置している状態なので、この方法で修正できるかについては未確認になります…。m(_ _)m

不具合を放置することは非常に良くないことですが、このアプリをダウンロードしていただいている方は、知り合いの一人だけなので、問題ないかなと思います…(笑)

# おわりに
もしよろしければ、今回の手順でエラーが解決したか、解決しなかったか、それとも他の方法を参考にしたかなど、コメントなどを書いてくださると他の方が参考になるのでぜひお願いします！