しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

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 アプリをビルドしてみる

blog.unity.com

Firebase Unity SDK の導入手順にしたがい、パッケージをインポートして、google-services.json もダウンロードして配置

Player SettingsPublishing Settings の中の Custom Main Gradle TemplateCustom 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 に修正した

Unity の不具合でピリオドつきディレクトリがおかしくなるのを修正

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

Build failure!!

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

ローカルリポジトリの参照ができない

Firebase SDK の ローカルリポジトリにあるライブラリが参照できなくて Gradle ビルドに失敗している!

・・・どうやら Unity 2022.2 からビルドに使用する Gradle のバージョンが変わり、出力される Gradle プロジェクトの構造が変わって Firebase SDK と不整合が起きるようになったらしい

仕方がないのでビルド問題を解決すべく追加手順を実施

まず Unity のインストール先ディレクトリの Editor/Data/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/settingsTemplate.gradleAssets/Plugins/Android にコピーする

settingsTemplate.gradle

コピーした 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 プロジェクト出力直後に実行されるスクリプトを追加する

docs.unity3d.com

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 の速やかな対応を期待したい・・・