ARTICLE DETAIL

资讯详情

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

【Compose Multiplatform 跨端开发学与练】第10课 发布与部署

【Compose Multiplatform 跨端开发学与练】第10课 发布与部署 本课目标掌握 Android、iOS、桌面、Web 四端的打包与发布流程理解各平台分发的核心约束iOS 签名、桌面端无法交叉编译、Web 静态托管建立 CI/CD 自动化的基础认知完成从开发到交付的最后一公里。系列整体规划课次主题核心内容难度第1课从零开始技术概览、环境搭建、第一个应用、代码解读⭐第2课Compose 基础语法Composable、状态管理、重组机制、Modifier 体系⭐⭐第3课布局与组件Column/Row/Box、LazyColumn、Material3 组件库⭐⭐第4课导航与路由Navigation Compose、类型安全路由、深层链接⭐⭐⭐第5课网络与数据层Ktor 客户端、序列化、Repository 模式⭐⭐⭐第6课状态管理与架构ViewModel、单向数据流、依赖注入⭐⭐⭐⭐第7课平台适配与互操作expect/actual、SwiftUI 互操作、平台特定 API⭐⭐⭐⭐第8课资源管理与主题多平台资源、图片加载、深浅色主题⭐⭐⭐第9课测试与调试Compose UI 测试、单元测试、性能分析⭐⭐⭐⭐第10课发布与部署Android/iOS/桌面/Web 打包发布、CI/CD⭐⭐⭐⭐⭐第10课 发布与部署一、发布全景四端分发的差异CMP 应用发布到四个平台每个平台的分发机制、约束条件和产物格式都不同。理解这些差异是规划发布流程的前提。Android通过 APK 或 AAB 分发到 Google Play 或国内应用商店。签名用 keystore 文件编译产物是标准 Android 格式CMP 代码被编译为 JVM 字节码与原生 Android 应用无区别。iOS通过 IPA 分发到 App Store。需要 Apple Developer 账号、Xcode 签名和公证notarization。编译 iOS 必须在 macOS 上进行这是苹果生态的硬性限制。CMP 代码被编译为 Native 二进制。桌面端通过安装包分发Windows 的 .msi/.exemacOS 的 .dmg/.pkgLinux 的 .deb/.rpm。Compose Multiplatform Gradle 插件基于jpackage和jlink生成自包含的安装包无需目标系统安装 JDK。Web通过静态文件托管分发。wasmJsBrowserDistribution任务生成 HTML、JS、Wasm 文件部署到任意静态托管服务GitHub Pages、Vercel、Netlify。一个关键的跨平台约束桌面端不支持交叉编译。你只能在 macOS 上构建 .dmg在 Windows 上构建 .msi在 Linux 上构建 .deb。这意味着发布全平台桌面应用需要三种操作系统或 CI 环境。二、Android 打包与发布2.1 生成签名密钥Android 应用必须用密钥签名才能安装到设备或上传到商店。用keytool生成keytool-genkey-v-keystoremy-release-key.keystore\-aliasmy-key-alias-keyalgRSA-keysize2048-validity100002.2 配置签名在androidApp/build.gradle.kts中配置签名android{signingConfigs{create(release){storeFilefile(my-release-key.keystore)storePasswordSystem.getenv(KEYSTORE_PASSWORD)keyAliasmy-key-aliaskeyPasswordSystem.getenv(KEY_PASSWORD)}}buildTypes{release{signingConfigsigningConfigs.getByName(release)isMinifyEnabledtrue}}}最佳实践密码通过环境变量传入不写入版本控制。keystore 文件也应加入.gitignore。2.3 生成发布产物# 生成 AAB推荐用于 Google Play./gradlew :androidApp:bundleRelease# 生成 APK用于直接分发./gradlew :androidApp:assembleReleaseAAB 是 Google Play 的推荐格式它让商店按设备配置生成最优的 APK减小下载体积。三、iOS 打包与发布3.1 Xcode 项目配置用 Xcode 打开iosApp/iosApp.xcodeproj在Signing Capabilities中配置Bundle Identifier唯一标识上传后不可更改Team选择你的 Apple Developer 账号Version和Build遵循[Major].[Minor].[Patch]格式3.2 创建 App Store Connect 记录在 App Store Connect 中创建应用记录Bundle ID 必须与 Xcode 项目中的完全一致。首次上传后 Bundle ID 无法更改务必仔细核对。3.3 归档与上传在 Xcode 中选择Product → Archive完成后通过 Organizer 上传到 App Store Connect。上传前确认应用图标已配置启动屏幕已配置加密合规声明已填写如果使用了加密功能CMP 特有注意事项iOS 14.0 是当前最低支持版本。CMP 1.11.0 起并发渲染默认启用渲染任务被卸载到专用线程无需额外配置。如果使用原生文本输入实验性需要在代码中显式启用。四、桌面端打包4.1 Gradle 配置在build.gradle.kts中配置桌面分发compose.desktop{application{mainClassMainKtnativeDistributions{targetFormats(TargetFormat.Dmg,TargetFormat.Msi,TargetFormat.Deb,)packageNamecom.example.apppackageVersion1.0.0}}}4.2 打包任务# macOS./gradlew packageDmg# Windows./gradlew packageMsi# Linux./gradlew packageDeb产物位于composeApp/build/compose/binaries/下。必须在对应操作系统上运行对应任务——交叉编译不受支持。4.3 替代方案jDeployjDeploy是一个支持 KMP 的第三方工具可以在任意操作系统上构建所有平台的安装包并支持自动更新。它的工作方式是生成一个轻量的启动器运行时下载 JVM 和应用 JAR。对于需要简化发布流程的项目这是一个值得考虑的选项。五、Web 端打包与部署5.1 生成生产产物./gradlew wasmJsBrowserDistribution产物位于webApp/build/dist/wasmJs/productionExecutable/下包含index.html、webApp.js和.wasm文件。5.2 部署到静态托管Web 产物是纯静态文件可以部署到任何静态托管服务GitHub Pages将产物推送到gh-pages分支或在 GitHub Actions 中自动部署。Vercel / Netlify连接 Git 仓库自动构建和部署。关键配置SPA 路由回退。如果应用使用了导航第4课需要配置服务器将所有未匹配的路径返回index.html。以 Vercel 为例在webApp/vercel.json中配置{rewrites:[{source:/(.*),destination:/index.html}]}缓存策略.wasm文件名包含内容哈希可以设置长期缓存。webApp.js文件名固定需要设置no-cache或短缓存。六、CI/CD 自动化6.1 GitHub Actions 策略由于 iOS 和桌面端的平台约束完整的 CI/CD 需要矩阵策略任务Runner产物Android 构建ubuntu-latestAAB/APKiOS 构建macos-latestIPADesktop macOSmacos-latestDMGDesktop Windowswindows-latestMSIDesktop Linuxubuntu-latestDEBWeb 构建ubuntu-latest静态文件iOS 构建的关键配置在 macOS runner 上安装 Xcode配置签名证书通过 GitHub Secrets运行xcodebuild archive。6.2 简化的 CI 流程如果不需要全平台发布可以只自动化核心构建name:Buildon:[push]jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv4-uses:actions/setup-javav4with:distribution:temurinjava-version:17-name:Build Androidrun:./gradlew:androidApp:assembleRelease-name:Build Webrun:./gradlew wasmJsBrowserDistribution一个实用建议先在本地手动完成一次完整发布记录每个平台的步骤和坑再把流程翻译成 CI 配置。直接写 CI 而不了解本地流程调试成本会高得多。七、习题与参考答案本课习题分为三类概念理解1-4 题、代码实践5-9 题、综合设计10-12 题。概念理解习题 1四端分发的核心差异题目Android、iOS、桌面、Web 四个平台的发布方式有什么本质不同参考答案Android 用 keystore 签名产物为 APK/AAB。iOS 需要 Apple Developer 账号和 Xcode 签名必须在 macOS 上构建产物为 IPA。桌面端基于 jpackage/jlink 生成自包含安装包不支持交叉编译必须在对应操作系统上构建。Web 产物是静态文件部署到任意静态托管。习题 2为什么桌面端不支持交叉编译题目为什么不能在 macOS 上构建 Windows 的 .msi 安装包参考答案jpackage 工具依赖目标操作系统的原生打包工具如 Windows 的 WiX Toolset、Linux 的 dpkg/rpm。这些工具只在对应操作系统上可用因此构建必须在目标平台上进行。习题 3iOS Bundle ID 的重要性题目为什么 iOS 的 Bundle ID 在首次上传后不可更改参考答案Bundle ID 是应用在 Apple 生态系统中的唯一标识与 App Store Connect 记录、推送证书、应用内购买、iCloud 容器等绑定。更改会导致这些服务全部失效。习题 4Web 端的路由回退题目为什么部署 CMP Web 应用时通常需要配置路由回退到index.html参考答案CMP 的导航库第4课使用浏览器 History API 管理路由。当用户直接访问example.com/profile或刷新页面时服务器会尝试查找/profile文件但实际文件不存在。路由回退规则将所有未匹配请求返回index.html由前端路由处理。代码实践习题 5配置 Android 签名题目在androidApp/build.gradle.kts中配置 release 签名密码从环境变量读取。参考答案android{signingConfigs{create(release){storeFilefile(my-release-key.keystore)storePasswordSystem.getenv(KEYSTORE_PASSWORD)keyAliasmy-key-aliaskeyPasswordSystem.getenv(KEY_PASSWORD)}}buildTypes{release{signingConfigsigningConfigs.getByName(release)isMinifyEnabledtrue}}}习题 6配置桌面打包题目配置build.gradle.kts让桌面端支持 macOS DMG 和 Windows MSI 打包。参考答案compose.desktop{application{mainClassMainKtnativeDistributions{targetFormats(TargetFormat.Dmg,TargetFormat.Msi)packageNamecom.example.myapppackageVersion1.0.0}}}习题 7生成 Web 产物题目运行生成 Web 生产产物的 Gradle 任务并说明产物位置。参考答案./gradlew wasmJsBrowserDistribution产物位于webApp/build/dist/wasmJs/productionExecutable/。习题 8配置 Vercel 路由回退题目为 CMP Web 应用配置 Vercel确保所有路由返回index.html。参考答案{rewrites:[{source:/(.*),destination:/index.html}]}习题 9GitHub Actions 构建 Web 产物题目编写一个 GitHub Actions 工作流在 push 时自动构建 Web 产物。参考答案name:Build Webon:[push]jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv4-uses:actions/setup-javav4with:distribution:temurinjava-version:17-run:./gradlew wasmJsBrowserDistribution-uses:actions/upload-artifactv4with:name:web-distpath:composeApp/build/dist/wasmJs/productionExecutable/综合设计习题 10Android 发布检查清单题目列出 Android 应用发布到 Google Play 前必须完成的检查项。参考答案Release keystore 已生成并安全保存不在版本控制中build.gradle.kts中签名配置使用环境变量应用图标和启动屏幕已配置versionCode和versionName已递增isMinifyEnabled true已启用代码混淆和压缩隐私政策链接已准备如果收集用户数据内容分级问卷已填写习题 11完整的 CI/CD 矩阵题目设计一个 GitHub Actions 工作流同时构建 Android、iOS、Web 三个平台的产物。参考答案name:Multi-Platform Buildon:push:tags:[v*]jobs:android:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv4-uses:actions/setup-javav4with:{distribution:temurin,java-version:17}-run:./gradlew:androidApp:bundleRelease-uses:actions/upload-artifactv4with:{name:android-aab,path:androidApp/build/outputs/bundle/release/}ios:runs-on:macos-lateststeps:-uses:actions/checkoutv4-uses:actions/setup-javav4with:{distribution:temurin,java-version:17}-name:Build iOSrun:|cd iosApp xcodebuild -project iosApp.xcodeproj -scheme iosApp -sdk iphoneos archive# 需要配置签名证书web:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv4-uses:actions/setup-javav4with:{distribution:temurin,java-version:17}-run:./gradlew wasmJsBrowserDistribution-uses:actions/upload-artifactv4with:{name:web-dist,path:composeApp/build/dist/wasmJs/productionExecutable/}习题 12发布流程文档题目为一个 CMP 项目编写简明的发布流程文档涵盖从代码冻结到各端上线的步骤。参考答案Android更新版本号 → 生成签名 AAB → 上传 Google Play Console → 填写发布说明 → 分阶段发布。iOS更新版本号和构建号 → Xcode Archive → 上传 App Store Connect → 填写审核信息 → 提交审核。桌面端在 macOS/Windows/Linux 上分别运行packageDmg/packageMsi/packageDeb→ 上传到发布页面或官网下载区。Web运行wasmJsBrowserDistribution→ 部署到静态托管 → 验证路由回退和缓存头。八、本课小结Android 发布keystore 签名 AAB 上传。密码用环境变量keystore 不入版本控制。iOS 发布Xcode 签名 App Store Connect。Bundle ID 上传后不可更改。必须在 macOS 上构建。CMP 1.11.0 起并发渲染默认启用iOS 最低支持 14.0。桌面端发布Compose Gradle 插件基于 jpackage/jlink 生成自包含安装包。不支持交叉编译必须在对应操作系统上构建。jDeploy 是跨平台构建的替代方案。Web 发布wasmJsBrowserDistribution生成静态产物部署到任意托管。需要配置 SPA 路由回退和缓存策略。CI/CDiOS 和桌面端的平台约束要求矩阵策略。先在本地手动完成一次完整发布再翻译成 CI 配置。九、系列总结十课走完从环境搭建到全平台发布CMP 的完整能力图谱已经展开。核心认知CMP 的价值不在于“一套代码替代所有原生开发”而在于让 Kotlin 开发者以渐进式的方式共享逻辑和 UI。Android 端零额外开销iOS/桌面/Web 的差距在逐年缩小。技术栈Composable 状态管理 Modifier 构成 UI 基础Navigation、Ktor、ViewModel、Koin 构成应用架构expect/actual 和原生互操作处理平台差异composeResources 和主题系统管理视觉资产。发布认知每个平台都有自己的约束和流程。iOS 的 macOS 限制、桌面端的交叉编译限制、Web 的路由回退都是必须接受的工程现实。下一步建议进阶讲解。
返回列表