
OpenClaw Android 发布全链路fastlane 环境搭建、Play 签名与受保护 Beta CI 实战指南【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw本文以 OpenClaw 仓库中 apps/android/fastlane/SETUP.md 为骨架系统讲解 Android 端 fastlane 的本地与可复现安装、Google Play 服务账号认证、共享签名仓库apps-signing的拉取/推送以及受保护的 Beta 发布 CI 全流程。读完本文你将掌握从brew install fastlane到pnpm android:release:upload原子提交 Play 版本的一整套可落地操作并理解其背后的版本号规则、Gradle 签名校验与 release ref 记账机制。一、fastlane 的两种安装方式SETUP.md 给出了两条安装路径分别对应快速上手与可复现构建两种诉求。1.1 标准本地安装Homebrewbrew install fastlane这种方式适合日常调试与本地开发fastlane 二进制由 Homebrew 直接管理升级跟随 brew 自身节奏。1.2 校验和锁定的可复现安装Bundler Gemfile.lockcd apps/android gem install bundler -v 2.6.9 bundle _2.6.9_ installRuby 版本由 apps/android/.ruby-version 记录为3.4.10fastlane 及其传递依赖的精确版本被锁定在 apps/android/Gemfile.lockapps/android/Gemfile 中固定了gem fastlane, 2.238.0与ruby 3.4.10bundle _2.6.9_ install即按锁文件安装完全一致的依赖树。为什么需要这种双轨制查看仓库入口脚本 scripts/lib/android-fastlane.sh 可以看到run_android_fastlane的完整回退链若apps/android/Gemfile存在且bundle _2.6.9_ check通过则以_OPENCLAW_ANDROID_FASTLANE_EXECUTION_PROVENANCElocked执行锁定的 bundle 内 fastlane否则退回全局fastlane_OPENCLAW_ANDROID_FASTLANE_EXECUTION_PROVENANCEfallback再否则遍历rbenv versions用可用的 Ruby 版本执行rbenv exec fastlane。也就是说所有pnpm android:*发布入口优先使用锁定的 Bundler 工具链仅在本地未安装该 bundle 时才退化为 Homebrew fastlane / rbenv 回退。而在受保护的 CI 意图intent模式下apps/android/fastlane/Fastfile 中的validate_android_fastlane_execution_provenance!会强制要求_OPENCLAW_ANDROID_FASTLANE_EXECUTION_PROVENANCElocked否则直接UI.user_error!拒绝执行——这正是受保护 CI 永不回退的代码级保障。二、Google Play 服务账号认证发布前必须创建具备Google Play Developer API访问权限的服务账号并在 Play Console 中将该服务账号授权给 OpenClaw 应用。2.1 推荐本地认证方式GOOGLE_PLAY_JSON_KEY/absolute/path/to/google-play-service-account.json2.2 可选的包名覆盖GOOGLE_PLAY_PACKAGE_NAMEai.openclaw.app默认包名即ai.openclaw.app见 apps/android/fastlane/Appfile 中package_name(ENV[GOOGLE_PLAY_PACKAGE_NAME] || ai.openclaw.app)。2.3 Fastfile 中的认证优先级从 apps/android/fastlane/Fastfile 的play_auth_options可以看到认证凭据的完整解析顺序依次尝试GOOGLE_PLAY_JSON_KEYSUPPLY_JSON_KEYGOOGLE_PLAY_JSON_KEY_PATHGOOGLE_PLAY_JSON_KEY_DATA或SUPPLY_JSON_KEY_DATACI 中常用 Base64 数据而非文件路径。以上皆缺时lane 会以Missing Google Play API credentials. Set GOOGLE_PLAY_JSON_KEY or GOOGLE_PLAY_JSON_KEY_DATA.失败退出。2.4 验证认证cd apps/android fastlane android auth_checkauth_checklaneFastfile 中实现调用validate_play_auth!通过Supply::Client.make_from_config创建客户端并begin_edit同时检查 Google Play 中是否已存在计划中的 versionCode防止重复发布结束后在ensure块中abort_current_edit关闭校验编辑。若要在 CI 中精确复现受保护工具链请使用BUNDLE_GEMFILE$PWD/Gemfile bundle _2.6.9_ exec fastlane android auth_check三、Android 发布签名共享 apps-signing 仓库Android 发布签名复用与 iOS 相同的私有apps-signing仓库与MATCH_PASSWORD密钥但使用 Android 专属的加密资产。3.1 发布验证前拉取共享上传密钥pnpm android:release:signing:plan MATCH_PASSWORDsigning repo password pnpm android:release:signing:sync:pull MATCH_PASSWORDsigning repo password pnpm android:release:signing:checksigning:plan仅打印签名计划不触碰凭据signing:sync:pull从签名仓库解密并物化签名文件到apps/android/build/release-signing/该目录被 gitignoresigning:check在拉取后直接执行 Gradle 的:app:validateSigningPlayRelease与:wear:validateSigningRelease确认密钥可用。从 Fastfile 可以看到后续的release_preflight、play_store_archive等 lane 会调用prepare_android_release_signing!若环境存在MATCH_PASSWORD则重新sync-pull否则若本地已有物化文件则直接导出为ORG_GRADLE_PROJECT_*前缀的 Gradle 项目属性OPENCLAW_ANDROID_STORE_FILE、OPENCLAW_ANDROID_STORE_PASSWORD、OPENCLAW_ANDROID_KEY_ALIAS、OPENCLAW_ANDROID_KEY_PASSWORD供当前进程的 Gradle 构建使用。3.2 首次设置或轮换密钥推送加密资产MATCH_PASSWORDsigning repo password \ OPENCLAW_ANDROID_UPLOAD_KEYSTOREpath-to-upload-keystore.jks \ OPENCLAW_ANDROID_SIGNING_PROPERTIESpath-to-android-signing.properties \ pnpm android:release:signing:sync:push源签名属性文件必须包含三个字段OPENCLAW_ANDROID_STORE_PASSWORDstore-password OPENCLAW_ANDROID_KEY_ALIASupload-key-alias OPENCLAW_ANDROID_KEY_PASSWORDkey-password签名资产的清单由 apps/android/Config/ReleaseSigning.json 描述它指向gitgithub.com:openclaw/apps-signing.git的android/openclaw资产目录列出upload-keystore.jks.enc与gradle.properties.enc两个加密文件、物化目录apps/android/build/release-signing以及上述四个 Gradle 属性名。其中apkCertificateSha256字段80dbc62315ea216dd6e8a7060735a866ddc464a48ed50fef29ff0550468b9a63钉住了独立发布 APK 所接受的上传证书轮换时只能与加密密钥库一起更新。安全要点SETUP.md 原话启用 Play App Signing 后应存储Google Play 上传密钥upload key而不是不可替代的应用签名密钥app signing key。四、本地归档与截图不上传的验证手段4.1 本地归档pnpm android:release:archive对应 package.json 中的android:release:archive脚本其底层 lane 为play_store_archive先做版本一致性检查android-sync-versioning.ts --check、准备签名再调用bun apps/android/scripts/build-release-artifacts.ts产出签名版手机 Play AAB、Wear AAB 与第三方 APK到apps/android/build/release-artifacts/。需要特别强调该命令仅用于本地归档验证绝不是pnpm android:release:upload失败后的上传回退路径详见第七章的失败红线。4.2 确定性截图生成pnpm android:screenshots脚本scripts/android-screenshots.sh会在需要时创建并启动保留的Pixel 2与Wear OS Large RoundAVD。前置条件是先安装系统镜像system-images;android-36;google_apis;abi手机system-images;android-34;android-wear;abiWear。若要针对显式选择的模拟器只捕获一种形态使用pnpm android:screenshots -- --form-factor phone|wear --avd name pnpm android:screenshots -- --form-factor phone|wear --device adb-serial截图写入 apps/android/fastlane/metadata/android 下各 locale 的images/phoneScreenshots/与images/wearScreenshots/目录格式为 Play 可直接使用的 JPEG。设置SUPPLY_UPLOAD_SCREENSHOTS1即可在fastlane android metadata中包含这些截图除非有意作为商店元数据资产否则不要把生成的截图提交进仓库。五、上传 Play元数据、版本说明与 AAB 的一次性提交pnpm android:release:upload这是agent 驱动的标准发布入口。其 lane 为release_upload完整执行链为版本一致性检查 → 读取版本元数据 → 发布预检Play 认证 签名 版本说明→ 生成截图 → 构建归档 → 原子上传。5.1 上传内容一条 Google Play edit 内完成手机 AAB 上传至internal轨道Wear AAB 上传至wear:internal轨道wear:前缀 轨道名的形式由 Fastfile 中wear_play_track定义元数据title/short_description/full_description等Supply::AVAILABLE_METADATA_FIELDS字段各语言的 changelogrelease_notes.txt会同步为changelogs/versionCode.txt手机与 Wear 各写一份截图phoneScreenshots与wearScreenshots。整批操作由upload_play_builds_atomically!包裹先begin_edit上传两个 AAB 后校验 Google Play 返回的 versionCode 与本地预期version_metadata[:version_code]与wear_version_code(...)严格一致再update_track、上传 listing 资产最后commit_current_edit!只提交一次任何失败都在ensure中abort_current_edit保证不产生半提交状态。5.2 可调环境变量源码佐证环境变量作用默认值GOOGLE_PLAY_TRACK上传轨道internalGOOGLE_PLAY_RELEASE_STATUS发布状态completedGOOGLE_PLAY_VALIDATE_ONLY仅校验不提交关闭SUPPLY_UPLOAD_METADATA是否上传 listing 元数据视 lane 而定SUPPLY_UPLOAD_SCREENSHOTS是否上传截图视 lane 而定SUPPLY_UPLOAD_IMAGES是否上传图片关闭SUPPLY_TIMEOUTSupply 客户端超时秒数300ACK_BUNDLE_INSTALLATION_WARNING/SUPPLY_CHANGES_NOT_SENT_FOR_REVIEW/SUPPLY_RESCUE_CHANGES_NOT_SENT_FOR_REVIEWGoogle Play 编辑行为开关见 Fastfileupload_play_builds_atomically!5.3 版本号规则CalVer受支持的 Android 固定版本采用 CalVerYYYY.M.PATCH当前仓库 apps/android/version.json 为2026.8.2/versionCode 2026080201手机versionCode使用YYYYMMDDNN其中NN取值0149配套的 Wear AAB 在此基础上50即5199Fastfile 中wear_version_code会先校验手机构建号落在 149 区间超出即报错。六、受保护 Beta CIAndroid Beta ReleaseAndroid Beta Release是独立的手动触发工作流为供应链攻击面做了严格的失败闭合fail-closed设计。6.1 触发前置条件必须从受信任的main分发必须携带规范化的release/YYYY.M.PATCH-mobile分支及其精确完整 commit SHA工作流从发布分支推导冻结的 Code SHA并取分发时受信任的 Tooling SHATooling SHA 必须是当前main头的祖先且校验期间main只允许向前推进出现分歧divergence、回退rewind或不稳定的祖先解析时直接失败后续每个候选提交必须保持线性且只能改动五个生成的移动端发布元数据文件且这些文件必须与受信任工具 冻结 Code SHA 元数据重新生成的结果逐字节一致所有签名资产、Google Play 凭据与不可变 release-ref 变更都受android-beta-release环境审批门控。6.2 所需仓库/环境密钥按名称GH_APP_PRIVATE_KEYMATCH_PASSWORDGOOGLE_PLAY_JSON_KEY_DATA6.3 单次编辑 release ref 记账受保护 lane 在一次 Google Play edit中上传手机 AABinternal与 Wear AABwear:internal随后只提交这一次。商店返回的手机与 Wear versionCode 被写入签名的发布意图release intent中。intent 模式强制使用校验和锁定的 Android bundlescripts/lib/android-fastlane.sh的 locked 分支绝不回退到全局或 rbenv fastlane且只允许上传internal/wear:internal两个轨道Fastfile 中validate_ci_play_destination!兜底。提交成功后工作流在候选 SHA 上记录refs/openclaw/mobile-releases/android/version-name-phone-version-code。若提交后记账失败可用工作流的record-only操作、原始失败运行 ID 与相同的 release ref/SHA 元组恢复恢复流程重新进入android-beta-release环境、只执行受信任工作流 SHA 的工具并针对当前main血统校验恢复分发对缺失产物、重放、ref 移动、摘要不匹配、main分歧/回退或不可变 ref 冲突等情况一律失败。生产环境推广Production promotion始终保持人工在 Play Console 操作。6.4 直接 Fastlane 入口仅限维护者调试cd apps/android fastlane android release_upload精确复现受保护 CI 工具链BUNDLE_GEMFILE$PWD/Gemfile bundle _2.6.9_ exec fastlane android release_upload这两个直接入口仅限明确要求时的维护者调试。Agent 驱动的发布必须使用pnpm android:release:upload且失败即停止。七、发布规则与失败红线SETUP.md 原规则全量整理版本与元数据所有权apps/android/version.json 是 Android 发布版本的固定来源apps/android/Config/Version.properties由该来源生成并被 Gradle 读取apps/mobile/version.json是共享移动端网关版本来源apps/ios/CHANGELOG.md提供共享移动端发布说明apps/android/fastlane/metadata/android/en-US/release_notes.txt由共享移动端 cutter 提交apps/android/CHANGELOG.md仅作历史文档不是发布准备输入apps/android/Config/ReleaseSigning.json钉住共享签名仓库中的加密 Android 签名资产其中的apkCertificateSha256钉住独立发布 APK 接受的上传证书轮换须与加密密钥库同步MATCH_PASSWORD使 fastlane 在发布验证或归档构建前把加密签名资产拉入apps/android/build/release-signing/scripts/mobile-release-version.ts是准备 Android 版本元数据与发布说明的唯一所有者。已退役与仍在用的入口pnpm android:version:pin、pnpm android:version:sync已退役调用即失败且不写入pnpm android:version:check只校验已入库的 Android 版本产物不做任何修改pnpm android:release:preflight校验 Play 认证、发布签名、cutter 输出与发布说明并打印将要上传的 package/track/version/versionCodepnpm android:release:signing:sync:pull从apps-signing拉取加密签名资产pnpm android:release:signing:sync:push创建或刷新apps-signing中的加密签名资产pnpm android:screenshots构建并安装手机与 Wear OS debug 应用、运行确定性截图场景、写入 Play-ready JPEG 到phoneScreenshots/wearScreenshotspnpm android:release:archive构建签名版手机 Play AAB、Wear AAB 与第三方 APK 到apps/android/build/release-artifacts/pnpm android:release:upload在一次 Google Play edit中提交手机 AAB、Wear AAB、元数据与截图到internal与wear:internal轨道稳定版 GitHub Release APK 与 Play 分离OpenClaw Release Publish分发 .github/workflows/android-release.yml其受保护的android-release环境提供MATCH_PASSWORD仓库 GitHub App 读取加密签名仓库生产环境推广始终在 Play Console 手动完成。Agent 失败红线原文保留若pnpm android:release:upload失败Agent 驱动的发布必须停止并上报失败步骤不得回退到pnpm android:release:archive、pnpm android:release:metadata、直接 Fastlane lane、Gradle 发布产物 Play 上传命令或移动端 release ref 记账等任何替代路径。八、端到端操作速查本地首次接入完整流程# 1) 安装锁定的 Ruby 工具链 cd apps/android gem install bundler -v 2.6.9 bundle _2.6.9_ install # 2) 导出 Play 凭据 export GOOGLE_PLAY_JSON_KEY/absolute/path/to/google-play-service-account.json # 3) 拉取并校验签名 pnpm android:release:signing:plan MATCH_PASSWORDpassword pnpm android:release:signing:sync:pull MATCH_PASSWORDpassword pnpm android:release:signing:check # 4) 校验认证与发布预检 cd apps/android fastlane android auth_check pnpm android:release:preflight # 5) 本地归档仅验证不上传 pnpm android:release:archive # 6) 标准发布元数据 截图 双 AAB 一次提交 pnpm android:release:upload若MATCH_PASSWORD与物化签名均已就绪Fastfile 的prepare_android_release_signing!会自动复用本地apps/android/build/release-signing/gradle.properties无需每次重新拉取。全部发布相关脚本的 npm 入口定义见根目录 package.jsonandroid:release:*与android:screenshots等字段Fastlane lane 的完整实现见 apps/android/fastlane/Fastfile签名仓库清单与证书指纹见 apps/android/Config/ReleaseSigning.json。【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考