ことの発端
ずっとUnity2019(1.5f1)でアプリを開発していたので、新規のアプリでUnity2020(2.1f1)を使ってみたくなった。Android向けにビルドしたところ、CommandInvokationFailure: Gradle build failed.
とやらが出てビルドが成功しない。
ビルド時に複数エラーが出ていたが、主なのは下の2つ。
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':launcher:processReleaseResources'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
> Android resource linking failed
CommandInvokationFailure: Gradle build failed.
/${OpenJDK_PATH}/bin/java -classpath
"${Gradle_PATH}/lib/gradle-launcher-5.6.4.jar" org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx4096m" "assembleRelease"
調べたこと
独自のAndroidManifestを使っており、Assets/Plugins/Androidフォルダに置いて、Player Settings > Publishing Settings > Custom Main ManifestのチェックボックスもONにしている。
にも関わらず、ビルド失敗後Temp/gradleOut/launcher/src/mainのAndroidManifest(ビルド時に作られたAndroidManifest)には独自のAndroidManifestが反映されていない。
正しく動いていれば、ここに反映されるはず。
エラー内容で色々ggってみたが、他のSDKと競合してないか〜、カスタムのGradle Templateを定義して〜みたいなのが多かったが、どれも根本的な解決策に至らなかった。
解決策
Assets/Plugins/Androidフォルダに配置しているAndroidManifest.xml
を**LauncherManifest.xml
**に書き換え、Player Settings > Publishing Settings > Custom Launcher ManifestのチェックボックスをONにする(Custom Main ManifestはOFFにする)。
【3/4 追記】
上記手法は場合によっては、Unityの定義に反する使い方になるため、解決策を修正。
また、上記解決策では実機確認の際にアイコンが2つ出てしまう、動作が安定しないなどの場合は下記を参照。
従来のAndroidManifest.xml
の中からiconなどの情報をLauncherManifest.xml
として外出しする。外出しする項目は公式のページを参照。
Player Settings > Publishing Settings > Custom Launcher Manifest と Custom Main ManifestのチェックボックスをONにする
ビルドを再実行!
原因
どうやらUnity2019.3以降はGradle実行時にLauncherManifestとLibraryManifestという2つのManifestファイルを生成するらしい。詳細は公式のページを参照。
従来はAndroidManifest1つ定義するだけで良かったのだが、項目によって分けられてビルド時にそれをマージする仕様に変わったことを知らなかったのが原因。
それでもエラーが出る場合
Minimum APIがどうこうのエラー
置き換えるLauncherManifestからminimum API Levelの指定を取り除く
Gradle周りのエラーや上記対応ができない場合など
まず、ここで自分が使っているUnityに対応したGradleのバージョンを調べる。
なんでUnity2020が書かれてないんだ・・・ちなみに2.1f1のGradleバージョンは5.6.4っぽい。
【追記】英語バージョンのサイトに書かれてました。
次に、ここでGradleバージョンに対応したGradleプラグインのバージョンを調べる。
ややこしいというツッコミはなしで。
次に、Player Settings > Publishing Settings > Custom Base Gradle TemplateのチェックボックスをONにする。
Assets/Plugins/AndroidフォルダにbaseProjectTemplate.gradle
なるものが生成されているのでそれを開き、dependenciesのclasspathのXの部分をさっきのGradleプラグインのバージョンに差し替える。
classpath 'com.android.tools.build:gradle:X.X.X'
再度ビルド。
これで動くようになればご喝采。