1. 为什么 Unity 打包安卓这件事值得单独拿出来讲
如果你刚开始接触 Unity,大概率会遇到这样一个场景:在编辑器里点一下播放按钮,游戏跑得好好的,角色能动、UI 能点、粒子特效也正常,于是你信心满满地打开 Build Settings,切到 Android 平台,点击 Build,然后——报错了。要么是提示找不到 SDK,要么是 JDK 版本不匹配,要么是 NDK 路径不对,要么是 Gradle 构建卡在某个下载环节一动不动。折腾了大半天,游戏没跑起来,环境倒是装了一堆。
这不是你一个人的问题。Unity 配置安卓环境这件事,几乎是每个 Unity 开发者都要经历的“成人礼”。它本身不难,但涉及的组件多、版本关系复杂、不同 Unity 版本的要求还不一样,再加上国内网络环境对某些下载环节的影响,导致很多人第一次配置的时候都会踩坑。
这篇文章要解决的核心问题就一个:让你从零开始,把 Unity 的安卓打包环境完整配好,并且理解每一步为什么这么做。不管你是用 Unity 2021、2022 还是 Unity 6,不管你是 Windows 还是 macOS,配置的思路是相通的。我会把整个流程拆开,从组件选型、版本匹配、路径配置,到实际打包验证、常见报错排查,一步步讲清楚。
适合谁看?如果你是刚学 Unity 不久、想把自己的项目跑到手机上的开发者,这篇文章就是为你写的。如果你已经配过环境但总是遇到莫名其妙的报错,也可以对照着排查一下,大概率能找到问题所在。
在正式开始之前,先说一个核心认知:Unity 打包安卓,本质上是你电脑上的 Unity 调用一套外部工具链,把项目编译成安卓能识别的 APK 或 AAB 文件。这套工具链主要包括 JDK(Java 开发工具包)、Android SDK(安卓软件开发工具包)、NDK(原生开发工具包)和 Gradle(构建工具)。Unity 自己不带这些东西,它只是调用者。所以配置环境的核心工作,就是把这四个组件准备好,并告诉 Unity 它们在哪里。
理解了这一点,后面所有的操作你都能想明白为什么要做。
2. 四个核心组件到底各自负责什么
很多人配置环境的时候是照着教程一步步点,点完了也不知道每个东西是干嘛的。这样一旦出问题就完全不知道怎么排查。所以我觉得有必要先把这四个组件的作用讲清楚,用生活化的类比来解释。
2.1 JDK:安卓构建的“翻译官”
JDK 是 Java Development Kit 的缩写。安卓系统的应用层大量使用 Java 和 Kotlin 编写,虽然你的 Unity 项目用的是 C#,但最终打包成 APK 的时候,中间会经过一层 Java 代码的转换和调用。JDK 就是完成这个工作的基础工具。
你可以把 JDK 理解成一个翻译官:Unity 说的话(C# 代码和项目配置),需要通过翻译官转换成安卓系统能听懂的语言(Java 字节码和 DEX 文件)。没有翻译官,双方就没法沟通。
这里有一个非常关键的坑:JDK 的版本必须和你的 Unity 版本匹配。Unity 2019 到 2021 早期版本通常需要 JDK 8,Unity 2021 后期到 2022 需要 JDK 11,Unity 2023 及以后版本开始支持 JDK 17。如果你装错了版本,构建的时候会报出各种奇怪的错误,比如Unsupported class file major version之类的。
提示:Unity 从 2019.3 开始,在安装器中就自带了 OpenJDK 选项。如果你在安装 Unity 的时候勾选了 Android Build Support 下的 OpenJDK,那么 JDK 就已经就位了,不需要单独去下载。这是最省事的方式。
2.2 Android SDK:安卓开发的“工具箱”
SDK 是 Software Development Kit 的缩写。Android SDK 里面包含了安卓平台的各种工具,比如adb(用于和手机通信)、aapt(用于打包资源)、zipalign(用于优化 APK)等等。Unity 在构建过程中会调用这些工具来完成 APK 的组装。
打个比方,SDK 就像是一个木工的工具箱,里面有锤子、锯子、螺丝刀。Unity 是设计师,它画好了图纸,但真正动手把家具做出来,需要工具箱里的各种工具配合。
Android SDK 里面有几个关键的部分你需要知道:
- Platform Tools:包含 adb 等和设备通信的工具,这是最常用的。
- Build Tools:包含构建 APK 所需的编译和打包工具,每个版本号对应一套工具集。
- Platforms:包含各个安卓 API 级别的平台文件,比如 android-33、android-34。
- Command-line Tools:命令行工具,用于在不打开 Android Studio 的情况下管理 SDK 组件。
Unity 在打包时会根据你设置的最低 API 级别和目标 API 级别,去 SDK 目录里找对应的 Platforms 和 Build Tools。如果找不到,就会报错。
2.3 NDK:处理底层代码的“特种兵”
NDK 是 Native Development Kit 的缩写。它的作用是让你用 C/C++ 编写安卓平台上的原生代码。那 Unity 项目为什么需要它呢?
原因在于 Unity 的底层引擎部分、IL2CPP 脚本后端、以及一些第三方插件(尤其是涉及物理引擎、音频处理、图形渲染的插件),都是用 C/C++ 写的。当你选择 IL2CPP 作为脚本后端时,Unity 会把 C# 代码转换成 C++ 代码,然后再编译成原生库。这个过程就需要 NDK。
NDK 不是所有项目都必须的。如果你用的是 Mono 脚本后端,理论上可以不用 NDK。但现在的 Unity 版本默认推荐 IL2CPP,而且 Google Play 上架要求 64 位支持,IL2CPP 是更好的选择。所以配置 NDK 基本上是必须的。
NDK 的版本同样有讲究。Unity 每个大版本都会推荐一个特定的 NDK 版本,用错了版本可能会遇到编译错误或者链接错误。通常 Unity 安装器自带的 NDK 就是匹配的版本,直接用就行。
2.4 Gradle:把零件组装成成品的“流水线”
Gradle 是一个构建自动化工具。在安卓开发中,它负责把 Java 代码、资源文件、原生库、清单文件等所有零件按照一定的规则组装成一个完整的 APK 或 AAB。
Unity 从 2019.3 开始,默认使用 Gradle 来构建安卓项目。在此之前用的是 Ant,但 Ant 已经被淘汰了。Gradle 的优势在于灵活、可扩展,你可以通过自定义 Gradle 模板来实现各种高级功能,比如集成第三方 SDK、修改清单文件、配置签名等。
Unity 安装器自带的 Gradle 版本通常也是匹配的。但有时候 Gradle 在构建时需要下载一些依赖,如果你的网络环境访问某些仓库比较慢,可能会卡住。这个问题后面会专门讲怎么处理。
3. 手把手配置:从安装到打包成功
前面讲了原理,现在进入实操环节。我会按照从零开始的顺序,把每一步都写清楚。你可以跟着做,也可以对照检查自己已有的配置。
3.1 通过 Unity Hub 安装 Android Build Support
最省事的方式,就是在安装 Unity 编辑器的时候,通过 Unity Hub 把 Android Build Support 一起装上。具体操作是:
- 打开 Unity Hub,找到你需要的 Unity 版本。
- 点击版本旁边的齿轮图标或者三个点,选择“添加模块”。
- 在弹出的模块列表中,找到“Android Build Support”。
- 展开它,确保勾选以下三项:
- Android SDK & NDK Tools
- OpenJDK
- Android Build Support(本身)
- 点击安装,等待下载完成。
这样做的好处是,Unity Hub 会自动帮你下载匹配版本的 SDK、NDK 和 JDK,并且放到正确的位置。你不需要自己去官网找下载链接,也不需要手动配置路径。
注意:下载过程可能需要一些时间,取决于你的网络速度。如果下载卡住不动,可以尝试在 Unity Hub 的设置里切换下载源,或者检查网络连接。
安装完成后,你可以在 Unity 编辑器中打开Edit > Preferences > External Tools(Windows)或Unity > Settings > External Tools(macOS),看看 Android 部分的路径是否已经自动填好了。正常情况下,JDK、SDK、NDK、Gradle 四个路径都应该有值,并且指向 Unity 安装目录下的相关文件夹。
3.2 手动配置已有 SDK 和 JDK 的情况
有些开发者电脑上已经装了 Android Studio,或者之前配置过其他安卓开发环境,已经有了一套 SDK 和 JDK。这种情况下,你可以选择复用已有的,而不是让 Unity 再下载一份。
在 External Tools 面板中,取消勾选“Use Embedded JDK”和“Use Embedded SDK Tools”,然后手动指定路径:
- JDK 路径:指向你 JDK 的根目录,比如
C:\Program Files\Java\jdk-17或 macOS 上的/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home。 - SDK 路径:指向 Android SDK 的根目录,比如
C:\Users\你的用户名\AppData\Local\Android\Sdk。 - NDK 路径:指向 NDK 的根目录,通常在 SDK 目录下的
ndk文件夹里,比如C:\Users\你的用户名\AppData\Local\Android\Sdk\ndk\23.1.7779620。 - Gradle 路径:如果你使用自定义 Gradle,可以在这里指定。否则保持默认即可。
手动配置的好处是灵活,你可以用最新版本的 SDK 和 JDK。但风险是版本可能不匹配,导致构建失败。我的建议是:如果你不是特别清楚各版本之间的兼容关系,优先使用 Unity 自带的版本。等你对这套工具链比较熟悉了,再去折腾自定义版本。
3.3 在 Unity 中切换平台并设置关键参数
环境路径配好之后,接下来要在 Unity 里做一些设置。
首先,打开File > Build Settings,在左侧的平台列表中选择 Android,然后点击“Switch Platform”。这一步会让 Unity 把项目的资源重新导入为安卓平台适用的格式,可能需要一些时间,取决于项目大小。
切换完成后,点击 Build Settings 窗口右下角的“Player Settings”,打开玩家设置面板。这里有几个关键参数需要关注:
- Company Name 和 Product Name:这两个会影响到 APK 的包名和显示名称。包名格式通常是
com.公司名.产品名,必须是有效的 Java 包名格式。 - Default Orientation:设置屏幕方向,横屏、竖屏或自动旋转。
- Minimum API Level:最低支持的安卓版本。这个值决定了你的应用能装在哪些手机上。设置得太高会排除掉老设备,设置得太低可能无法使用某些新特性。目前比较通用的选择是 API 22(Android 5.1)或 API 23(Android 6.0)。
- Target API Level:目标安卓版本。这个值影响应用的运行行为和商店上架要求。Google Play 通常要求目标 API 级别不能太低,具体数值每年都在更新,建议设置为当前较新的稳定版本。
- Scripting Backend:脚本后端,选 IL2CPP 还是 Mono。前面说过,IL2CPP 支持 64 位,性能更好,是推荐选项。
- Target Architectures:目标架构。如果选了 IL2CPP,需要勾选 ARMv7 和 ARM64。ARM64 是 64 位,Google Play 强制要求。x86 和 x86_64 主要用于模拟器,如果不需要可以取消勾选以减小包体。
这些参数看起来多,但大部分保持默认也能跑起来。真正需要你根据项目需求调整的,主要是 Minimum API Level、Target API Level 和 Target Architectures 这几项。
3.4 构建 APK 并验证环境是否配置成功
参数设置好之后,就可以尝试构建了。在 Build Settings 窗口中,点击“Build”按钮,选择一个输出目录,Unity 就会开始构建 APK。
构建过程中,你可以在底部的进度条看到当前正在执行的步骤。如果一切顺利,几分钟后就能在输出目录里看到 APK 文件。把这个 APK 传到手机上安装,能正常打开运行,就说明环境配置成功了。
但现实往往不会这么顺利。第一次构建大概率会遇到各种报错。下面我把常见的报错和排查方法整理出来,你可以对照着看。
4. 常见报错与排查技巧实录
这一部分是我在实际操作中踩过的坑和总结出来的排查思路。很多报错看起来吓人,但原因往往很简单。
4.1 JDK 版本不匹配导致的构建失败
报错特征:构建日志中出现Unsupported class file major version、Could not determine java version、Gradle requires Java X but found Java Y等字样。
原因分析:Unity 调用的 JDK 版本和 Gradle 或 Android Gradle Plugin 要求的版本不一致。比如 Unity 2021 默认用 JDK 11,但你手动指定了一个 JDK 8 的路径,就会出问题。
解决方法:
- 打开 External Tools 面板,检查 JDK 路径指向的版本。
- 如果不确定版本,可以在命令行中运行
java -version查看。 - 对照 Unity 官方文档,确认你的 Unity 版本需要哪个 JDK 版本。
- 最简单的做法是勾选“Use Embedded JDK”,让 Unity 用它自带的版本。
实操心得:我曾经因为电脑上装了多个 JDK,环境变量指向了一个旧版本,导致 Unity 构建一直失败。后来在 External Tools 里明确指定了 Unity 自带的 JDK 路径,问题立刻解决。所以如果你电脑上有多个 JDK,一定要确认 Unity 用的是哪一个。
4.2 SDK 路径错误或缺少组件
报错特征:Failed to find SDK、Android SDK not found、No Android SDK path set、Failed to find Build Tools revision XX.X.X。
原因分析:Unity 找不到 SDK,或者 SDK 里缺少所需的 Build Tools 版本。
解决方法:
- 检查 External Tools 中的 SDK 路径是否正确。
- 打开 SDK 目录,确认
build-tools文件夹下有你需要的版本。 - 如果缺少,可以通过 Android Studio 的 SDK Manager 安装,或者用命令行工具
sdkmanager安装。 - 如果 Unity 自带的 SDK 缺少某些组件,可以在 External Tools 中取消勾选“Use Embedded SDK Tools”,然后指向一个完整的 SDK 目录。
这里有一个细节值得注意:Unity 自带的 SDK 通常只包含最基本的组件,有时候不包含某些特定版本的 Build Tools。如果你在构建时看到提示缺少某个版本,可以去 SDK 目录下看看实际有哪些版本,然后在 Player Settings 里把 Build Tools 版本改成已有的版本。
4.3 Gradle 构建卡住或下载依赖失败
报错特征:构建进度条长时间卡在“Building Gradle project”或“Resolving dependencies”,或者报出网络超时相关的错误。
原因分析:Gradle 在构建时需要从远程仓库下载依赖包。如果网络环境访问这些仓库比较慢,就会卡住。
解决方法:
- 检查网络连接是否正常。
- 如果使用了自定义 Gradle 模板,可以在模板中配置国内镜像仓库。
- 在 Unity 的 Preferences 中,找到“Build Settings”或“Gradle”相关选项,看看是否有离线模式的开关。
- 如果项目不复杂,可以尝试取消勾选“Custom Gradle Template”,使用 Unity 默认的 Gradle 配置。
提示:Gradle 首次构建时会下载很多东西,包括 Gradle 发行版本身和各种依赖库。这个过程可能比较慢,但只要成功一次,后续构建就会快很多,因为依赖会被缓存起来。
4.4 NDK 版本不兼容导致的编译错误
报错特征:NDK not found、Unable to find NDK、Invalid NDK version,或者构建过程中出现 C++ 编译错误。
原因分析:NDK 路径不对,或者 NDK 版本和 Unity 版本不匹配。
解决方法:
- 检查 External Tools 中的 NDK 路径。
- 确认 NDK 版本是否在 Unity 推荐的范围内。
- 如果使用 IL2CPP 后端,确保 NDK 已正确安装。
- 尝试使用 Unity 自带的 NDK,而不是手动指定的版本。
4.5 常见问题速查表
| 报错关键词 | 可能原因 | 排查方向 |
|---|---|---|
| Unsupported class file major version | JDK 版本不匹配 | 检查 JDK 路径和版本 |
| Failed to find Build Tools | SDK 缺少组件 | 检查 build-tools 目录 |
| Gradle build failed | 依赖下载失败或配置错误 | 检查网络和 Gradle 模板 |
| NDK not found | NDK 路径错误或未安装 | 检查 NDK 路径 |
| Permission denied | 文件权限问题 | 检查 SDK/NDK 目录权限 |
| CommandInvokationFailure | 综合错误 | 查看完整日志定位具体原因 |
排查的时候有一个通用技巧:看完整的构建日志。Unity 的 Console 窗口有时候只显示简略信息,你需要打开Editor.log文件才能看到完整的错误堆栈。Windows 上的路径通常是C:\Users\你的用户名\AppData\Local\Unity\Editor\Editor.log,macOS 上在~/Library/Logs/Unity/Editor.log。日志里会详细记录每一步执行了什么命令、返回了什么结果,是定位问题的关键。
5. 进阶配置与优化建议
环境配好、能打出包之后,还有一些进阶的配置可以让你用起来更顺手。
5.1 配置自定义 Gradle 模板
Unity 允许你使用自定义的 Gradle 模板来覆盖默认的构建配置。这在需要集成第三方 SDK、修改 AndroidManifest.xml、添加自定义权限或配置签名时非常有用。
开启方式是:在 Player Settings 中,找到 Publishing Settings 部分,勾选“Custom Main Gradle Template”和“Custom Launcher Gradle Template”。Unity 会在Assets/Plugins/Android目录下生成模板文件,你可以直接编辑。
编辑 Gradle 模板需要一定的安卓开发知识,但基本的修改并不难。比如添加一个依赖库,只需要在dependencies块中加入一行implementation 'com.example:library:1.0.0'即可。
注意:修改 Gradle 模板后,如果构建失败,可以先还原模板再试。有时候问题就出在模板的某一行配置上。
5.2 配置签名文件
如果你要发布应用到应用商店,或者需要覆盖安装同一个应用的不同版本,就需要配置签名文件(Keystore)。
在 Player Settings 的 Publishing Settings 中,勾选“Custom Keystore”,然后填写 Keystore 路径、密码、别名等信息。如果没有现成的 Keystore,可以用命令行工具keytool生成一个。
签名配置看起来简单,但有一个坑:密码和别名一定要记牢。一旦丢失,就无法对已发布的应用进行更新。我见过不少开发者因为忘记签名密码而不得不重新上架应用的案例。
5.3 优化构建速度和包体大小
构建速度和包体大小是安卓开发中永恒的话题。这里分享几个实用的优化点:
- 减少 Target Architectures:如果不需要支持模拟器,取消 x86 和 x86_64,只保留 ARMv7 和 ARM64,可以显著减小包体。
- 开启 Managed Stripping Level:在 Player Settings 的 Optimization 部分,把 Managed Stripping Level 设置为 Medium 或 High,可以移除未使用的代码,减小包体。
- 使用 Addressables 或 AssetBundle:把资源从主包中分离出来,按需加载,可以大幅减小初始包体。
- 关闭不必要的图形 API:在 Player Settings 的 Other Settings 中,取消勾选不需要的 Graphics API,比如 Vulkan 或 OpenGL ES 3,只保留 OpenGL ES 2 或 3。
- 增量构建:Unity 支持增量构建,第二次构建通常比第一次快很多。尽量不要频繁清理构建缓存。
5.4 真机调试与日志查看
包打出来了,装到手机上,但运行不正常怎么办?这时候需要看真机日志。
最常用的方式是通过 adb 查看日志。在命令行中运行:
adb logcat -s Unity这个命令会过滤出 Unity 相关的日志输出。如果你的应用崩溃了,日志里通常会有堆栈信息,能帮你定位问题。
另外,Unity 的 Development Build 选项也很有用。在 Build Settings 中勾选“Development Build”和“Script Debugging”,构建出来的包会包含调试信息,并且可以通过 Unity Profiler 连接真机进行性能分析。
实操心得:真机调试时,建议把手机通过 USB 连接到电脑,并开启开发者模式和 USB 调试。这样 adb 才能识别到设备。如果 adb 识别不到手机,可以尝试重启 adb 服务(
adb kill-server然后adb start-server),或者换一根数据线。
6. 一些容易忽略的细节和我的个人体会
配置安卓环境这件事,说难不难,说简单也不简单。它不像写游戏逻辑那样有创造性,但它是把游戏送到玩家手机上的必经之路。我在多次配置环境的过程中,积累了一些文档里不太会写的经验,分享出来供你参考。
第一,版本匹配比版本新旧更重要。很多人喜欢用最新版本的 SDK、NDK、JDK,觉得新版本肯定更好。但在 Unity 安卓打包这个场景里,版本匹配才是第一位的。Unity 每个版本都会测试并推荐一套特定的工具链版本,用这套推荐版本,出问题的概率最小。等你对整套流程非常熟悉了,再去尝试新版本。
第二,环境配置一次做好,后续省心很多。我见过一些开发者每次换电脑或者重装系统后,都要重新折腾一遍环境。其实可以把配置好的 SDK、NDK、JDK 目录打包备份,下次直接解压到相同路径,然后在 Unity 里指定路径即可。这样可以节省大量时间。
第三,遇到报错不要慌,先看日志。大部分报错信息其实已经告诉了你问题所在,只是信息比较隐晦。养成看 Editor.log 的习惯,你会发现很多问题都能自己解决。日志里的关键词,比如“not found”、“version”、“failed”,往往就是突破口。
第四,国内网络环境下,Gradle 依赖下载是一个高频卡点。如果你在构建时经常卡在依赖下载环节,可以考虑在 Gradle 模板中配置国内镜像仓库。具体做法是在repositories块中添加镜像地址,这样可以大幅提升下载速度。不过要注意,镜像仓库的可用性会随时间变化,需要定期检查。
第五,不要害怕重装。如果环境实在配不好,最省事的办法可能是卸载 Unity 和所有相关组件,然后重新通过 Unity Hub 安装,确保勾选 Android Build Support 下的所有选项。虽然听起来很笨,但往往比一个个排查问题更快。
最后再分享一个小技巧:如果你有多台电脑需要配置环境,可以把 Unity 安装目录下的Editor/Data/PlaybackEngines/AndroidPlayer整个文件夹拷贝到另一台电脑的相同位置,然后在 Unity 中指定路径。这个文件夹里包含了 Unity 自带的 SDK、NDK、JDK 和 Gradle,拷贝过去就能用,省去了重复下载的时间。
这个内容后续还可以这样扩展:当你熟悉了基本的安卓打包流程后,可以进一步研究如何集成第三方广告 SDK、如何配置多渠道打包、如何自动化构建流程等。这些进阶话题每一个都值得单独拿出来讲,但前提是你先把基础环境配好,能稳定地打出包来。基础打牢了,后面的路才好走。