بنقرة واحدة
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 ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
BoardGame 项目内参考图生成 Three.js 程序化模型流程。用于 img2threejs、图生模型、参考图重建、Three.js 游戏资产原型、书本/棋盘/卡牌/道具 3D 模型任务;在动手写模型前先拆参考图结构并建立“参考图区域到模型部件/材质”的追踪表,禁止把参考图当整面贴图贴皮,也禁止脱离参考图生成泛主题模型。
BoardGame 线上反馈批量收口流程。用于未关闭反馈、排重、真假 bug 分诊、并行修复、状态回写、关闭误报/重复反馈。
BoardGame 规则 bug 修复流程。用于卡牌、技能、Token、状态、阶段、伤害、资源、升级/基础差异、结算顺序和审计漏审。
BoardGame Git 操作入口。用于提交、推送、同步主分支、pre-push 阻塞、PR、worktree、fork、merge 等协作场景。
BoardGame 新游戏创建或资源/data intake 流程。用于新增游戏、只给图片/位置先开工;按现有游戏模式分阶段推进并验收。
BoardGame 截图交付流程。用于打开图、给我看图、看截图、图呢、端到端截图;最终验收图默认走图片预览站。
| 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 链路。