尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Unity 2020安卓打包环境配置:JDK、SDK、NDK保姆级教程

Unity 2020安卓打包环境配置:JDK、SDK、NDK保姆级教程 1. 项目概述为什么Unity打包APK会让人焦虑如果你刚开始接触Unity或者从Unity 2019升级到2020准备把辛苦做好的游戏或应用打包成安卓APK时大概率会卡在第一步环境配置。那种感觉就像你兴冲冲地准备开车上路却发现连发动机都打不着火。Unity打包APK尤其是对于安卓平台从来就不是一个“一键生成”的简单操作。它背后依赖一整套工具链的协同工作包括Java开发工具包JDK、安卓软件开发工具包SDK、安卓原生开发工具包NDK以及Unity自身的构建支持模块。任何一个环节版本不匹配、路径不对、组件缺失都会导致构建失败报出一堆让人摸不着头脑的错误。这种“环境配置焦虑”的根源在于Unity本身是一个跨平台引擎它需要调用外部平台这里是安卓的官方工具来完成最终的本地化打包。而安卓的工具链又以其版本繁多、配置复杂、网络下载困难尤其在国内而“臭名昭著”。Unity 2020虽然已经做了很多优化比如内置了Gradle简化了部分流程但核心的JDK、SDK、NDK依然需要开发者自己准备和配置。网上教程五花八门有的用旧版本Unity的经验有的忽略了关键步骤导致新手跟着做一步错一步挫败感极强。因此这篇教程的目的非常明确为你提供一套针对Unity 2020的、经过验证的、从零开始的“保姆级”工具链安装与配置方案。我们将使用当前教程撰写时最稳定、兼容性最好的工具版本并详细解释每一个步骤背后的原因。无论你是第一次打包APK的Unity新人还是被环境问题折磨过的“老鸟”跟着这篇指南走都能建立起一个干净、可靠、可复现的安卓打包环境彻底告别构建失败的红字报错。2. 核心工具链拆解每一个组件的作用与选型理由在动手安装之前我们必须搞清楚要安装的到底是什么以及为什么是这些特定的版本。盲目安装最新版往往是踩坑的开始。2.1 Java开发工具包Unity与安卓世界的桥梁JDK是整套工具链的基石。Unity的构建系统特别是用于处理安卓资源的工具和Gradle构建工具本身都是用Java编写的因此必须依赖JDK来运行。版本选择为什么是JDK 8这是一个关键且容易出错的选择。虽然更高版本的JDK如JDK 11, 17功能更强但Unity 2020尤其是2020.3 LTS版本官方推荐并与JDK 8保持了最好的兼容性。使用更高版本的JDK可能会遇到诸如“javac发行版错误”或Gradle守护进程启动失败等问题。为了保证最大的稳定性我们选择Oracle JDK 8u201或OpenJDK 8。本教程将以OpenJDK为例因为它开源且无需处理Oracle的许可问题。核心组件安装后我们需要的是JAVA_HOME环境变量指向JDK的安装根目录这样系统和其他工具如Gradle才能知道去哪里找Java编译器javac和运行时java。2.2 安卓软件开发工具包提供构建APK的“原材料”安卓SDK包含了构建APK所需的一切核心工具、平台库和系统镜像。你可以把它理解为一个巨大的工具箱和零件库。关键组件解析Build-Tools这是最重要的部分包含了将你的代码和资源编译、链接、打包成APK的终极工具如aapt安卓资源打包工具、dx/d8将Java字节码转换为Dalvik字节码、apksignerAPK签名工具等。必须安装。Platforms对应不同安卓API级别的平台文件。你的应用需要指定一个“目标API级别”Target API Level和一个“最低API级别”Minimum API Level。你需要安装对应的android-API目录。例如若Minimum API Level设为21Android 5.0则必须安装android-21或更高版本。Platform-Tools包含像adb安卓调试桥这样的通用工具用于连接真机或模拟器进行安装和调试。NDK可选但常需安卓原生开发工具包。如果你的项目使用了用C/C编写的原生插件例如某些性能关键代码、或集成了特定的C库则必须安装NDK。Unity的一些后台服务或第三方资源也可能依赖它。即使暂时不用预先安装一个推荐版本可以避免后续突然需要时的麻烦。Unity 2020.3推荐使用NDK r19或r21。安装策略我们不会使用Android Studio来安装SDK因为那会引入不必要的IDE组件。我们将使用SDK的命令行工具sdkmanager进行精简安装只获取我们必需的组件节省时间和磁盘空间。2.3 Unity 2020的安卓模块引擎侧的构建支持这是Unity编辑器的一部分。在安装Unity时或之后需要通过Unity Hub来添加“Android Build Support”模块。这个模块包含了Unity用于与上述JDK/SDK/NDK工具链交互的脚本、模板以及必要的库文件如UnityPlayerActivity。确保你安装的Unity版本包含了这个模块。2.4 环境变量与路径让所有工具“对话”起来这是配置的核心也是出错的重灾区。即使所有工具都安装好了如果它们彼此找不到对方构建依然会失败。我们需要配置三个关键环境变量JAVA_HOME指向JDK安装目录。ANDROID_HOME或ANDROID_SDK_ROOT指向安卓SDK的安装目录。注意较新的工具如Gradle更倾向于使用ANDROID_SDK_ROOT为保险起见可以两个都设置。将相关工具的bin目录添加到系统的PATH变量中以便在命令行中可以直接调用adb,aapt等命令。3. 保姆级安装与配置实战接下来我们进入实操环节。请严格按照步骤顺序操作。3.1 第一步安装与配置JDK下载访问Adoptium原AdoptOpenJDK官网下载适用于你操作系统Windows/macOS的OpenJDK 8LTS的安装包。选择.msiWindows或.pkgmacOS格式以便安装。安装运行安装程序记住安装路径。例如在Windows上典型路径是C:\Program Files\Eclipse Adoptium\jdk-8.0.xxx.x-hotspot。配置环境变量Windows打开“系统属性” - “高级” - “环境变量”。在“系统变量”部分点击“新建”变量名输入JAVA_HOME变量值输入你的JDK安装路径例如C:\Program Files\Eclipse Adoptium\jdk-8.0.xxx.x-hotspot。找到系统变量中的Path双击编辑点击“新建”添加一条%JAVA_HOME%\bin。macOS / Linux打开终端编辑shell配置文件如~/.zshrc或~/.bash_profile。添加以下行请替换为你的实际路径export JAVA_HOME/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home export PATH$JAVA_HOME/bin:$PATH验证打开一个新的命令行窗口重要让环境变量生效输入java -version和javac -version。应该能看到类似“openjdk version 1.8.0_xxx”的输出。这证明JDK安装配置成功。注意务必使用新开的命令行窗口测试否则可能读不到刚设置的环境变量。3.2 第二步安装安卓SDK命令行方式我们采用最纯净的命令行方式安装。下载SDK命令行工具访问安卓开发者网站找到“Command line tools only”部分进行下载。请注意谷歌现在将命令行工具与SDK管理器分开了。你需要下载这个独立的命令行工具包。例如对于Windows下载sdk-tools-windows-xxxxxx.zip。创建并解压在你希望安装SDK的目录例如D:\Android下创建一个子文件夹如cmdline-tools。将下载的ZIP包解压到这个cmdline-tools文件夹内。解压后你可能会看到一层tools文件夹确保最终的路径结构类似D:\Android\cmdline-tools\tools\bin\sdkmanager.bat。配置ANDROID环境变量Windows新建系统变量ANDROID_HOME值为D:\Android你的SDK根目录。再新建ANDROID_SDK_ROOT值相同。在Path中添加%ANDROID_HOME%\tools和%ANDROID_HOME%\platform-tools后续安装后才有。macOS/Linux在shell配置文件中添加export ANDROID_HOME/Users/YourName/Android export ANDROID_SDK_ROOT$ANDROID_HOME export PATH$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH使用sdkmanager安装必要组件打开命令行导航到%ANDROID_HOME%\cmdline-tools\tools\binWindows或$ANDROID_HOME/cmdline-tools/tools/binmacOS/Linux。执行以下命令来安装核心组件。这里我们选择API级别30Android 11作为目标平台以及对应的构建工具。你可以根据项目需求调整platforms;android-30。# 接受所有许可避免交互式询问 sdkmanager --licenses --sdk_root%ANDROID_HOME% # 安装组件 sdkmanager “platform-tools” “platforms;android-30” “build-tools;30.0.3” --sdk_root%ANDROID_HOME%参数解释--sdk_root显式指定SDK根目录避免路径问题。“platforms;android-30”安装API 30的系统镜像和库。“build-tools;30.0.3”安装版本为30.0.3的构建工具。请务必选择与你的目标API级别匹配的构建工具版本通常大版本号一致即可。可选安装NDK如果你需要NDK继续使用sdkmanager安装sdkmanager “ndk;21.4.7075529” --sdk_root%ANDROID_HOME%。这里安装了版本21.4.7075529这是一个与Unity 2020兼容性较好的版本。安装完成后记下NDK的路径通常是%ANDROID_HOME%\ndk\21.4.7075529。3.3 第三步在Unity中配置路径这是将Unity与外部工具链链接的最后一步。打开Unity Hub确保你的Unity 2020.3.x版本已安装“Android Build Support”模块。打开你的Unity项目。进入Edit - Preferences(Windows) 或Unity - Preferences(macOS)。在左侧选择External Tools。在右侧的Android部分你会看到三个路径设置JDK点击Browse...选择你之前安装的JDK根目录即JAVA_HOME指向的目录。SDK点击Browse...选择你的安卓SDK根目录即ANDROID_HOME指向的目录。NDK如果你安装了NDK点击Browse...选择NDK的具体版本目录例如...\ndk\21.4.7075529。如果项目不需要可以留空。配置完成后点击右下角的Apply或OK。4. 验证与首次构建配置完成后必须进行一次完整的构建流程验证。4.1 基础项目设置打开File - Build Settings。在Platform列表中选择Android点击Switch Platform。这个过程可能会花点时间Unity会为安卓平台重新编译一些资源。点击Player Settings...按钮这会打开Project Settings的Player面板。在Other Settings部分检查并设置IdentificationPackage Name采用反向域名格式如com.yourcompany.yourgame。这是APK的唯一标识。ConfigurationScripting Backend对于新项目建议使用IL2CPP以获得更好的性能和安全性。如果项目使用了大量动态加载代码可以考虑Mono。Target API Level设置为与你安装的SDK Platform匹配的级别如Android 11.0 (API Level 30)。Minimum API Level根据你希望支持的最低安卓版本设置如Android 5.0 ‘Lollipop’ (API Level 21)。确保你安装了对应或更高版本的SDK Platform。Publishing SettingsKeystore如果你已有用于签名的.keystore文件在这里配置。对于首次测试可以先勾选Use an existing keystore但暂时不指定文件Unity会使用调试密钥进行构建。4.2 执行构建并解读日志回到Build Settings窗口直接点击Build。选择一个输出目录并为APK命名例如YourGame.apk。构建过程开始。最关键的是观察Console窗口的日志。一个成功的构建其日志是清晰、有步骤的Preparing SDK tools...Running ‘gradle build’...或Building Gradle project...一系列:app:compileXXX,:app:mergeXXX,:app:packageXXX任务成功完成。最后出现Build completed with a result of ‘Succeeded’并显示APK文件路径和大小。将生成的APK文件传输到安卓手机通过USB、网盘等方式在手机上允许安装未知来源应用后进行安装和运行测试。5. 常见问题与深度排查指南即使按照教程操作也可能遇到问题。以下是高频问题及其解决方案。5.1 构建失败Gradle相关错误问题现象Console报错提示Failed to find target with hash string ‘android-30’或Could not find com.android.tools.build:gradle:x.x.x。原因与解决SDK Platform未安装错误明确指出找不到android-30。回到命令行使用sdkmanager “platforms;android-30”确保已安装。Gradle版本不兼容Unity 2020内置了特定版本的Gradle通常是6.1.1或6.5。但构建时它还会从网络下载Gradle插件。网络问题可能导致下载失败。解决方案A推荐使用离线模式。在Unity的Preferences - External Tools - Android下取消勾选Gradle Installed with Unity (recommended)然后点击Browse手动指定一个你本地下载好的Gradle发行版例如6.5。你需要先去Gradle官网下载对应的-all.zip包并解压。解决方案B配置Gradle使用国内镜像。找到Unity项目中的gradle模板文件位于Unity安装路径/Editor/Data/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates复制mainTemplate.gradle到你的项目Assets/Plugins/Android目录下。编辑该文件在buildscript和allprojects的repositories块中添加阿里云或腾讯云镜像地址maven { url ‘https://maven.aliyun.com/repository/google’ } maven { url ‘https://maven.aliyun.com/repository/jcenter’ } maven { url ‘https://maven.aliyun.com/repository/public’ }5.2 构建失败JDK版本错误问题现象错误提示javac: invalid target release: 11或error: cannot find symbol但代码在编辑器里没问题。原因与解决原因Unity调用的javac编译器版本与项目设置的Java版本不匹配。可能你系统PATH中指向了其他版本的JDK。解决在命令行输入where javaWindows或which javamacOS/Linux检查默认Java是否是JDK 8。确保UnityPreferences - External Tools - Android - JDK路径明确指向了JDK 8的安装目录而不是一个包含多个版本的文件夹。在Player Settings的Publishing Settings最底部勾选Custom Gradle Template如果还没做然后在项目里生成的mainTemplate.gradle文件中可以尝试明确指定编译选项在android块内添加compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }5.3 构建成功但安装失败/闪退问题现象APK能生成但安装到手机时提示“安装包解析错误”、“无法安装”或安装后一点开就闪退。原因与解决架构不匹配你的手机CPU架构如arm64-v8a与APK中包含的本地库.so文件不匹配。在Player Settings的Other Settings - Configuration中查看Target Architectures。对于现代设备至少勾选ARMv7和ARM64。如果使用了IL2CPP确保IL2CPP Code Generation下的架构也对应勾选。调试密钥过期Unity的调试密钥有效期只有30年相对于发布密钥。虽然很长但如果你修改了系统时间或项目创建时间极早理论上可能过期。可以尝试删除C:\Users\用户名\.androidWindows或~/.androidmacOS/Linux目录下的debug.keystore文件Unity下次构建时会自动生成一个新的。最小API级别过高你设置的Minimum API Level高于测试手机的安卓系统版本。检查手机系统版本设置-关于手机并相应降低最低API级别。5.4 网络问题导致SDK组件下载失败问题现象使用sdkmanager时连接超时或下载速度极慢。解决为sdkmanager设置代理如果你有可用的网络代理。在命令前添加代理设置set HTTP_PROXYhttp://your_proxy:port set HTTPS_PROXYhttp://your_proxy:port sdkmanager “platform-tools” ...或者在sdkmanager的配置文件中设置。更通用的方法是寻找能提供安卓SDK组件国内镜像的第三方工具或脚本但需注意安全性。6. 进阶配置与优化建议当基础构建流程跑通后可以考虑以下优化让打包更顺畅、APK更专业。6.1 使用自定义Gradle模板进行精细控制如前所述启用Custom Gradle Template后你可以在mainTemplate.gradle中做很多事情添加依赖在dependencies块中添加第三方库依赖例如Firebase、广告SDK等。配置签名将发布密钥的配置直接写入gradle文件实现命令行自动化构建。启用混淆为了减小APK体积和保护代码可以启用R8混淆在android块内添加buildTypes { release { minifyEnabled true } }。但要注意这可能会混淆Unity的代码需要仔细编写混淆规则proguard-unity.txt。6.2 拆分APK以适配不同设备ABI Splitting如果你的应用包含原生库.so文件为了减小单个APK的体积可以针对不同的CPU架构生成不同的APK。在Player Settings中勾选Split Application Binary。在Target Architectures中选择你支持的架构。构建时Unity会为每种架构生成一个独立的APK例如app-arm64-v8a-release.apk。上传到Google Play时商店会自动为不同设备分配合适的版本。6.3 构建脚本自动化对于需要频繁打包如每日构建的项目手动点击构建按钮是不可接受的。你可以使用Unity的命令行接口进行自动化构建。一个基本的命令行构建示例Windows“C:\Program Files\Unity\Hub\Editor\2020.3.48f1\Editor\Unity.exe” ^ -batchmode ^ -quit ^ -projectPath “D:\YourUnityProject” ^ -executeMethod YourEditorScript.PerformBuild ^ -logFile “build.log”你需要编写一个编辑器脚本YourEditorScript.cs其中包含一个静态方法PerformBuild在该方法中使用BuildPipeline.BuildPlayerAPI来指定构建参数和路径。这样可以集成到CI/CD持续集成/持续部署流水线中。6.4 管理多环境配置开发中常有开发版、测试版、生产版等不同环境的需求它们可能使用不同的服务器地址、API密钥或功能开关。一种清晰的做法是使用Scripting Define Symbols在Player Settings的Other Settings - Scripting Define Symbols中为不同构建目标添加符号如DEVELOPMENT,PRODUCTION。在代码中使用条件编译#if DEVELOPMENT public static string ApiHost “https://dev.api.yourserver.com”; #elif PRODUCTION public static string ApiHost “https://api.yourserver.com”; #endif通过命令行参数在自动化构建时传递不同的定义符号。环境配置的稳定性是项目开发的基石。一次成功的配置其价值远不止于生成一个APK文件它意味着你建立了一个可重复、可依赖的发布流程将精力从繁琐的配置冲突中解放出来真正聚焦于游戏或应用本身的创作与优化。这套针对Unity 2020的工具链方案经过了多个实际项目的验证希望能成为你攻克安卓打包难题的可靠起点。如果在实践中遇到本教程未覆盖的特殊情况记住一个排查黄金法则仔细阅读Console窗口的第一条红色错误信息它通常最接近问题的根源结合错误关键词进行搜索往往能更快找到解决方案。
返回列表