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

はじめに

現在AndroidアプリをアップデートするにはAPIレベルを31以上にする必要があります。
しかしAPIレベルを31以上にするとgradle関係のエラー祭りでビルドができませんでした。
悪戦苦闘したので備忘録と共にシェアしたいと思います。

以下の条件を満たしてしまうとビルドできないようです。

  • SDK31以上
  • JDK8
  • ラムダ式を使ったコードがどこかにある(使わなければ大丈夫かも?)

要するにJDK8→JDK11にすればいいらしいが、
Unity2020.3.0f1はJDK11をサポートしてないという…。
Unity2022ならサポートしてるようですが、バグるかもしれないのでアップグレードなんて無理!
そこでJDK8のままビルドする必要があります。
その方法がgradleのバージョンを6.1.1にするとのことです。

私はこれでビルドすることができました。
その手順

  1. gradleバージョン6.1.1のあるフォルダのパスを設定する
  2. Custom Base Gradle Templateを作成&編集する
  3. AndroidManifest.xmlを作成&編集する

1つずつ見ていきます。

1.gradleバージョン6.1.1のあるフォルダのパスを設定する

Edit>Preferences>External Toolsに移動し、gradleが参照してるパスにgradleバージョン6.1.1が入っているか確認します。
なければチェックを外して、gradleバージョン6.1.1のあるフォルダパスをセットします。

私が使っているUnity2020.3.0f1には5.6.4が入っているのでNGでした。
Unity2021.3.15f1だと6.1.1なので、こちらのパスをセットしました。
gradleの公式サイトからダウンロードしてそのファイルパスをセットしてもOKだと思います。

2.Custom Base Gradle Templateを作成&編集する

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

生成されたファイルを開いて↓の箇所を4.0.1に書き換えます。

 dependencies {
           …
            classpath 'com.android.tools.build:gradle:4.0.1'
           …
        }

3.AndroidManifest.xmlを作成&編集する

さっきと同様に、今度はCustom Main Manifestにチェックを入れてAndroidManifest.xmlファイルを生成します。

生成されたファイルを開き、↓のようにandroid:exported=”true”を追加します。

…
<application>
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:theme="@style/UnityThemeSelector"
                  android:exported="true">
            <intent-filter>
…

これで無事にビルドができました。
しかし…、
私はSDK33を導入したので、この段階でビルドしてGooglePlayConsoleにアップロードしたら、API33は広告がどうのというエラーが出ました。

そこで先ほどのAndroidManifest.xmlファイルに↓のように<uses-permission android:name=”com.google.android.gms.permission.AD_ID”>を追加します。

<manifest>
 …
  <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
</manifest>

これにてようやくアプデすることができました!
この手のエラーは本当に苦手で、いつも神だのみ…。

注意

Target API Levelを31以上にすると、Android12以上の端末でアプリが起動できない不具合が発生する可能性があります。

参考