【Unity】Android ビルドエラー対応 これ最初に試すと良いかもしれない( JAVA_HOMEのパスを通し直す )

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

はじめに

UnityでAdMobや各メディエーションSDKを使っていると、多くのエラーに出会します。ビルドできなかったり、端末で動画が再生されなかったり…(特にAndroid)。その対処法の一例です。

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

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

エラー内容

今回、注目したエラー

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
[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 マニュアル To create a Unity application for Android, you first need to set up your Unity project to support Android. To support Android, a Unity project requires the foll...

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

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