環境:Unity2020.3.0f1
広告:Admobのみ

はじめに

Android12以降の端末でアプリのアイコンをタッチすると、
「○○(アプリ名)」が繰り返し停止しています。
というメッセージが出てアプリが起動しない問題に直面しました。

3つの手順をして解決することができました。

  1. AndroidManifest.xmlにAdmobの広告IDを追記
  2. mainTemplate.gradleを作成&編集する
  3. gradleTemplate.propertiesを作成&編集する

1だけで解決できず、2、3と進みました。もしかしたら2と3だけでも解決するかもしれないけど、それは試してません。

1.AndroidManifest.xmlにAdmobの広告IDを追記

Assets\Plugins\Android\GoogleMobileAdsPlugin.androidlib\AndroidManifest.xml

上記ファイルを開いて、

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.unity.ads" android:versionName="1.0" android:versionCode="1">
  <application>
    <uses-library android:required="false" android:name="org.apache.http.legacy" />
    <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-○○" />
  </application>
</manifest>

5行目にある
<meta-data android:name=”com.google.android.gms.ads.APPLICATION_ID” android:value=”ca-app-pub-○○” />
を追加します。○○には自身の広告IDを入れます。

2.mainTemplate.gradleを作成&編集する

Android 12(APIレベル 31)からは、PendingIntentを作成するときにフラグを設定しなければならなくなり、その解決方法がWorkManagerをバージョン2.7.0以上にすることのようです。

PendingIntent
Androidシステムにおいて、アプリが実行されていない時でも、ある時点でアプリケーションの特定の操作を実行できるようにするためのクラス
WorkManager
デバイスの再起動やアプリの終了後でも保証された実行を提供し、バックグラウンドタスクのスケジューリングを容易にするライブラリ

Edit>Project Settings>Player>Publishing Settings >Buildに移動し、Custom Main Gradle Templateにチェックを入れます。これによってAssets/Plugins/AndroidにmainTemplate.gradleファイルが生成されます。

生成されたファイルを開いて ↓のようにimplementation ‘androidx.work:work-runtime-ktx:2.7.0’ を追加します。

…
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.work:work-runtime-ktx:2.7.0'
// Android Resolver Dependencies Start
…

ちなみに生成したばかりの状態だと、// Android Resolver Dependencies Start などの記述がない簡潔なファイルで、一度Unityを再起動するといいかもしれません(ビルド中に自動的に変更されたり、されなかったり?)。

3.gradleTemplate.propertiesを作成&編集する

2と同様に、今度はCustom Gradle Properties Template にチェックを入れます。これによって、Assets/Plugins/AndroidにgradleTemplate.propertiesファイルが生成されます。

生成されたファイルを開いて、2文を追加します。
android.useAndroidX=true
android.enableJetifier=true

org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
org.gradle.parallel=true
#android.enableR8=**MINIFY_WITH_R_EIGHT**
android.useAndroidX=true
android.enableJetifier=true
unityStreamingAssets=.unity3d**STREAMING_ASSETS**
**ADDITIONAL_PROPERTIES**

ただし、この状態でビルドしても、

The option setting 'android.enableR8=false' is deprecated.

というエラーが出てビルド失敗します。

そこで同じファイルにある

android.enableR8=**MINIFY_WITH_R_EIGHT**

に#を足してコメントアウトします。

これでビルドができ、実機テストで問題なくプレイすることができました。
ちなみに起動時クラッシュの問題は、2でmainTemplate.gradleを作成した段階でビルドすると解決しました。ただしそれだと、多分広告を読み込むタイミングでエラーが起こり、ゲームが先に進まなくなりました。私のゲームの場合は、タイトル画面は表示されるけど、その先へ進まない状態でした。正直、よく分かってません。

上記3つの手順で解決できたので、とりあえずよし!
実機テスト用に古い端末を1つだけ持ってたけど、新しいのも必要だと学習した夏の日でした。