介绍

Unity 在构建 Android APK 时需要指定当前使用的 Android SDKAndroid NDKJava SDK 的路径。

如果不同版本的 Unity 同时存在,而其依赖的库的版本并不统一,因此需要在构建时显式确定性地指定库的路径。

接口

由于 Unity 将相关路径直接设置在 EditorPrefs 中,可以通过编辑器脚本 API EditorPrefs.GetStringEditorPrefs.SetString 设置。

  • AndroidSdkRoot
  • AndroidNdkRoot
  • JdkPath

方案

由于要为自动打包考虑,所以要考虑多个候选项、跨平台。

按照以下顺序执行:

  1. 环境变量
  2. 不同平台默认值

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static void UpdateAndroidSettings()
{
    UpdateSetting("AndroidSdkRoot", "ANDROID_SDK", "C:\AndroidSDK", "/Applications/android-sdk-macosx");
    UpdateSetting("AndroidNdkRoot", "ANDROID_NDK", "C:\AndroidNDK", "/Applications/android-ndk-r13b");
    UpdateSetting("JdkPath", "JAVA_SDK", "C:\JavaSDK", "/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/");
}

private static void UpdateSetting(string key, string environmentKey, string defaultWindowsPath, string defaultMacOSPath)
{
    string environmentPath = Environment.GetEnvironmentVariable(environmentKey);
    if (!string.IsNullOrEmpty(environmentPath) && Directory.Exists(environmentPath))
    {
        EditorPrefs.SetString(key, environmentPath);
        return;
    }

    string defaultPath = Application.platform == RuntimePlatform.WindowsEditor ? defaultWindowsPath : defaultMacOSPath;
    if (!string.IsNullOrEmpty(defaultPath) && Directory.Exists(defaultPath))
    {
        EditorPrefs.SetString(key, defaultPath);
        return;
    }

    throw new DirectoryNotFoundException(string.Format("{0} {1} {2}", key, environmentKey, defaultPath));
}