# 构建、签名与分发

> 各目标平台的流水线末端——build.gradle、签名以及在每个平台上的发布。

Source: https://crossfly.dev/zh/docs/platforms/building-and-releasing — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# 构建、签名与分发 🖥️🤖🍎🌐

流水线的末端，按目标平台划分。每个 launcher 都有自己的 `build.gradle`；工具链是 **Java 17**。

## 各目标平台的任务和产物
| 目标 | 构建 | `mainClassName` | 产物 |
|---|---|---|---|
| 🖥️ 桌面端 | `gradlew :lwjgl3:run`（开发）/ jar / 安装程序 | `dev.crossfly.lwjgl3.Lwjgl3Launcher` | jar / 原生安装程序 |
| 🤖 Android | `gradlew :android:installDebug` / `assembleRelease` | `AndroidLauncher` | APK / **AAB** |
| 🍎 iOS | `gradlew :ios:launchIPhoneSimulator` / 生成 `.ipa` | `dev.crossfly.IOSLauncher` | **`.ipa`** |
| 🌐 Web | `gradlew :web:webBundle`（别名 `dist`） | `dev.crossfly.web.WebLauncher` | 静态 bundle |

## 签名
| 目标 | 签名 |
|---|---|
| 🤖 Android | **keystore** → 为 release 版 `.aab`/APK 签名 |
| 🍎 iOS | **证书 + provisioning profile** → 为 `.ipa` 签名 |
| 🖥️ 桌面端 | 根据操作系统为安装程序签名（可选） |
| 🌐 Web | 无签名——它是静态内容 |

## 分发
- **🤖 Android** → Google Play (AAB) 或直接分发 APK。
- **🍎 iOS** → App Store / **TestFlight**（通过 Xcode/Transporter）。
- **🖥️ 桌面端** → 原生安装程序（jpackage/jlink）或可执行 jar。
- **🌐 Web** → 将 `web/build/webapp/` 的内容托管到**任何静态服务器**上。

## 发布清单
- [ ] 在桌面端和真实目标平台上测试过（参见 [测试](/docs/best-practices/testes)）。
- [ ] 在各种屏幕/密度上验证过响应式布局（参见 [响应式布局](/docs/best-practices/responsividade)）。
- [ ] 权限已声明（Android `Manifest` / iOS `Info.plist`）。
- [ ] 已处理各平台上不可用的功能（参见 [矩阵](/docs/platforms/overview)）。
- [ ] 签名已配置（keystore / provisioning）。
- [ ] 图标、*启动画面*、版本号/构建号。
- [ ] 已生成商店截图（`Main.getScreenShot(true).toPng(...)`）。

## 各目标平台的前提条件
- **🖥️ 桌面端：** JDK 17；在 macOS 上需 `-XstartOnFirstThread`。
- **🤖 Android：** Android SDK + build tools。
- **🍎 iOS：** **macOS + Xcode** + Apple 开发者账号。
- **🌐 Web：** 静态文件服务器。

## 常见错误
- 提交 iOS 时 `Info.plist` 中缺少使用键（被拒绝）。
- 当 Play Store 要求 **AAB** 时却发布了 APK。
- 托管 web bundle 时没有一并提供 `assets/`/`assets.txt`。

## 另请参阅
- [桌面端](/docs/platforms/desktop-lwjgl3) · [Android](/docs/platforms/android) · [iOS](/docs/platforms/ios) · [Web](/docs/platforms/web-teavm)
