Defold 的核心卖点之一是「一份工程,多平台一键发布」。(Defold publish docs) 但每个平台都有各自的打包、签名、审核与性能要求。本文从构建原理出发,逐平台讲解 iOS/Android/Web/桌面的打包流程、签名配置与商店上架要点,最后给出包体与性能优化清单。
前置建议:先读 Defold 游戏引擎介绍 了解平台矩阵,再配合 热更新与热重载 理解发布后运营。资源打包细节可参考 编辑器与资源管线。
一、发布流程总览
1. 从工程到安装包
Defold 的发布本质是「bob 构建 → 生成各平台安装包」:
编辑器 File → Bundle → 选择平台
等价命令:
java -jar bob.jar --resolve --build --bundle --bundle-output build --platform ios
构建产物按平台生成:.ipa(iOS)、.apk/.aab(Android)、HTML5 目录(Web)、.dmg/.exe/.AppImage(桌面)。
2. game.project 中的平台配置
全局配置在 game.project,平台相关配置通常以平台名为 section 前缀:
[bootstrap]
main_collection = /main/main.collectionc
[display]
width = 1280
height = 720
[android]
package = com.example.mygame
version_code = 1
[ios]
bundle_identifier = com.example.mygame
version = 1.0.0
[html5]
run_archive = 1
3. 多平台差异矩阵
| 平台 | 包格式 | 签名要求 | 审核 | 热更 |
|---|---|---|---|---|
| iOS | .ipa / TestFlight | 必需(开发者证书+描述文件) | App Store 审核 | 支持 |
| Android | .aab/.apk | 必需(keystore) | Google Play 快审 | 支持 |
| Web | HTML5 静态目录 | 无 | 无(CDN 即发布) | 全量替换 |
| Windows/macOS/Linux | 安装包 | 可选(代码签名) | 商店各自审核 | 支持 |
二、iOS 打包与签名
1. 前置条件
iOS 发布需要:
- Apple Developer 账号($99/年)
- 一个 Bundle Identifier(如
com.example.mygame,需在 game.project 的[ios]中一致) - 推送/内购等能力需在 Apple 后台配置
2. 签名流程
iOS 签名 = 开发者证书(.p12)+ 描述文件(Provisioning Profile):
- Apple Developer 后台创建 App ID,勾选所需 Capability
- 生成证书请求 → 下载
.cer→ 导入钥匙串导出.p12 - 创建开发/发布描述文件
.mobileprovision - bob 构建时通过
--identity与描述文件签名
java -jar bob.jar --build --bundle --platform ios \
--identity "iPhone Distribution: Leeting Yan (XXXXXX)" \
--mobileprovisioning path/to/profile.mobileprovision
3. 构建与真机验证
- 编辑器 Bundle 生成
.ipa后,可用 Xcode 的Payload目录直接安装到真机验证 - 建议先走 TestFlight 内测:用 App Store Connect 上传
.ipa,邀请测试者验证后再提交审核 - 模拟器构建与真机构建不同:真机需要 arm64 架构,bob 默认按平台生成
4. App Store 上架要点
- 启动图 / 图标:
[ios]中app_icon指向图标文件,大小须满足 Apple 规范 - 隐私:需要隐私政策链接;收集 IDFA 需说明
- 审核注意:提审前关闭测试入口、清理占位内容;Game Center/内购配置完整
- 版本号与构建号:
CFBundleVersion每次递增,与[ios]的version区分
三、Android 打包与签名
1. 构建 AAB/APK
Google Play 现已推荐 AAB(App Bundle),由商店生成分屏 APK:
java -jar bob.jar --build --bundle --platform android \
--bundle-format aab \
--keystore path/to/keystore.jks \
--keystore-pass storepass --keystore-alias myalias
game.project 中 [android] 设置包名与版本:
[android]
package = com.example.mygame
version_code = 12 -- 每次上传递增
2. keystore 管理
Android 签名用自签名 keystore,一旦丢失无法恢复商店身份:
- 首次生成后备份多份,私钥密码妥善保管
- 上传 Google Play 用
.keystore,App 更新必须同一 keystore - 支持内购/广告 SDK 时,包名须与 SDK 后台注册一致
3. 构建变体与渠道
通过 bob 的 --variant 与资源目录可实现多渠道(各商店或国内渠道):
- 不同渠道包用不同
variant,动态注入渠道 ID - 国内渠道(华为/小米等)有各自签名与审核要求,需分别打包
- 灰度与渠道配置见 热更新与热重载
4. 真机与审核注意
- 用
adb install安装 APK 真机验证启动、网络与内购 - Google Play 政策:targetSdk 需达标(Defold 各版本有对应要求),外链、隐私政策齐全
- 包体大于 150MB 需走 Play Feature Delivery 或扩展文件策略
四、Web(HTML5)构建
1. HTML5 输出
Web 平台输出为一组静态文件(.html + .js + .wasm + 资源归档):
java -jar bob.jar --build --bundle --platform html5 --bundle-output build/html5
产物可直接部署到任意静态托管:CDN、GitHub Pages、Vercel 等。(HTML5 官方手册)
2. 加载与进度
Web 游戏最忌「白屏等待」。Defold 支持配置加载画面与进度:
[html5]段run_archive控制是否从归档运行- 自定义加载页面:编辑
custom.html模板,显示进度条 - 归档较大时优先启用
collectionproxy懒加载与 Live Update 外置资源
3. 移动端浏览器适配
- 设置
game.project的 viewport 与旋转锁定(横屏游戏锁定 landscape) - 触控输入用
input绑定适配,虚拟按键用 GUI 实现(见 GUI/UI 开发) - 自动暂停:页面切后台时处理
visibilitychange,暂停游戏计时器
4. 性能与兼容性
Web 平台的性能瓶颈主要在资源加载与渲染:
- 纹理格式:Web 下用 WebP/ASTC 压缩,控制显存
- 减少 Draw Call:图集合批是首要手段
- 兼容测试:Chrome/Safari/Firefox 与不同 GPU 下验证 shader(参见 图形学专题)
五、桌面平台打包
1. Windows / macOS / Linux
桌面构建同样一条命令:
java -jar bob.jar --build --bundle --platform win32 # Windows
java -jar bob.jar --build --bundle --platform macos # macOS .app
java -jar bob.jar --build --bundle --platform linux # Linux
2. 代码签名与分发
- macOS:Gatekeeper 要求签名与公证(notarization),否则用户需右键打开
- Windows:用 Authenticode 证书签名,减少 SmartScreen 拦截
- 分发渠道:Steam(建议原生 + 云存档)、itch.io、自建下载页
3. 桌面输入与窗口
[display]设置窗口尺寸、全屏模式与刷新率- 桌面输入绑定键盘/鼠标/手柄,注意从移动触控输入迁移
- 存档路径:用
sys.get_save_file()获取平台持久目录,避免硬编码
local path = sys.get_save_file("mygame", "save.dat")
local f = io.open(path, "w")
f:write("level=3")
f:close()
4. Steam 发行注意
Steam 对 Defold 游戏的支持度较高(官方有 Steamworks 扩展):
- 用 Steamworks SDK 扩展接入成就、云存档与创意工坊
- 提交内容分为 Depot:主游戏内容 + 可选 DLC,可独立热更
- Steam 商店页需要质量承诺:截图、预告片、分类标签齐全才容易曝光
- 建议在早期版本就接入 Steam 云存档,避免上线后数据迁移
5. macOS 的 Gatekeeper 与公证
- 未签名/未公证的
.app会被系统拦截,用户需右键「打开」绕过 - 正规分发用
Developer ID Application证书签名,并通过notarytool公证:
xcrun notarytool submit build/macos/MyGame.app --apple-id $APPLE_ID --password $APP_PASSWORD
- 公证后产品上架 Mac App Store 或自托管分发都更顺畅
六、Store 发布与上架材料
1. 商店素材清单
各商店(App Store / Google Play / Steam)素材大同小异,提前准备:
- 图标:多种尺寸 PNG,含圆角/透明规范
- 截图:至少 5-8 张,按商店推荐分辨率
- 宣传图 / 视频:Google Play 需要短视频(可选),Steam 需要商店页
- 隐私政策:链接必须有,且内容与真实数据收集一致
2. 元数据与本地化
- 标题与描述本地化到目标市场语言,关键词优化(ASO)
- 年龄分级问卷如实填写(有暴力/抽卡内容影响分级)
- 版本说明(What’s New)记录每次更新,配合 热更新与热重载 的节奏
3. 上架后的验证
- 下载商店正式包,验证安装、更新、内购与广告 SDK 回调
- 监测崩溃(Crashlytics / Sentry 等 SDK 接入)
- 关注商店控制台的安装量、卸载率与评分,指导下一次迭代
七、自动化发布与 CI/CD
1. bob 的 headless 构建
bob 可在无编辑器环境下运行,天然适合 CI。一个完整的发布流水线:
#!/usr/bin/env bash
set -euo pipefail
VERSION="${1:-1.0.0}"
PLATFORM="${2:-html5}"
# 1. 拉取依赖(扩展模块)
java -jar bob.jar --resolve
# 2. 构建
java -jar bob.jar --build
# 3. 打出目标平台包
java -jar bob.jar --bundle --bundle-output "build/$PLATFORM" --platform "$PLATFORM" --variant release
# 4. 生成热更产物
java -jar bob.jar --build-resources "build/liveupdate"
# 5. 上传
aws s3 sync "build/$PLATFORM" "s3://cdn/mygame/$VERSION/$PLATFORM/" --acl public-read
在 CI(GitHub Actions 等)中按 tag 触发,即实现「打 tag → 自动出包 → 自动上传 CDN」。完整流水线实践可参考 DevOps 专题。
2. 版本号与构建号管理
- 用环境变量注入版本号:bob 支持从
game.project读取,也可在 CI 中动态替换 - 构建产物按版本归档(
build/1.0.3/ios/),与热更 manifest 的版本一一对应 - 维护一份
versions.json记录「当前商店版本 / 热更版本 / 内容版本」三元组,便于运营与回滚(见 热更新与热重载)
3. 签名密钥的安全存放
CI 中签名材料属于敏感信息:
- keystore / .p12 存入 CI 的 Secret 仓库,构建时挂载
- 私钥不进 git,构建机隔离;必要时用 KMS 托管
- 每次构建记录签名指纹,审计「哪个构建用了哪把钥匙」
4. 发布后的自动化验证
- CI 出包后跑冒烟脚本:HTML5 用 Playwright 打开页面确认加载;Android 装模拟器启动
- 校验包体大小、资源清单完整性(对比 manifest 与预期哈希)
- 自动上报构建产物到内部发布页,供测试人员取包
八、性能与包体优化
1. 包体优化清单
- 资源压缩:图片转压缩纹理、音频开启压缩(见 编辑器与资源管线)
- 去除冗余:构建日志检查未引用资源,
bob --exclude排除调试内容 - 按平台裁剪:不同平台用不同资源目录(如移动端低清、桌面高清)
- 引擎体积:Defold runtime 本身极小(<2MB),体积主要来自资源
2. 运行时性能
- 用 Profiler 定位 CPU 热点:Lua 脚本 vs 物理 vs 渲染
- 图集合批降 Draw Call;粒子数量与对象池管理(见 复杂逻辑与状态管理)
- 移动端控制全屏分辨率与后处理成本
3. 平台专项优化
| 平台 | 重点 |
|---|---|
| iOS | 内存告警处理、Metal 渲染适配、后台暂停 |
| Android | 低端机 RAM、多分辨率/多 density、厂商优化差异 |
| Web | 加载体积、首帧速度、浏览器兼容 |
| 桌面 | 高刷新率、多屏、手柄输入 |
4. 发布前检查清单
-
game.project各平台 package/bundle 正确 - 图标、启动图、商店素材就位
- 签名/keystore 可重复构建
- 热更 manifest 可拉取、可回滚
- 真机安装验证通过
- 隐私政策、内购、广告配置完整
九、总结
Defold 的跨平台发布是一条「配置驱动」的流水线:game.project 声明平台参数,bob 生成产物,签名/证书分别解决各商店的身份要求,HTML5 则天然免审核。真正决定发布成败的不是构建本身,而是前期的资源规划(包体)、平台的配置细节(签名/元数据)以及发布后的运营(热更与监控)。
从引擎介绍到脚本、物理、UI、热更,再到本文的发布收尾,Defold 专题已覆盖一条完整的独立开发链路。祝你在各平台顺利交付作品。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。