【Unity】Android ビルドエラー対応 原因不明ならこれ試してみて

  • URLをコピーしました!
目次

はじめに

「プロジェクトの中身は変えていないのに、Unityを立ち上げるたびにAndroidビルドでエラーになる」という不安定な状態が長いこと続いて困っていたのですが、後述の方法で解決しました。

「理由がわからない」「なぜか直った」など原因不明な時はたぶんこれです。

  • Mac Monterey 12.4
  • Unity 2019.4.31 ~ 2021.3.0
  • AdMob SDK 7.0.2

追記:Unity Hub 3.2.0で解決したと発表がありました。。。さてどうでしょう。

Users on macOS reported an issue that prevented the PATH environment variable from being correctly provided to the Editor. This has now been resolved.

macOSのユーザーから、PATH環境変数がエディターに正しく提供されないという問題が報告されていました。これは現在解決されています。

Unity
Unity Hub Release Notes - Unity Find out what’s new in the latest release of the Unity Hub. Download the Unity Hub to install Unity Editor versions and manage your projects.

エラー内容

今回、注目したエラー

CommandInvokationFailure: Failed to update Android SDK package list.
/Applications/Unity/Hub/Editor/2020.3.33f1/PlaybackEngines/AndroidPlayer/SDK/tools/bin/sdkmanager –list

調べたところ、Unityのバグなのかパソコン環境の問題なのか分かりませんが「Unityの起動と同時に JAVA_HOME のパスが無効になってしまう」のが原因のようでした。

Unity Forum
Question - [FIXED] Failed to update Android SDK package list I'm trying to build my game and during the build phase I'm getting this error!! [ATTACH] I'm using Unity 2019.3.12f1

Androidビルドでは、いろいろなエラーに翻弄されますが、後述の対処方法は汎用性が高いと思われます。 上記のエラーに限らず、まだであれば一度お試しください。

対処方法

対処方法1.手動でパスをリセットする

  1. Unity>Preferences>External Toolsに移動します。
  2. 「JDK」「Android SDK」「Android NDK」「Grandle」のチェックを無効にします。
  3. ビルドして、わざとエラーを発生させます。
  4. (2)で無効にしたチェックをすべて有効にします(Unityがツールを再インストールします)

以上です。ビルドして確認してみてください。

対処方法2.スクリプトを使って起動時にパスをリセットする

  1. 「Assets」内の管理しやすい場所にフォルダを作成して、名前を「Editor」とします。
  2. 後述のスクリプト「SetJavaHomeEditor」を「Editor」内に配置してUnityを再起動します。
  3. 再起動してConsoleに下記のようなログが表示されれば成功です。

以上です。ビルドして確認してみてください。

サンプルコード

using UnityEngine;
using UnityEditor;
using System;

[InitializeOnLoad]
public class SetJavaHomeEditor
{
    //初回起動チェック用ダミーファイルパス
    static readonly string tempFilePath = "Temp/SetJavaHomeEditor_InitFlag";

    static SetJavaHomeEditor()
    {
        //初回起動(Fileがあるか)チェック
        if (System.IO.File.Exists(tempFilePath) == true)
        {
            //ダミーファイルが既にあるので以降の処理スキップ
            return;
        }

        Debug.Log("SetJavaHomeEditor 初回起動チェック用ダミーファイル作成");
        System.IO.File.Create(tempFilePath);

        //初回起動時のJAVA_HOMEパス
        Debug.Log($"SetJavaHomeEditor JAVA_HOME in editor was: {Environment.GetEnvironmentVariable("JAVA_HOME")}");
    
        string newJDKPath = EditorApplication.applicationPath.Replace("Unity.app","PlaybackEngines/AndroidPlayer/OpenJDK");

        if(Environment.GetEnvironmentVariable("JAVA_HOME") != newJDKPath)
        {
            //JAVA_HOME パス書き換え
            Environment.SetEnvironmentVariable("JAVA_HOME",newJDKPath);
        }
        //書き換え後のJAVA_HOMEパス
        Debug.Log($"SetJavaHomeEditor JAVA_HOME in editor set to: { Environment.GetEnvironmentVariable("JAVA_HOME")}");
    }
}

サンプルコード解説

[InitializeOnLoad]

[InitializeOnLoad] は UnityEditorのアトリビュートです。これを付与することで、UnityEditorの起動直後や、スクリプトコンパイル直後に呼び出されるようになります。

//初回起動(Fileがあるか)チェック
if (System.IO.File.Exists(tempFilePath) == true)
{
//ダミーファイルが既にあるので以降の処理スキップ
return;
}

Debug.Log(“SetJavaHomeEditor 初回起動チェック用ダミーファイル作成”);
System.IO.File.Create(tempFilePath);

[InitializeOnLoad] は、スクリプトコンパイル時に毎回呼び出されてしまうので、その対策です。初回起動時に「Temp」フォルダ以下に適当なファイルを作成して、ファイルの有無でスキップと実行を振り分けています。

if(Environment.GetEnvironmentVariable(“JAVA_HOME”) != newJDKPath)
{
//JAVA_HOME パス書き換え
Environment.SetEnvironmentVariable(“JAVA_HOME”,newJDKPath);
}

JAVA_HOMEパスが意図したパスでなければ書き換えています。

その他の対処方法

その他にJavaのバージョン8以外をアンインストールして対処する方法もあるようです。

あわせて読みたい
CommandInvokationFailure: Failed to update Android SDK package list. [Unityのエラー対策] UnityでAndroidアプリを制作時にメニューの[ファイル][ビルド設定][プレイヤー設定]で次のようなエラーが発生する場合の対応策です。

参考

あわせて読みたい
[FIXED] I am not able to build a Unity project for Android Issue I made a 2d Game on Unity. But when I try "Build and Run" on Android, the below are ...
テラシュールブログ
Unityエディタの起動時のみスクリプトを実行する - テラシュールブログ 先日から作ってる"Unity プロジェクトの中に、要求するアセット群が含まれない場合、該当ファイルのあるアセットを表示する奴ですが、やはりシンプルさを保つには「エディ...
あわせて読みたい
Android 用の環境設定 - Unity マニュアル Android 用 Unity アプリケーションの作成にあたっては、Android をサポートするように Unity プロジェクトを設定する必要があります。Unity プロジェクトは、Android をサ...

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次