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

资讯详情

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

Unity游戏AAB打包全流程:从配置、构建到测试上架

Unity游戏AAB打包全流程:从配置、构建到测试上架 1. 从APK到AAB为什么Google Play强制要求AAB格式如果你是一名Unity开发者最近两年在向Google Play商店提交应用时肯定会注意到一个显著的变化Google Play Console的后台打包选项里APK格式已经悄然退居二线甚至在某些情况下直接消失取而代之的是一个名为“Android App Bundle”简称AAB的格式。很多开发者第一次接触时可能会感到困惑甚至觉得多了一道工序。但事实上这不仅仅是格式的简单替换而是Google为了优化整个Android应用生态从分发、下载到用户体验的一次深度重构。简单来说AAB是一种发布格式而APK是安装格式。当你使用Unity或其他构建工具生成一个AAB文件并上传到Google Play后Google的服务器会根据用户设备的具体情况如CPU架构、屏幕密度、语言等动态地生成一个“量身定制”的APK给用户下载安装。这个过程对开发者是透明的你只需要关心如何生成一个正确的AAB文件。那么Google为什么要“多此一举”呢核心驱动力在于应用体积的爆炸式增长。一个典型的Unity游戏如果包含所有CPU架构arm64-v8a, armeabi-v7a, x86_64等和所有屏幕密度hdpi, xhdpi, xxhdpi等的资源其APK体积会非常庞大。但用户的手机可能只需要其中一种架构和两三种屏幕密度的资源。传统的“通用APK”模式导致了大量冗余数据的下载和存储浪费了用户的流量和手机空间。AAB通过“按需分发”解决了这个问题。它允许你将应用拆分成多个模块Base Module, Dynamic Feature Modules等Google Play服务器只组合用户设备真正需要的模块来生成APK。根据Google官方数据平均可以为应用减少约15%的体积。对于动辄几百MB甚至几个G的Unity游戏来说这个优化幅度是相当可观的直接提升了用户的下载意愿和安装成功率。对于我们开发者而言转向AAB不仅仅是遵循平台规则更是一次优化产品、提升用户体验的契机。接下来我将结合Unity引擎的具体工作流从环境配置、打包构建、本地测试到上传商店为你拆解AAB打包与测试的完整链条并分享我在这个过程中踩过的坑和总结的经验。2. Unity项目转向AAB前的关键准备工作在点击“Build”按钮之前充分的准备工作能避免80%的构建失败和后续测试问题。AAB打包不是简单的格式切换它涉及到项目配置、资源管理和构建管道的调整。2.1 环境与Unity版本要求首先确保你的开发环境符合要求。你需要Unity版本强烈建议使用Unity 2018.4 LTS或更高版本。虽然更早的版本如2017.4也支持AAB但其对Gradle、Android SDK的集成以及对Play Asset DeliveryPAD用于分发大型资源包的支持可能不完善容易遇到各种兼容性问题。我个人目前主力项目使用的是Unity 2022 LTS其AAB相关工具链最为稳定。JDK与Android SDKUnity打包Android应用需要Java Development Kit (JDK) 和 Android Software Development Kit (SDK)。确保你安装了受支持的版本。对于Unity 2020及以上版本通常内置或推荐使用OpenJDK。你可以在Unity Editor的Preferences - External Tools中检查和配置路径。一个常见的坑是系统环境变量中设置了多个JDK导致Unity使用了错误版本引发构建失败。我的做法是在Unity中明确指定路径并暂时清空系统的JAVA_HOME变量。Android Build Support模块在Unity Hub中安装Unity编辑器时务必勾选“Android Build Support”模块并包含“Android SDK NDK Tools”和“OpenJDK”。这是打包Android平台应用的基础。2.2 Player Settings中的核心配置这是AAB打包配置的核心区域。打开File - Build Settings - Player Settings...。2.2.1 图标与标识在Player - Icon和Player - Splash Image中配置好各种尺寸的应用图标和启动图。AAB要求提供自适应图标Adaptive Icon务必在Adaptive Icons部分设置好前景和背景层。2.2.2 分辨率与权限在Player - Resolution and Presentation中根据游戏需要设置屏幕方向、是否全屏等。在Player - Other Settings部分仔细检查Configuration子项Scripting Backend对于新项目优先选择IL2CPP。它相比Mono能带来更好的性能和安全保护并且是64位应用Google Play强制要求的必要条件。虽然编译时间稍长但利远大于弊。Target Architectures在Target Architectures下至少勾选ARMv7和ARM64。x86架构可以视情况勾选如果目标用户包含老旧Android模拟器或特定Intel芯片平板。AAB的优势就在于即使你勾选了全部架构最终分发时也只会给用户其设备所需的那个。Minimum API Level根据你的目标用户群体设置。目前Google Play要求新应用至少以Android 12API级别31为目标平台。Target API Level建议设置为最新的稳定版如Android 14 API级别34。Package Name确保Bundle Identifier包名是唯一且正确的格式如com.YourCompany.YourGame。这是应用在商店的唯一标识上传后不可更改。2.2.3 AAB专属设置这是最关键的一步。在Player - Publishing Settings部分Build App Bundle (Google Play)务必勾选这个选项。这是生成AAB文件而非APK的开关。Split Application Binary这个选项通常建议勾选。它会让Unity在构建AAB时将本地代码库.so文件按CPU架构拆分到不同的模块中这是AAB实现按需分发的基础。Custom Main Gradle Template与Custom Gradle Properties Template对于大多数标准Unity项目不需要启用。但如果你需要深度定制构建流程例如添加特定的Gradle依赖、配置混淆规则则需要启用并修改这些模板文件。这是一个进阶话题操作不当极易导致构建失败初期建议保持默认。2.3 资源管理与纹理优化AAB的按需分发特性让我们更需要关注资源的管理方式。对于Unity游戏最大的体积通常来自纹理、音频和AssetBundle。纹理格式与压缩针对Android平台应优先使用ASTC纹理压缩格式。在Texture Import Settings中将Format设置为ASTC并根据纹理用途选择块大小如UI用ASTC 6x6高清贴图用ASTC 4x4。ASTC相比旧的ETC2格式在相同质量下体积更小或在相同体积下质量更高。确保为不同Android纹理压缩格式如ETC2 fallback生成多份资源这可以通过Texture Compression设置中的Compression选项为ASTC并勾选Fallback来实现AAB会智能地分发正确的版本。管理AssetBundle如果你的游戏资源通过AssetBundle动态加载AAB的Play Asset Delivery (PAD) 功能可以完美替代传统的自行下载方案。你可以将AssetBundle标记为“Install-time”随基础包安装、“Fast-follow”安装后立即后台下载或“On-demand”运行时按需下载资源包。这需要你在Unity中安装“Android App Bundle”编辑器插件并在插件界面中进行配置。将大型资源如过场动画、高清材质包设置为“Fast-follow”或“On-demand”能显著减少首次安装的包体大小。清理无用资源定期使用Unity的AssetBundle Browser工具或编写编辑器脚本分析项目中未被任何场景引用的资源。这些“孤儿资源”如果被打包进构建会白白增加AAB体积。一个干净的资源目录是优化体积的第一步。3. 生成AAB文件构建流程详解与常见报错处理配置妥当后就可以开始构建了。这个过程可能会遇到各种问题我将结合常见报错带你走通整个流程。3.1 标准构建步骤打开File - Build Settings。在Scenes In Build列表中确保你的启动场景和所有需要打包的场景都已添加且顺序正确。在Platform列表中选择Android点击Switch Platform。这个过程可能会花费一些时间因为Unity需要重新导入所有资产的Android特定版本。点击Player Settings...再次确认Publishing Settings中的Build App Bundle (Google Play)已勾选。回到Build Settings窗口你有两个选择Build直接生成AAB文件。Build And Run生成AAB并尝试安装到连接的设备或模拟器上。注意AAB文件本身不能直接安装。当你选择Build And Run时Unity实际上会先用AAB配置生成一个用于本地测试的通用APK通常体积较大然后安装它。这仅用于基础功能测试不能替代真正的AAB分发测试。点击Build选择输出目录和文件名如YourGame.aab开始构建。3.2 构建过程中的“拦路虎”与解决方案构建过程并非总是一帆风顺以下是我遇到过的典型问题报错CommandInvokationFailure: Gradle build failed.这是最常见的错误信息笼统。你需要查看Console窗口更详细的错误堆栈。情况ACould not determine java version from xx.x.x。这通常是JDK版本不兼容。Unity 2020通常需要JDK 11或17。去Preferences - External Tools将JDK路径指向Unity内置的OpenJDK通常位于Unity安装目录下或者自行下载并指定一个兼容的JDK版本。情况BFailed to apply plugin com.android.internal.version-check或Could not find com.android.tools.build:gradle:x.x.x。这是Gradle插件版本与Android Gradle Plugin (AGP) 版本不匹配。Unity会使用自带的Gradle和模板。解决方法通常是1尝试在Player Settings - Publishing Settings中启用Custom Main Gradle Template然后在生成的mainTemplate.gradle文件中修改dependencies块里的classpath com.android.tools.build:gradle:xxx版本号。但这是一个危险操作需要反复测试。更稳妥的方法是检查Unity版本是否过旧升级到一个更稳定的LTS版本。情况CDuplicate class found。项目中的某些Android插件如不同的广告SDK、支付SDK可能引入了相同但版本冲突的第三方库如OkHttp, Gson。这需要你仔细检查所有Android插件的.aar或依赖声明找出冲突的库并通过修改Gradle模板排除重复依赖或者联系插件提供商获取兼容版本。报错IL2CPP linker failed这通常发生在使用IL2CPP后端时代码裁剪Code Stripping过于激进将运行时需要的代码移除了。尤其是在使用了反射Reflection或动态加载的代码中。解决方案在Player Settings - Other Settings - Configuration中尝试将Managed Stripping Level从High降低为Medium或Low。如果问题依旧你需要创建一个link.xml文件放在Assets根目录在其中明确告诉IL2CPP不要裁剪某些命名空间或程序集。例如如果你使用了Newtonsoft.Json可能需要添加assembly fullnameNewtonsoft.Json preserveall/。构建成功但AAB文件异常小如只有几MB这很可能意味着你的场景、资源根本没有被打包进去。检查Build Settings中的场景列表是否为空或顺序错误。项目中的资源是否因为路径错误、命名不规范或导入设置问题导致Unity无法识别和打包。检查Console窗口是否有关于资源导入的警告。如果你使用了Addressables或自定义的构建脚本请检查构建流程是否正确地将资源纳入了AAB的构建管道。3.3 构建后分析使用bundletool检查AAB生成AAB文件后不要急于上传。Google提供了强大的命令行工具bundletool用于分析、验证AAB并能从AAB生成针对特定设备的APK用于本地测试。下载bundletool从GitHub的Google/bundletool发布页面下载最新的jar文件。验证AAB在命令行中运行java -jar bundletool-all-x.x.x.jar validate --bundleyour_app.aab这个命令会检查AAB的格式是否正确资源配置是否有效。任何警告或错误都应在此阶段解决。生成设备规格JSON要生成针对你测试设备的APK你需要一个设备规格文件。将你的Android设备通过USB连接到电脑并启用USB调试然后运行java -jar bundletool-all-x.x.x.jar get-device-spec --outputdevice-spec.json这会在当前目录生成一个device-spec.json文件其中包含了你的设备支持的ABI、屏幕密度、语言等详细信息。从AAB生成APK Set (APKS)java -jar bundletool-all-x.x.x.jar build-apks --bundleyour_app.aab --outputmy_app.apks --modeuniversal--modeuniversal会生成一个包含所有资源的通用APK方便快速测试。如果你想生成针对特定设备的优化APK则使用java -jar bundletool-all-x.x.x.jar build-apks --bundleyour_app.aab --outputmy_app.apks --device-specdevice-spec.json安装APKS到设备java -jar bundletool-all-x.x.x.jar install-apks --apksmy_app.apksbundletool会自动将合适的APK安装到已连接的设备上。这是测试AAB分发逻辑是否正常的最重要一步。安装后检查游戏是否能正常运行资源是否加载正确特别是那些配置为PAD的资源包。4. AAB的本地测试、云测试与上传前终极检查生成AAB并完成基础功能验证后我们还需要进行更全面的测试以确保它在Google Play的复杂分发环境下万无一失。4.1 多设备配置模拟测试你的用户可能使用各种不同配置的设备。我们需要模拟这些情况测试AAB生成的APK是否都能正常工作。bundletool的get-size命令可以预估不同设备上的下载大小和安装大小但真正的运行时测试还需要实际设备或模拟器。使用Android模拟器在Android Studio中创建多个不同配置的模拟器AVD。例如低端机API 30 ARM ABI 720p屏幕。高端机API 34 ARM64 ABI 1440p屏幕。平板大屏幕 x86_64 ABI。 针对每个模拟器重复上一节中“生成设备规格JSON”和“安装APKS”的步骤。观察游戏在不同分辨率、不同内存配置下的表现。测试多语言与本地化资源如果你的游戏支持多语言确保在AAB的资源配置中包含了所有语言的字符串和资源。使用bundletool为不同语言区域的设备规格生成APK并安装检查UI文本、音频、图片等是否正确切换。4.2 测试Play Asset Delivery (PAD)如果使用了PAD来分发大型AssetBundle测试就更为关键。你需要测试三种交付模式Install-time资源包应随基础应用一起安装。测试方法就是常规安装后启动检查资源是否存在。Fast-follow应用安装后应立即开始下载。测试时安装完基础APK后观察网络请求和磁盘空间变化并在游戏中验证相关资源是否在后台下载完成后才可用。On-demand资源包在游戏内特定时机触发下载。你需要编写测试用例在游戏中调用Play Asset Delivery的API如RetrieveAssetPackAsync来请求资源包并监控下载进度、处理完成和失败回调。注意测试PAD的Fast-follow和On-demand模式强烈建议使用内部测试轨道Internal Testing或封闭测试轨道Closed Testing在Google Play真实环境中进行。因为本地模拟的安装可能无法完全模拟Play商店的下载管理服务。你可以将AAB上传到Play Console的内部测试轨道然后通过邀请链接安装测试版这是最接近真实用户场景的测试方式。4.3 使用Google Play的“内部应用分享”进行快速测试这是一个被许多开发者忽略的利器。在Play Console的“发布”-“内部应用分享”页面你可以直接上传AAB或APK文件并生成一个短链接。任何拥有此链接的人无需加入测试名单都可以通过浏览器在Android设备上直接安装这个版本。它绕过了正式的审核流程非常适合在团队内部或小范围外部测试者中快速分发测试包验证AAB的安装和运行情况。4.4 上传Google Play前的终极清单在点击“上传新版本”按钮前请最后核对以下清单[ ]版本号与版本代码确保Player Settings中的Version和Bundle Version Code已递增。Version Code必须是整数且每次上传都必须大于上一次。[ ]64位支持确认Target Architectures中包含了ARM64并且使用IL2CPP后端。Google Play要求所有应用必须支持64位。[ ]目标API级别确认Target API Level已设置为要求的版本目前是API 34/Android 14。过低的API级别会被拒绝。[ ]隐私政策如果应用需要任何权限如网络、存储确保在Play Console的应用内容中填写了有效的隐私政策链接。[ ]内容分级已完成应用的内容分级问卷。[ ]商店列表更新了应用描述、截图、宣传图等与新版本内容匹配。[ ]AAB分析使用bundletool validate命令确认AAB无错误。[ ]测试覆盖至少在2-3台不同配置的真实设备上通过内部测试轨道安装并完整通关了核心流程。[ ]回滚计划想好如果这个版本出现严重问题如何快速回滚到上一个稳定版本。通常意味着你需要保留上一个版本的AAB文件和所有配置记录。5. 进阶话题AAB与持续集成/持续交付CI/CD的集成对于团队项目手动执行上述所有步骤既繁琐又容易出错。将AAB构建和测试集成到CI/CD流水线中是提升效率、保证质量的最佳实践。5.1 使用Unity Build Pipeline或自定义脚本自动化构建你可以使用Unity命令行Unity.exe或Unity在无界面的批处理模式下执行构建。一个基本的命令示例如下Unity -quit -batchmode -projectPath /path/to/your/project -executeMethod YourEditorScript.PerformBuild -logFile build.log其中YourEditorScript.PerformBuild是一个你编写的C#编辑器脚本静态方法里面调用BuildPipeline.BuildPlayer并配置好所有PlayerSettings如启用AAB、设置版本号等。通过命令行参数你可以动态传入版本号、构建目标等变量。5.2 在CI服务器中集成bundletool验证与测试在CI服务器如Jenkins, GitLab CI, GitHub Actions上构建步骤完成后可以自动执行以下操作调用bundletool validate验证生成的AAB文件如果失败则中断流水线并通知开发者。生成多设备APK集针对一组预定义的设备规格文件代表你的主流用户设备自动运行bundletool build-apks生成测试包。部署到测试设备群如果公司有设备农场如Firebase Test Lab或自建的STF集群CI脚本可以自动将生成的APKS文件安装到多台真实设备上并启动自动化测试如Unity Test Runner或基于Appium的UI测试。上传到内部测试轨道在验证通过后CI脚本可以调用Google Play Developer API自动将AAB上传到Play Console的内部测试轨道并发布给测试人员。5.3 版本管理与发布自动化通过CI/CD你可以将版本号、版本代码的递增规则化。例如每次向主分支合并时自动基于时间戳或提交次数生成版本代码并打上标签。构建出的AAB文件可以自动归档并与Git标签关联。发布到生产环境正式版也可以是一个需要手动触发但参数化的流水线阶段减少人为操作失误。将AAB打包测试流程自动化意味着每次代码提交都能快速得到可测试的包体质量问题能更早被发现团队可以更频繁、更自信地向用户交付更新。这从工程管理上是将AAB带来的技术优势转化为了实实在在的团队效能和产品稳定性优势。从手动配置到自动化流水线从面对构建报错的手足无措到游刃有余地排查掌握AAB的完整流程是现代Unity Android开发者必备的技能。这个过程虽然初期有学习成本但它带来的应用体积优化、分发灵活性和开发流程的规范化对于提升产品竞争力和团队协作效率至关重要。希望这篇结合实战经验的梳理能帮助你顺利跨越AAB的门槛更高效地将你的游戏交付给全球玩家。
返回列表