UnityのAndroidビルドでAPIレベル31にしたらGradle地獄だった話

![スクリーンショット 2022-11-28 23.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/87726bf8-2669-0b39-c4f7-e1c7bfd40e1a.png)
いやなダイアログだ。思わずため息が出る。Unity Android開発者は何度このダイアログに悩まされることになるのだろう。
## 環境
Unity Editor: Unity 2021.1.6f1
Platform: Android
OS: macOS Monterey(12.6)
Target API Level: Android 11 (API Level 30)（当初）
## [前回](https://qiita.com/warapuri/items/9f9b4e293bf52c7cd6fd)のあらすじ

リリースだけ起こるバグに遭遇したが、ProGuardの難読化が原因だったことがわかった。
proguard-user.txtに追記して、難読化を回避することでなんとかProGuardの罠を潜り抜け、ようやくリリースビルドが完成した。

## Googleさん「APIレベル上げろや」

そして早速Google Play Consoleでアップロードしてみると、、
![スクリーンショット 2022-11-29 20.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/8b6f4935-905a-18eb-b7dd-8190c35eba74.png)
「現在、お客様のアプリは API レベル 30 を対象にしています。セキュリティとパフォーマンスが最適化された最新の API を利用するには、API レベル 31 以上を対象にする必要があります。アプリの対象 API レベルを 31 以上に変更してください。」

とのこと。いやいやいや…　ちょっと前OKでしたやん。なんで今になって言うん…
仕方ないので、APIレベルを31に上げることにした。

それがGradle地獄の始まりだった。
## Gradleエラー、Gradleエラー、Gradleエラー
API Levelを上げることはそんなに難しくない。
Build Settings→Player→Other Settings→Identification→Target API Level
![スクリーンショット 2022-11-29 20.39.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/ce239206-abce-ae8d-cf95-4400bb3853c1.png)
これを変更するだけ。あとはUnityがAPI Level 31のSDKをインストールしてくれる。

すると、冒頭の
![スクリーンショット 2022-11-28 23.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/87726bf8-2669-0b39-c4f7-e1c7bfd40e1a.png)
Build failure

まあまあ落ち着けって。こう言う時はだいたいPlugins/Androidのaarファイルを一旦全部消して、Force Resolveをすればだいたい解消するんだって（詳しくは→ [AppLovin Max SDK for Unity をAndroidでビルドエラーの解決](https://qiita.com/warapuri/items/6ce6930174916c11a7b5) ）

しかし、無情の Build failure
んんん？待て待て、たんにAPIレベル上げただけだぞ？そんなたいそうなことか？

仕方ない、ちゃんとConsole見てみるかと、やってみると…
![画面収録-2022-11-29-21.02.15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/0b5dee45-de36-a310-68bb-8de2a8adcefe.gif)
はいはい、ですよねー。なんかこういうふうに該当のところをクリックすると、UnityEditorがバグって全部消えるんですよ。Gradleエラーあるあるなんですよー。

じゃあ、Editor.logを直接見るしかない。
```
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
コンパイラで例外が発生しました(1.8.0-adoptopenjdk)。Bug Database (http://bugs.java.com)で重複がないか
をご確認のうえ、Java bugレポート・ページ(http://bugreport.java.com)でJavaコンパイラに対するbugの登録を
お願いいたします。レポートには、そのプログラムと下記の診断内容を含めてください。ご協力ありがとうございます。
java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE (class com.sun.tools.javac.util.UnsharedNameTable$NameImpl)
	at com.sun.tools.javac.util.Assert.error(Assert.java:133)
	at com.sun.tools.javac.code.TypeAnnotations.annotationType(TypeAnnotations.java:231)
	at com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.separateAnnotationsKinds(TypeAnnotations.java:294)
	at com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.visitVarDef(TypeAnnotations.java:1164)
```
ご協力ありがとうございますじゃねえよ。とか言いたくなる。
とにかくエラーが要領を得ない。「unrecognized Attribute name MODULE」ってどういうこと？
ワタシはAPIレベルをアゲたダケダガ？
## Googleで検索
とにかくエラーを見ていてもわからなそうなので、Googleで調べてみることにした。こういうとき、エラーメッセージを検索するに限る。

検索ワードを
`java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE (class com.sun.tools.javac.util.UnsharedNameTable$NameImpl)`
として検索してみると、

https://stackoverflow.com/questions/68344424/unrecognized-attribute-name-module-class-com-sun-tools-javac-util-sharednametab

というそれらしい感じの質問にあたった。

アンサーが色々あって、

> JDKを8でやる必要がある
> いや11でよい
> Android Gradle Plugin のバージョンをあげろ
> Android Build Toolsはバージョン30.0.*だけにしろ

しまいにはAPIレベルを30にダウングレードしろとかいうのもあった。（さすがにこれは叩かれていたが）
どうやら各人の環境によって解決が異なるということがわかった。なので私もいろんな方法でやってみた。
以下は私の方でうまくいった方法だが、他の人もうまくいくかどうかはわからない。これ以外にも方法があるかもしれない。

## 対応策１、Gradleのバージョンを変更

Gradleにはバージョンがあって、それがどうやら古いとAPIレベル31はビルドできないっぽいらしい。

https://docs.unity3d.com/ja/2021.1/Manual/android-gradle-overview.html

私の使っているUnityは2021.1.6f1なので、Gradleバージョンは「5.6.4」だ。それを「6.1.1」にしないといけない。

私はたまたまUnityのもう少し上のバージョン2021.3.4f1をインストールしてあったので、そちらのGradleバージョンは幸い「6.1.1」でこれを使うことにした。


メニューのPreferenceから、External Toolsを選んで、「Gradle Installed with Unity」のチェックを外し、Gradleの場所を変更する（私はUnity2021.3.4f1のものを使うことにした）。
![スクリーンショット_2022-11-29_21_36_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/f0211886-9038-7298-c213-0f420049a05e.png)
これでうまくいくだろ。

（１０分後）
![スクリーンショット 2022-11-29 21.43.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/af8eab9b-847e-6365-cafe-be59fc91baca.png)
はいだめー

## 対応策２、Android Build Toolsはバージョン30.0.*だけにする

https://developers.google.com/ar/develop/unity-arf/android-12-build

ここにある通り、実は状況はかなり複雑だ。
要はAndroid側とUnity側のビルドツールのバージョンの不整合が原因、ということだ。

なので、Android SDKはAPIレベルを31にしつつ、ビルドツールバージョンを下げて30.0.Xにする必要がある。これするにはUnity内部のAndroid SDKではカスタマイズが難しい。

なので、これは自分でAndroid SDKをダウンロードする必要がある。

Android SDKはAndroid StudioのSDK Managerでインストールする
![Welcome_to_Android_Studio_と_Todo_txt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/6b3cefcc-a004-6879-3f00-fcfb3e699a50.png)
SDK Platforms で Android API 31が必要なのと、
![Preferences_for_New_Projects.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/63a798e9-036e-6166-f848-6cdf5aeeaebc.png)
SDK Tools のタブで「Show Package Details」で細かいバージョン指定ができるようにして、31以上は全てアンインストールして、30.0.X（図では30.0.3）を一つだけインストールする
![Preferences_for_New_Projects-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/c751e356-30d7-0508-9716-b877ced48cfc.png)
そしてUnityでPreferenceの
先程のExternal Toolsで、「Android SDK Tools Installed with Unity」のチェックを外し、自分でダウンロードしてきたAndroid SDKの場所を入れる。
![スクリーンショット_2022-11-29_22_29_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/155fcc9b-dc9d-5ed3-7459-6dba9d9001c0.png)
今度こそうまくいくだろ（フラグ）

（１０分後）
![スクリーンショット 2022-11-29 21.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/0ce7f7ce-dcf4-fc0a-f53d-cb838709e37e.png)
はいダメー
## 対応策３、Custom Base Gradle Template を使う
先程のGoogleの資料によると、

https://developers.google.com/ar/develop/unity-arf/android-12-build

Gradleのバージョンは6.1.1にバージョンアップするのだが、同時にAndroid Gradle Pluginは4.0.1にする必要がある、らしい。（何？もっかい言って？）
Gradleバージョンとは別に、Gradle Pluginのバージョンというのがあって、そちらを4.0.1にする必要があることらしい。（知らんがな！）

もーここまで来るとトンチキ過ぎて頭に来るが、最後まで付き合うしかない。

というわけで、上の資料にある通り、「Custom Base Gradle Template」を使って、
![Game_-_SnowBoarding_-_Android_-_Unity_2021_1_6f1_Personal__Personal___Metal_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/c5145ba8-a79f-342b-ed6e-1a28791632ba.png)
Assets/Plugins/Android/baseProjectTemplate.gradle
を編集する。その中の


            classpath 'com.android.tools.build:gradle:3.6.0'
というところを


            classpath 'com.android.tools.build:gradle:4.0.1'
に変更する。
あと、最初の行
```
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
```
も消しておく。
## 対応策４、AndroidManifest.xmlの編集
もう一つやることがある。
先程のGoogle の資料によると、AndroidManifest.xmlの一部を修正する必要があるらしい。
```
 <application>
     <activity android:name="com.unity3d.player.UnityPlayerActivity"
               android:theme="@style/UnityThemeSelector"
               android:exported="true">
               ：
               （略）
```
最後の「android:exported="true"」というところを追記する必要があった。

今度こそ、今度こそうまくいくだろ（懇願）

（１０分後）
![スクリーンショット 2022-11-29 23.03.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/fb0a8e9b-2ca8-9acb-f5c2-c3895d15e8a3.png)
できたー！

## Gradle地獄の歩き方

というわけでGradle地獄は終わったのだが、ひとつGradleエラーの読み方があることに気がついた。

大量のEditor.logの中で、
```
* What went wrong:
```
という文言で始まるログがあり、それが問題の根幹であるようだ。
なので検索する文字列としては、そのログを使うのが良さそうだ。

以上！