一键导入
android-app-release
BoardGame Android 打包、上传、发布和验包流程。用于 APK、原生更新、OTA/native、线上下载包、包体缩减和正式/测试版核验。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
BoardGame Android 打包、上传、发布和验包流程。用于 APK、原生更新、OTA/native、线上下载包、包体缩减和正式/测试版核验。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
BoardGame 项目内参考图生成 Three.js 程序化模型流程。用于 img2threejs、图生模型、参考图重建、Three.js 游戏资产原型、书本/棋盘/卡牌/道具 3D 模型任务;在动手写模型前先拆参考图结构并建立“参考图区域到模型部件/材质”的追踪表,禁止把参考图当整面贴图贴皮,也禁止脱离参考图生成泛主题模型。
BoardGame 线上反馈批量收口流程。用于未关闭反馈、排重、真假 bug 分诊、并行修复、状态回写、关闭误报/重复反馈。
BoardGame 规则 bug 修复流程。用于卡牌、技能、Token、状态、阶段、伤害、资源、升级/基础差异、结算顺序和审计漏审。
BoardGame Git 操作入口。用于提交、推送、同步主分支、pre-push 阻塞、PR、worktree、fork、merge 等协作场景。
BoardGame 新游戏创建或资源/data intake 流程。用于新增游戏、只给图片/位置先开工;按现有游戏模式分阶段推进并验收。
BoardGame 截图交付流程。用于打开图、给我看图、看截图、图呢、端到端截图;最终验收图默认走图片预览站。
基于 SOC 职业分类
| name | android-app-release |
| description | BoardGame Android 打包、上传、发布和验包流程。用于 APK、原生更新、OTA/native、线上下载包、包体缩减和正式/测试版核验。 |
命中以下任一场景就用本 skill:
如果用户只要“更新网站下载的 App / 发原生更新”,默认不用部署网站;优先走原生发布链路,不要误升级成服务器部署。
如果用户在本项目里说“更新部署 / 部署最新 / 发线上”,默认不是只部署网页/服务器,而是:
latest 镜像并执行 update-localstable OTAlatest.json只有用户当轮明确说“只更新服务器 / 不发 OTA / 不更新 App”,才允许缩小为只做服务器部署。
npm run mobile:android:build:release 成功,只能证明本地产物 OK。prepare-release / build-release / build-bundle / 下载链路测试,以及用户明确要求的真机安装验收,必须落到:
appId = top.easyboardgame.appappName = 易桌游debug / run / sync 不得擅自切成 top.easyboardgame.app.debug。只有用户当轮明确要求“并存安装测试包 / debug 包 / 不覆盖正式包”时,才允许使用测试壳,并且最终汇报必须标明不是正式包验证。debug / 测试 / qa / dev 壳都视为失败产物。latest.json 只能证明入口指向了什么文件,不能证明 APK 里面是不是正式壳。official/native-app-updates/android/<channel>/latest.jsonurl 对应的 APK,并检查其中的 appId / appNameaapt / apkanalyzer 时优先用它们;没有时,至少解包后检查:
assets/capacitor.config.jsonassets/public/android-build-meta.jsonnative-app-updates/android/<channel>/latest.json 解析出来的:
versionCode。562 的设备,不会把 558 当成更新。versionCode 必须更大0.5.58,不能直接靠原生包降版本完成public/assets/** 只允许正式运行时资源。public/assets/common/audio/**public/assets/common/images/**public/assets/atlas-configs/**public/assets/i18n/** 下除 assets-manifest.json 外的图片、音频和运行时配置public/logos/**locales/zh-CN/**、字体、必要的小型公共文件和 assets-manifest.json。public/assets/** 和 dist/,不要先猜 CDN、缓存或签名。deploy-and-ota 的 CI 直传 + update-local。只有用户明确要求“本机输送”时才用 --deploy-mode stream,只有用户明确要求“服务器直接拉镜像”时才用 --deploy-mode remote / deploy-image.sh update。4.1.1 处理,不得把它们混进 OTA,也不得因此漏发 OTA。https://assets.easyboardgame.top/official/app-updates/android/stable/latest.json,确认 version / url / checksum / size / notes 指向本次已推送 ref,并确认浏览器跨域预检 OPTIONS 可通过。forceUpdate: true。--no-force-update 或等价的 forceUpdate=false 必须被拒绝;不能静默发布成后台 OTA。--force-update 只作为旧命令兼容参数保留;不传也必须强制更新。Invalid URL、[object Object]、目标结构错误、预期大小或摘要无效必须首轮立即失败,禁止套用传播等待反复重试。latest.json 的 OPTIONS 预检。预检失败、缺少允许来源、缺少 GET 方法、缺少客户端会发送的请求头时,都必须让发布失败,不能等用户手机端发现无法更新。DEPLOY_TOTAL_TIMEOUT_SECONDS=1800 负责整次时限;通过 deploy runner 执行时只保留 runner 的 30 分钟整步时限,关闭脚本内层重复计时。超过上限必须失败,不得继续后台假卡死;再次操作前必须先确认当前容器版本与健康状态。latest.json 与目标提交 -> 修代码 -> 提交并 push -> 发布 stable OTA -> 回查线上 manifest、bundle 与 CORS 预检。6.0.0;低于该下限的发布必须失败。node scripts/mobile/release-android.mjs ota --channel stable
node scripts/mobile/release-android.mjs native --channel stable
node scripts/mobile/release-android.mjs native --channel stable --bump patch
preferredOrientationscripts/game/generate_game_manifests.js 的方向表生成规则android/app/src/main/assets/game-orientation-map.jsonMainActivity / GameOrientationPolicytictactoe 允许显式 portrait。assets/game-orientation-map.json 和目标提交的原生方向策略;线上 APK 缺少目标游戏、仍使用旧的缺省方向,或版本早于目标策略时,native 发布仍是必需交付。assets/game-orientation-map.json,确认目标游戏为 landscape,不能只看源码或 OTA latest.json。npm run mobile:android:build:release
至少确认:
OTA 还是 nativeserver / OTA / game package / native 哪一层交付;没有完成这张交付矩阵前,不得开始发布。如果用户说“不要部署,只更新网站下载的 app”,默认是 native publish,不是 deploy。
origin/main、tag 或用户指定的远端 ref 上,且发布命令显式指定 git_ref / --ref,本地工作区存在无关未提交改动时,不得因此阻塞 OTA 发布。app-updates/android/<channel>/latest.json,确认 notes、version 或 bundle URL 能对应本次已推送 ref,并确认 OPTIONS 预检允许客户端读取该清单;不能只看 workflow 成功。用户说“更新部署 / 部署最新 / 发线上”且未排除 OTA 时,按以下顺序收口:
origin/main 的最新提交或用户指定 ref。web 与 game-server 镜像已可用。BG_DEPLOY_VERSION_PREPARED=1 node scripts/release/deploy-and-ota.mjs --skip-wait(若本节后续单独触发 OTA,则加 --skip-ota)。bash scripts/deploy/deploy-image.sh status 和 curl http://127.0.0.1/health。.github/workflows/android-ota-publish.yml,channel=stable,git_ref=<本次已推送提交>,expected_base_version=<package.json.version>。latest.json、bundle URL 与 OPTIONS 预检,确认它们对应本次提交且旧壳可从手机 WebView 读取。.github/workflows/android-native-update-publish.yml,并直接下载线上 APK 验证目标原生内容。任一步失败时,只能汇报该步骤的真实阻塞;不得用前一步成功替代整条“更新部署”完成。
app-updates/android/<channel>/latest.json 线上可读。latest.json 必须校验正文摘要,不能只看 HTTP 200;否则旧内容也可能被误判为发布完成。latest.json 必须执行 CORS 预检,至少模拟 Origin: http://localhost、Access-Control-Request-Method: GET、Access-Control-Request-Headers: cache-control。GET,并允许 cache-control 或 * 请求头。失败时必须让发布失败,不能静默继续。GET latest.json 成功但 OPTIONS latest.json 失败,结论必须是“服务器资源入口不支持旧壳读取更新清单”,不是“手机没有更新”。推荐入口:
node scripts/mobile/release-android.mjs native --channel stable
或:
npm run mobile:android:build:release
本地至少验证:
android/app/build/outputs/apk/release/output-metadata.jsonandroid/app/src/main/res/values/strings.xmlandroid/app/build.gradle必须确认:
applicationId = top.easyboardgame.appversionName / versionCode 符合预期预演:
npm run mobile:android:native-update:publish -- --channel stable --dry-run
正式上传:
npm run mobile:android:native-update:publish -- --channel stable
如果只想先上传版本文件,不切最新:
npm run mobile:android:native-update:publish -- --channel stable --skip-latest
发布后必须回查:
https://assets.easyboardgame.top/official/native-app-updates/android/stable/latest.json
至少确认:
versionversionCodeurlchecksumsize必须直接下载 latest.json.url 指向的 APK。
验包至少确认:
appId 不是 top.easyboardgame.app.debugappName 不是 易桌游测试没有 aapt / apkanalyzer 时,允许解包后检查:
assets/capacitor.config.jsonassets/public/android-build-meta.jsondumpsys package top.easyboardgame.app 核对真机当前 versionCode / versionName。线上已经发布新 APK,但真机仍是旧版本时,只能说“原生包已发布,设备尚未升级”,不得说方向、权限或插件问题已经修复。adb install -r 返回 INSTALL_FAILED_ABORTED: User rejected permissions 时,必须立即停止重复执行同一命令。该结果表示设备安装确认未完成,不是 APK 构建或发布失败。PackageInstaller 打开该 APK;versionCode。versionCode、系统实际 rotation/orientation 为横屏;只验证首页、APK 映射文件或 AndroidManifest 均不足以收口。只要对外说“Android 包已经更新 / 网站下载已可用 / 原生更新已发”,必须同时给出:
latest.json 的 version/versionCode/url/size只要对外说“更新部署已完成 / 发线上已完成”,必须同时给出:
update-local;若是本机输送或 remote 直拉必须明确标注)latest.json 的 version / url / checksum / size / noteslatest.json 的 CORS 预检结果优先排查:
--skip-latestlatest.json 仍指向旧版本优先排查:
build-release 当时仍走了测试壳latest.json 指向的 URL 不是刚构建的新包优先排查:
versionCode 是否真的更大不要把 OTA 和 native 混成一种更新。
优先排查:
latest.json 的 version / checksum / url 是否确实是本次发布。latest.json 的 GET 是否成功,且正文摘要是否是新内容。latest.json 的 OPTIONS 预检是否成功,是否允许 GET 与客户端请求头。如果手机日志显示清单读取失败,不能把它汇报成“没有更新”;必须先修资源入口或客户端错误显式化,再重新验 OTA 链路。