ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Cocos Creator 3.8.8安卓APK打包全流程:从构建到Android Studio出包

Cocos Creator 3.8.8安卓APK打包全流程:从构建到Android Studio出包 其实在社区里经常看到有人问同一个问题我Cocos Creator项目做完了点了“构建”等了半小时结果连个APK的影子都没见到。如果你用的版本正好是3.8.8那么我告诉你这不是你的操作有问题而是3.x时代的构建流程已经跟2.x完全不一样了。Cocos 3.8.8打包安卓APK这套流程核心变化就一句话编辑器只负责生成一个原生安卓工程真正出APK要靠Android Studio或者命令行Gradle来完成。这篇文章我会把从环境配置、构建参数、AS工程处理到常见报错排查的完整过程全部拆开讲适合第一次用3.8.8打安卓包的朋友照着一步步操作。先说下我自己走过的弯路。刚从2.x升到3.8时我习惯性地点“构建”以为会跟以前一样弹出一个APK文件。结果构建完成以后编辑器只是给出了一个“构建成功”的提示然后我对着输出目录找了好久也没找到安装包。后来才明白3.8.8的构建流程被拆成了两段第一段是Cocos侧的资源与原生工程生成第二段是安卓侧的真实编译打包。下面我会按完整的实操顺序来写尽量把每个需要在哪个界面里操作、哪个参数会影响什么都用文字描述清楚方便你对照着去点。1. 为什么你的3.8.8总是找不到一键出包构建和出包早就被拆成了两段1.1 3.8.x与2.x的流程差异构建产物从“一个APK”变成了“一套安卓工程”在Cocos Creator 2.x时代你选择Android平台之后点一下构建编辑器会用内置的Gradle直接给你打出一个APK整个过程是在编辑器内部闭环的。到了Cocos Creator 3.x尤其是3.8.8架构改成了“引擎工具链 原生工程模板”分离的方式。编辑器的工作重心变成了把项目里的场景、脚本、资源、插件整理好再套用一套标准的安卓Gradle工程模板生成一个你可以用Android Studio打开的完整工程目录。这个目录里包含了Java/Kotlin源码、C引擎源码、libcocos.so相关的构建配置、ndk相关的构建脚本以及最终会打进包里的assets资源。我通常用一个比喻来解释这件事2.x时代的构建是一条流水线原料进去成品APK出来3.8.8更像“预制菜”——Cocos负责把食材洗干净切好、调料包配齐但真正下锅炒这一下得由Android Studio这个“厨师”来做。也就是说你的3.8.8构建面板本身并不是不会出APK而是默认的构建策略变成了“只到工程为止”。如果你在构建面板里找不到一键出包的按钮不用慌这不是版本阉割了功能而是工作流升级了。1.2 构建到底生成了什么这些目录都是干嘛的3.8.8构建完Android平台后默认会在项目根目录下生成一个build目录里面有几个关键子目录你必须分清楚build/android/proj这是最重要的目录是一个完整的Gradle工程后续用Android Studio打开的就是它。build/android/assets游戏运行时的脚本、资源和配置最终会放到这里构建APK时这个目录会被打包进assets。native/engine原生引擎模板和源码的“工作区”如果你的项目需要修改C层或者Java层的入口逻辑一般就是改这里的代码。强调一下native/engine这个目录。很多教程会让你直接去修改build/android/proj里的Java源码但我实测下来如果你在3.8.8里用了默认模板下次重新构建时会有一层“用模板覆盖”的逻辑改在build下的源码很容易被还原。稳妥的做法是把native/engine当成你的原生代码工作区二次构建时它的内容会参与生成最终工程。另外3.8.8的构建是增量式的。如果你只是改了脚本资源再点构建会比第一次快很多但如果你动了构建平台、改了包名、换了签名这类影响工程配置的东西最好把build目录整个删掉再重新构建避免残留配置互相打架。这个“删build保平安”的经验后面排查诡异报错时还会反复用到。2. 打包前三件事JDK、SDK、NDK到底按什么标准配对2.1 在编辑器里配置外部程序菜单路径在开始构建之前先把Cocos Creator 3.8.8的外部程序路径检查一遍。点开菜单栏的【文件】→【偏好设置】→【外部程序】你会看到三项关键配置Java SDK也就是JDK安装目录Android SDK安卓SDK目录NDK安卓NDK目录我建议这三项都手动指定到具体路径不要依赖“自动检测”。实际开发中我见过太多次因为自动检测到错误版本而导致的构建异常比如编辑器找不到JDK却仍能打开、构建到一半报NDK版本不对等。手动指定的具体方法是JDK填到你安装目录的根路径比如D:/Java/jdk-11SDK填到D:/Android/SdkNDK填到D:/Android/Sdk/ndk/21.4.7075529。注意NDK路径一定要指到具体版本文件夹那一层指到ndk上层目录是无效的。2.2 版本搭配的经验值避免“能用但报错”的组合版本匹配这件事很多人一开始不注意等报错才回头折腾。根据我的实测3.8.8用下面这一套组合是最省心的组件建议版本踩坑提示JDK11或17低版本配合AS会提示不支持高版本可能遇到Gradle兼容性警告Android SDKAPI 33或34在SDK Manager里把对应Platform Tools装齐NDK21.4.x 或 23.x超过25.x在CMake阶段很容易报编译器相关错误Cocos 3.8.8默认用的Gradle版本不算太新所以NDK版本如果太激进会出现各种匪夷所思的问题。我自己在升级电脑环境时一次性装了最新的NDK 26结果构建时提示找不到某个clang工具链换回NDK 21.4后一次通过。如果你不确定装哪个建议先装一个21.4.x这个是很多Cocos版本默认绑定的NDK版本兼容性最有保证。还有一个容易忽略的细节SDK Manager里不一定所有平台版本都装了。构建面板里的“Target API Level”下拉框只会列出你已安装的SDK平台如果没有你需要的级别要去Android Studio里打开SDK Manager勾选并安装好对应的版本。千万别只装最新版API有些旧依赖在API 35上反而不认。2.3 密钥库最容易忽略却最致命的一环密钥库keystore概念不复杂但它决定你的APK能否顺利安装到别人的手机上。安卓系统要求所有APK必须有签名如果没有签名或签名过期安装时会直接报“安装解析失败”或者在部分机型上闪退。3.8.8构建面板里专门有“密钥库”配置区需要填以下内容密钥库路径一个.keystore或.jks文件的绝对路径密钥库密码别名别名密码如果你还没有密钥库可以用命令行生成一个在终端里执行keytool -genkey -v -keystore my-release.keystore -alias myalias -keyalg RSA -keysize 2048 -validity 10000这里-validity 10000单位是天大概27年足够覆盖一个产品的生命周期。生成过程中会让你输入组织、姓名等信息这些随便填就行关键是记住密码和别名。另外提醒一句keystore文件务必多备份几份发到网盘或U盘都行。一旦丢了你只能换包名重新上架所有已安装用户的更新通道都会断掉这算是安卓发布里最惨烈的翻车现场之一。提示构建面板里的密钥库密码和别名密码Cocos会写进生成的gradle配置里。如果密码填错构建日志会提示“密钥库被篡改”或“密码不正确”这时候直接回去改配置再重新构建即可。3. 构建面板逐项拆解Bundle ID、签名、Gradle参数到底怎么填3.1 构建平台的必填项包名、版本号、屏幕方向打开【项目】→【构建发布】平台选“Android”你会看到构建参数面板。这些参数看着多真正需要你动手好好填的其实就那几个。包名Bundle ID是第一个要小心的。它必须是反向域名格式比如com.yourcompany.gamename。这个包名一旦上线就不能再改了因为所有用户通过它来识别你的应用热更、推送、支付回调也都跟它绑定。我第一次打包时随手填了个test后来想改结果等于重新发一个应用前期的测试用户全部得手动卸载重装。所以你哪怕做的是测试包也建议用正式的包名格式。版本号这里也要注意构建面板里的“版本号”会对应安卓的versionName但安卓市场还认一个versionCode这是给系统识别用的整数。3.8.8生成的工程里有一个地方可以单独设置versionCode如果你要做热更新版本号需要和资源服务器的版本策略对齐。发版前把这两个数字理清楚能避免你反复“为什么我改了版本号用户却没收到更新”的困惑。屏幕方向、横竖屏这些选项按游戏需要选即可但要注意“可横可竖”模式在某些安卓机型上会触发Activity重建如果游戏没有处理生命周期变化容易白屏。我的习惯是一开始就锁定方向省去一类潜在Bug。3.2 三个最容易被忽略的复选框构建面板里有几个复选框很多人不知道它们是干嘛的我一个个说“生成APK”如果你勾选了它Cocos会在构建完工程后用命令行帮你直接执行一次gradle打包最终在build/android/proj/app/build/outputs/apk/下出现APK。听起来很方便但我个人建议不勾而是放进Android Studio里出包。原因很简单AS里你能实时看到日志、选择Build Variant、做签名配置一旦报错排查起来比看黑框日志舒服太多。更何况多数人做开发调试时本来就要开着AS。“只构建原生引擎”这个选项关联到原生代码的调试。如果你不勾编辑器会建立一个依赖关系方便你从编辑器直接跑原生工程如果勾了构建只处理引擎部分常用于原生层的二次开发。正常打安卓包不勾就行。“跳过编译脚本”一般不用动保持默认即可。3.3 关于“模板”菜单default模板和link模板的区别3.8.x的构建参数里有一个“模板”选项分为default和link两种。这一点很多新手没注意但恰恰是决定你原生开发体感的关键。default模板的做法是每次构建时从引擎模板完整拷贝一份生成原生工程。特点是“干净”但要修改原生代码的话每次重新构建后你改的内容可能被覆盖除非你非常清楚自己改了哪些文件。link模板的做法是只生成一套链接到native/engine的工程原生代码直接基于工作区修改重新构建时引擎目录作为内容源参与编译不会被模板重置。这个模式更适合要写原生插件、改Java入口、接入第三方SDK的团队。我的建议是如果有“模板”选项选link。从3.8.8开始如果你用link模板构建出来的native/engine路径就是你的“原生代码仓库”后续AS编译时直接引用它。没有了“改完被覆盖”的思想负担效率会高很多。3.4 构建选项ABI的选择宁可全选不要贪省空间ABI应用二进制接口决定你的包支持哪些手机CPU架构。构建面板里的“APP ABI”会有armeabi-v7a、arm64-v8a、x86_64等选项。arm64-v8a目前绝大多数主流手机都是这个架构必须选。armeabi-v7a老一点的32位设备还在用如果你的用户还有存量老机型建议保留。x86_64主要用于安卓模拟器。你如果要在电脑模拟器上调试游戏就必须勾上它否则会看到模拟器里安装完就闪退。我见过不少团队为了压缩包体只选arm64-v8a结果在模拟器上测不了、在老手机上装不上来来回回浪费时间。其实从APK大小上看多两个so库增加也就几十MB换来的是兼容性非常划算。如果你很在意包体可以做多通道或按需下载so而不是直接砍ABI。4. 把构建产物放进Android Studio从Sync失败到Release签名出APK4.1 第一次打开工程之前最好先改掉Gradle下载地址构建完成后打开Android Studio选择“Open”找到build/android/proj目录打开。这时候AS会开始Gradle Sync而这个阶段是很多人卡死的重灾区。Cocos生成的工程里Gradle的下载地址默认是指向官网仓库的。在国内网络环境下这个下载经常超时表现为AS底部一直转圈、控制台反复报Downloading ...然后卡住。其实这个地址是可以自己改的。找到build/android/proj/gradle/wrapper/gradle-wrapper.properties打开后你会看到一行distributionUrl可以把它替换成国内镜像地址distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-8.0.2-all.zip注意中间的反斜杠转义不能丢。如果你的某个版本不是8.0.2去腾讯镜像里找对应的文件名换一下即可。还有一种更稳妥的方式先去网上下载对应版本的zip包放到本地路径后改成这样distributionUrlfile\:///D:/gradle/gradle-8.0.2-all.zip这样AS会直接从本地文件解压连下载都省了。改完之后重新Sync一次速度会明显不一样。4.2 解决“SDK location not found”与仓库镜像替换如果你打开工程后遇到“SDK location not found”的弹窗说明AS还没找到安卓SDK位置。这时候有两种处理方式一是通过AS的SDK Manager重新指定路径二是手动在工程根目录下创建或修改local.properties写入sdk.dirD\:\\Android\\Sdk保存后再Sync即可。需要注意的是这个文件是本地文件不要提交到Git仓库因为其他人机器的SDK路径大概率不一样。接下来是关于依赖仓库的问题。AS开始Sync时除了Gradle本身还会拉取Android插件和相关依赖库。如果卡在类似“Could not resolve com.android.tools.build:gradle”的地方多半是仓库访问慢。你可以把settings.gradle或根build.gradle里的仓库地址改成阿里云镜像。通常是这样几段maven { url https://maven.aliyun.com/repository/public } maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/gradle-plugin }把原来的google()和mavenCentral()注释掉或者放在镜像后面都行。等依赖全部缓存完再切回官方源也可以。这里我建议至少备份一份原始的gradle文件改坏了能随时还原。4.3 从“Debug”到“Release”签名配置与执行顺序Sync成功后你可以在AS左侧看到完整的工程结构。要看包名路径下有个AppActivity.java这就是安卓入口。从右上角打开“Build Variants”面板会选择debug和release两种变体。调试阶段建议直接选debug调试包使用的是安卓默认debug签名没有配置keystore也能打包。当你要发真正的测试包或上架包时切到release如果没有签名配置AS会有提示。配置签名有两条路径。工程级的配置在app/build.gradle文件里可以这样手动加android { signingConfigs { release { storeFile file(D:/sign/my-release.keystore) storePassword 你的密钥库密码 keyAlias myalias keyPassword 你的别名密码 } } buildTypes { release { signingConfig signingConfigs.release minifyEnabled false } } }如果你不想手动改gradle也可以走菜单【Build】→【Generate Signed Bundle / APK】→【APK】→【Next】一步步选择keystore和密码即可。两种方式本质一样。执行打包的时候我习惯双击右侧Gradle面板里的app→Tasks→build→assembleRelease。打包完成后产物在build/android/proj/app/build/outputs/apk/release/目录下文件名一般是app-release.apk。用数据线连上手机直接把APK拖进去安装体验一下流程是否正常。提示Release包默认开启了资源压缩不对——3.8.8生成的工程里默认minifyEnabled通常是false也就是不混淆。如果你自己开了混淆请务必测试JNI相关逻辑否则很容易出现“签名没问题一装就闪退日志报UnsatisfiedLinkError”的情况。5. 链接模板与原生代码接入在Java层写东西后如何让项目不白改5.1 3.8.8里原生代码改在哪native/engine是你的工作区做安卓游戏迟早要接触原生层。无论是接入广告SDK、分享功能还是获取设备信息都得在Java层写点东西。3.8.8里的原生代码主要在native/engine/android目录下尤其是src目录里能看到入口Activity的源码。如果你用的是link模板那这里就是你的主战场。日常开发流程我会这样安排先在Cocos里把构建跑通然后不再碰Cocos构建面板。之后一直在AS里做原生修改、编译、调试。只有当你的Cocos脚本或资源发生重大变化时才需要回到编辑器重新构建一次让新的脚本和资源产物更新到工程里。这里有个痛点很多教程让你改了Java之后回到Cocos“重新构建”结果一构建原生修改没了。这是因为default模板会用引擎模板重新生成原生目录。所以我才反复强调如果你注定要写原生代码请在一开始就选link模板并在构建后把native/engine视为你的正式源码目录做好版本管理。5.2 default模板和link模板在二次构建时的行为差异把两种模板的差异再说细一点。default模板像“工厂统一产线”引擎模板是标准件构建一次生成一份全新的你改的东西如果不在模板覆盖范围之外就会被重置。link模板像“半定制产线”构建时通过目录链接把模板和你的工程关联起来所以源码在你的工作区里构建过程只是引用它不会重置你写过的东西。实际测试中用link模板之后二次构建的另一个好处是整体耗时更短因为不需要重复拷贝大量原生文件。我不止一次在群里看到有人报“构建一次要半小时”仔细一问都在用default模板。切到link之后很多人第一次构建虽然没快多少但从第二次开始体感差别非常明显。如果你已经在用default模板并且改了原生代码想切link注意不能直接在面板上改模板就完事最好先备份自己改过的文件删掉build和native/engine里对应的生成内容再重新构建否则新旧文件混在一起会出现一些奇怪的双份类定义问题。5.3 修改JS脚本后的两种选择重新构建或手动同步assets和原生代码不同Cocos脚本TypeScript/JavaScript编译后的产物最终会以资源文件的形式放到APK的assets里。如果你只改了一行TS脚本不想等完整构建有一个捷径直接找到build/android/assets目录把src或相关资源目录里的对应文件手动替换掉然后再在AS里重新打包。这个方式在快速验证某个改动时很好用但只适合单人开发或测试阶段。如果团队多人协作或者改动涉及的脚本较多还是老老实实回到Cocos构建面板重新构建一次让构建工具帮你处理增量依赖和资源打包避免人为漏文件。记住一个简单判断标准只改原生Java/C就去AS编译只改脚本或场景就回Cocos构建两边都改了先Cocos构建再去AS打最终包。6. 实测高频问题清单闪退、白屏、Gradle下载困局6.1 原生代码或JS改动没生效先分清楚你改的是哪一层这类问题最容易让人精神崩溃“我明明改了代码怎么打出来的包没变化”根本原因是改错了层。改Java代码后你只是在编辑器里点了构建但AS没有重新编译过原生工程或者你改了JS却完全没回Cocos构建直接AS打包旧的JS文件照样被塞进包。排查方法很简单查看APK内容。把app-release.apk用压缩工具打开看assets目录下JS脚本的时间戳或内容看lib目录下so库的大小变化。如果你改的是Java层代码重点看apk里的classes.dex是否在重新编译后变了如果你改的是脚本看assets里的src文件是否更新了。用这种“翻包看文件”的方式定位问题比对着log瞎猜快得多。6.2 安装后立即闪退优先检查ABI与so库这是新手上路最常遇到的现象APK装上了点开图标闪一下就没。别急着怀疑引擎有问题八成是ABI不匹配。比如你在x86_64的模拟器上运行一个只包含arm64-v8a的包系统加载so时会失败应用直接崩溃。排查顺序我建议这样先看设备是什么CPU架构再看包里的lib目录有没有对应的so。如果两者对不上回到构建面板把ABI补上重新构建。如果ABI没问题再看Logcat过滤FATAL和cocos关键字崩溃日志里一般会直接告诉你“找不到某个符号”或“某个方法不存在”这大概率是JNI绑定写错了或so库版本不一致。我碰到过一次非常隐蔽的情况项目里有两个子目录都放了同名so库其中一个版本旧AS打包时按优先级用了旧文件结果接口签名对不上全部JNI调用崩溃。最后把冗余目录清理干净就正常了。6.3 Gradle依赖下载慢/失败镜像方案与正确改法这个问题几乎是国服玩家的日常。除了前面说的gradle-wrapper.properties镜像替换还有一类是AS里Sync时拉Maven依赖卡住。我提供一个稳定的组合拳先改gradle-wrapper.properties里的distributionUrl用腾讯或华为镜像。再改settings.gradle里的仓库配置用阿里云镜像。在AS菜单的【File】→【Settings】→【Build, Execution, Deployment】→【Build Tools】→【Gradle】里勾选“Offline work”跑一次离线构建。第四步不一定所有环境都适用但当你确定所有依赖都已经缓存过之后离线模式能极大缩短Sync时间。需要注意如果某个依赖确实没缓存离线模式会立即报错这时取消勾选再Sync一次。有些朋友镜像配置写错了地方例如在build.gradle里改了半天却忘了settings.gradle里的pluginManagement区导致插件还是从官网拉。3.8.x生成的工程里插件仓库和依赖仓库可能分散在多个文件里改的时候逐一确认最好把google()保留在最后而不是删掉这样万一镜像缺东西还能兜底。6.4 版本号与构建缓存类报错clean之后再谈其他还有一种高频状况重新构建时报一堆奇怪的编译错误比如java.io.IOException、Existing file、Resource merged等这些往往和脏缓存有关。处理方案简单粗暴在AS里选择【Build】→【Clean Project】再重新构建如果还不行就把build目录整个删除重启AS。这里要特别提醒删除build目录后你需要在Cocos里重新构建一次才能恢复工程结构。所以删之前确认一下native/engine下有没有需要保留的原生修改。如果你用了link模板原生源码不受影响删除后重新构建即可。如果是default模板且你改过原生代码且没备份那删了就是真的全没了。从我个人的经验来看遇到弹出一堆无法理解的构建错误时清理后重新构建的成功率非常高这个操作值得养成习惯每次发布正式包之前先clean一遍保证打出来的是干净产物。还有一件事想单独提一下如果你在项目路径或包名里用了中文、空格、特殊符号很多莫名其妙的构建问题可能会找上门来。Cocos和Gradle工具链对这类字符的处理并不完美报错可能跟“乱码”“编码GBK”“文件不存在”混合在一起很难通过常规方式排查。我在接手一个别人项目时就见过项目路径带中文加空格构建系统在某些环境下直接罢工。所以新项目建议一开始就放在纯英文路径下名字也用英文能省掉一大块烦恼。跑完上面这套流程绝大多数人的第一个安卓APK应该已经能装进手机了。最后再分享一点我的实际感受3.8.8的安卓打包能力其实相当稳定大多时候你看教程头大是因为教程没把“编辑器构建”和“AS出包”这两个阶段分清楚。只要理解了这一点后续不管是换包名、升级版本、接原生SDK还是配置多渠道都是在这个流程上做加减法并不会觉得找不到方向。
返回列表