---
title: "【Unity】自动打包脚本整理"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/unity-auto-build-scripts/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/03-软件工程与质量保障/CI-CD与质量保障/CI-CD工具链/【Unity】自动打包脚本整理.md"
content_hash: 68a1102b38fc9c0e0ee521b62085d795f6ff2f6a4ce0188d7c9da5e3ff65a684
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 【Unity】自动打包脚本整理

﻿# 【Unity】自动打包脚本整理

> 创建时间：2021/4/28 19:51

* 相关技术概念
    * ABB
    * OBB
  * Android SDK 设置相关
    * UnityEditor界面设置SDK
    * 脚本设置SDK
    * Best Practice: 使用并修改Unity内置的SDK
    * 注：Unity猜测SDK会导致构建时间过长的问题
  * 打包脚本
    * 设置
      * 通用
      * Android
      * iOS平台
    * 打包代码
      * Android
      * iOS平台
      * Windows平台
    * Tool
  * 遇到的坑
    * Build java.io.IOException: Unable to delete XXX\signing-config.json
  * Ref

## 相关技术概念

### ABB

### OBB

## Android SDK 设置相关

在打包时，会检测AndroidSDK、NDK等工具的目录，验证目录的正确性，如下图的BuildLog所示：

![assets/0017 - 【Unity】自动打包脚本整理__resource-004-1726d9f5666b.png](/media/f3eeae3b46ebad806c1b.png)

### UnityEditor界面设置SDK

![assets/0017 - 【Unity】自动打包脚本整理__resource-002-3119e8950063.png](/media/507eba1f74b2ea8d1869.png)

在Editor下，勾选"with Unity"即为选择UseEmbedded（使用Unity嵌入的Android相关工具）。如果不勾选，可以设置自定义路径，在Preference窗口设置路径的行为与接口`EditorPrefs.SetString("AndroidSdkRoot", value);`设置的内容是一致的。

无论在Editor界面点击Build打包，还是用batchmode调用BuildPlayer函数打包，Unity使用的SDK都会按照 “Edit->Preferences->External Tools” 当中的设置来进行。

> 如果勾选了使用Unity自带的SDK，那么通过设置EditorPrefs方式修改也是没有用的。

### 脚本设置SDK

Unity 使用的SDK配置，是保存在EditorPrefs当中的。可以通过以下脚本修改。

```csharp
string s = String.Empty;

```

### Best Practice: 使用并修改Unity内置的SDK

Unity Editor自己安装的SDK就比较方便并且稳定，如果SDK所包含的API Level不符合要求，修改也是比较容易的。
Unity安装AndroidSDK后，会把SDK放在Unity安装目录下找到以下位置

```csharp
string s = String.Empty;

```

使用SDK目录下自带的`sdkmanager.bat`脚本即可实现安装指定的API Level。

```csharp
string s = String.Empty;

```

### 注：Unity猜测SDK会导致构建时间过长的问题

而如果使用batchmode运行，如果设置错误，会在环境变量当中查找，存在一个GuessDirectory的过程，代码如下：

```csharp
string s = String.Empty;

```

检索可能涉及到的相关环境变量大致如下：
Windows系统上：

  * ANDROID_SDK_ROOT
  * ANDROID_NDK_ROOT
  * LOCALAPPDATA
  * ProgramFiles
  * ProgramFiles(x86)

类Unix系统上：

  * HOME/Library/Android/sdk

这就会导致`Detecting Android SDK`的时间过长，或者甚至导致`Android SDK not found`而打包失败。如下图，是某次打包的Editor.log，检测AndroidSDK的耗时约6分钟：

![assets/0017 - 【Unity】自动打包脚本整理__resource-003-ae666f8dc70e.png](/media/b5a21baa78635a9e8b42.png)

双击打包的bat脚本与使用Pipeline运行时的区别就在于环境变量不同，因此可能会出现双击bat打包成功，而使用Pipeline打包失败的现象。

Pipeline的参数化构建功能就是用来解决环境变量相关问题的。

相关讨论或博客：
https://forum.unity.com/threads/unity-command-line-doesnt-find-android-sdk.162976/
https://blog.csdn.net/KindSuper_liu/article/details/89891780
https://medium.com/@johanesriandy/week-one-setup-jenkins-to-build-android-app-using-gradle-1534755ca1bc

## 打包脚本

### 设置

#### 通用

```csharp
string s = String.Empty;

```

#### Android

```csharp
string s = String.Empty;

```

#### iOS平台

```csharp
string s = String.Empty;

```

### 打包代码

#### Android

```csharp
string s = String.Empty;

```

#### iOS平台

```csharp
string s = String.Empty;

```

#### Windows平台

```csharp
string s = String.Empty;

```

### Tool

```csharp
string s = String.Empty;

```

## 遇到的坑

### Build java.io.IOException: Unable to delete XXX\signing-config.json

方案一：
Just Delete the File signing_config.json and re-run
And it will work fine

方案二：
授予Users完全控制权限：

![assets/0017 - 【Unity】自动打包脚本整理__resource-001-e33e6a5fb87a.png](/media/ddcad6ba8bd6a6308c33.png)

## Ref

https://chenghu.online/posts/a27a69b1/
