Unity 2022.2 以降で Firebase Unity SDK のビルド失敗に対応する
※ これは 2022/12/23 時点の Unity 2022.2.1f1, Firebase Unity SDK v10.3.0 の情報です
最新版では動作が異なる可能性がありますのでご注意ください
リリースされた Unity 2022.2 の TECH ストリーム、さっそく触ってみようと Firebase Unity SDK をインポートした Android アプリをビルドしてみる
Firebase Unity SDK の導入手順にしたがい、パッケージをインポートして、google-services.json もダウンロードして配置
Player Settings の Publishing Settings の中の Custom Main Gradle Template と Custom Gradle Properties Template にチェックを入れ、Assets/Plugins/Android/gradleTemplate.properties も下記のように書き換えた
org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M org.gradle.parallel=true unityStreamingAssets=**STREAMING_ASSETS** **ADDITIONAL_PROPERTIES** android.useAndroidX=true android.enableJetifier=true
Unity の不具合でおかしくなる Assets/GeneratedLocalRepo/Firebase/m2repository 配下の各種ライブラリのバージョン番号ディレクトリも正しく 10.3.0 に修正した

[Assets] - [External Dependency Manager] - [Android Resolver] - [Force Resolve] で参照ライブラリのインポート設定を追加して、準備万端とばかりに Android ビルドを実行すると・・・

ビルド失敗!!なんでじゃっとコンソールログを見てみると・・・

Firebase SDK の ローカルリポジトリにあるライブラリが参照できなくて Gradle ビルドに失敗している!
・・・どうやら Unity 2022.2 からビルドに使用する Gradle のバージョンが変わり、出力される Gradle プロジェクトの構造が変わって Firebase SDK と不整合が起きるようになったらしい
仕方がないのでビルド問題を解決すべく追加手順を実施
まず Unity のインストール先ディレクトリの Editor/Data/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/settingsTemplate.gradle を Assets/Plugins/Android にコピーする

コピーした settingsTemplate.gradle を下記のように書き換え
pluginManagement {
repositories {
**ARTIFACTORYREPOSITORY**
gradlePluginPortal()
google()
mavenCentral()
}
}
include ':launcher', ':unityLibrary'
**INCLUDES**
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
repositories {
**ARTIFACTORYREPOSITORY**
maven {
${MAVEN_REPOSITORIES}
}
google()
mavenCentral()
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}
}
}
次に IPostGenerateGradleAndroidProject を利用して Gradle プロジェクト出力直後に実行されるスクリプトを追加する
Assets/Editor/PostGenerateGradleAndroidProject.cs というファイルを作成し、下記のように記述
#if UNITY_ANDROID && UNITY_EDITOR using System.IO; using System.Text; using UnityEditor.Android; using UnityEngine; public class PostGenerateGradleAndroidProject : IPostGenerateGradleAndroidProject { /// <summary> /// 処理優先度 /// </summary> public int callbackOrder => 0; /// <summary> /// Gradle プロジェクト生成時に呼び出される処理 /// </summary> /// <param name="path">Gradle 用 unityLibrary プロジェクトの出力先パス</param> public void OnPostGenerateGradleAndroidProject(string path) { // Gradle プロジェクトのルートパスを取得 var rootProjectPath = path.TrimEnd('/').Replace("unityLibrary", ""); // settings.gradle のパスを取得 var filePath = Path.Combine(rootProjectPath, "settings.gradle"); // External Dependency Manager のローカルリポジトリを参照先に追加 var info = new DirectoryInfo(Path.Combine(Application.dataPath, "GeneratedLocalRepo")); var repositories = new StringBuilder(); var directories = info.GetDirectories(); for (var i = 0; i < directories.Length; i++) { if (i > 0) { repositories.AppendLine(); } var fullPath = directories[i].FullName.Replace('\\', '/'); repositories.Append($" url 'file:///{fullPath}/m2repository'"); } // settings.gradle を書き換える var settings = File.ReadAllText(filePath); settings = settings.Replace("${MAVEN_REPOSITORIES}", repositories.ToString()); File.WriteAllText(filePath, settings); } } #endif
Unity 2022.2 以降だと settings.gradle 内に指定したリポジトリからしかライブラリを参照しなくなる RepositoriesMode.PREFER_SETTINGS が指定されてしまうので、settings.gradle を書き換えて Firebase SDK のローカルリポジトリも参照するようにする設定を追記するという感じ
Firebase SDK(External Dependency Manager) は mainTemplate.gradle の方にローカルリポジトリを参照するコードを自動追記するんだけど、これが全無視されるのでビルドに失敗してしまうというわけ
ともかくこれで再度 Android ビルドすると・・・

今度は無事成功!
Unity の対応はいつもとても遅いので、できれば External Dependency Manager の速やかな対応を期待したい・・・