技术文档

构建、签名与发行核对清单

发行应绑定一个明确基线、一组不可混用的最终产物和分阶段回执。源码版本、测试数量、Archive、APK 文件、上传、提审和公开下载各有独立证据。以下命令供在授权构建环境核对,本次没有运行原生构建、签名、服务测试或渠道操作;当前状态见版本发布。

冻结范围与版本资料

先记录仓库提交及未提交差异、目标平台、工具链、依赖锁文件、API 环境和计划版本。未提交改动也属于构建输入,不能只记一个 commit 后忽略工作区。共享 Account 必须以当前维护仓库和实际运行版本为准,不从 App 历史副本整目录部署。任何发布都不自动恢复暂停的小程序或启动手表任务。

git status --short
git rev-parse HEAD
node --version
xcodebuild -version
java -version

仅执行目标平台所需检查。保存输出前去除个人路径、账号、凭据和内部地址;公开发行说明只保留对评估兼容性有用的版本、产物标识及限制。版本表还应记录法律/隐私页版本、数据迁移、已知问题和回滚条件。

对象 必核对项 不能替代的证据
iOS Bundle ID、营销版本、构建号、最低系统、设备族、权限、推送环境 源 plist 不等于最终 Archive,iPhone 测试不替代审核 iPad
Android applicationId、versionName、versionCode、min/target SDK、权限、签名 Debug 版本不等于 Release;文件名不证明签名或升级兼容
服务端 源码/镜像基线、迁移、配置来源、持久卷和稳定密钥版本 构建成功不等于已运行或业务可用
静态站 最终清单、正文、下载配置、公共文件范围 上传成功不等于公网字节、MIME、TLS 和链接正确

Android 构建候选与签名

当前源码声明 1.0.6-preview、versionCode 7、API 26 起、编译与目标 API 35,实际候选必须重新读取。采用仓库 Gradle Wrapper,先核对 JDK 与插件组合,不因历史构建通过跳过当前兼容检查:

cd android-app
./gradlew --version
./gradlew :app:testDebugUnitTest :app:assembleDebug :app:assembleDebugAndroidTest \
  --max-workers=1 -Dorg.gradle.jvmargs=-Xmx1g \
  -Pkotlin.compiler.execution.strategy=in-process
./gradlew :app:assembleRelease --max-workers=1

最后一步只产生构建候选。当前 Gradle 未配置公开可复用的正式 Release 签名流程,不能把 unsigned 包、Debug key 或任意临时签名当作正式升级渠道。正式密钥由受保护签名系统提供,不在命令历史或文档中填写口令。

以下命令假定维护者已将正确签名的最终 APK 放为工作区内 candidate-release.apk,并准备好 Android SDK 命令:

apksigner verify --verbose --print-certs candidate-release.apk
apkanalyzer manifest application-id candidate-release.apk
apkanalyzer manifest version-name candidate-release.apk
apkanalyzer manifest version-code candidate-release.apk
apkanalyzer manifest min-sdk candidate-release.apk
apkanalyzer manifest target-sdk candidate-release.apk
shasum -a 256 candidate-release.apk

比对签名证书摘要、备案材料与上一可升级安装包,确认 application ID 不变、versionCode 递增。正式包不得包含模拟器地址、fixture 登录或本地 HTTP 依赖。Release 清单禁止明文流量,编译属性接受 URL 不代表网络策略允许。安装验收至少包括干净安装与从上一版原地升级;现有用户预览设备不得为测试方便而卸载或清数据。

升级后确认记忆、附件、任务、收藏和已登录恢复策略;对旧字段、加密格式和失败保护做专项回归。包签名变化可能阻止升级,应在独立 QA 设备发现,不能先要求用户删除原 App。验证完成后计算最终 SHA-256 与大小,后续重新签名、重打包或修改资源都要求重算并重验,不能沿用上一份摘要。

iOS Archive 与发布签名

从 project.yml 与已提交 Xcode 工程核对源配置;当前最低 iOS 17、设备族 iPhone,Info.plist 仍含历史 1.0/构建 1。不得据此声称商店已有新构建。生成工程或修改版本后,检查实际构建设置:

xcodebuild -project ios-app/StarlineWorkbench.xcodeproj \
  -scheme StarlineWorkbench -configuration Release -showBuildSettings \
  | rg 'PRODUCT_BUNDLE_IDENTIFIER|MARKETING_VERSION|CURRENT_PROJECT_VERSION|IPHONEOS_DEPLOYMENT_TARGET|TARGETED_DEVICE_FAMILY'

没有出现某字段时继续核对 Info.plist 与最终产物,不能把空输出解释为默认正确。签名团队、证书、描述文件和 Push Notifications 能力需匹配;Debug 使用 development entitlement,Release 使用 production,并与服务端 APNs 环境及 VoIP topic 对齐。

xcodebuild -project ios-app/StarlineWorkbench.xcodeproj \
  -scheme StarlineWorkbench -configuration Release \
  -destination 'generic/platform=iOS' \
  -archivePath build/StarlineWorkbench.xcarchive archive

生成后在实际 App 目录检查签名和打包后的版本。这里的路径是仓库内候选产物,不是用户安装目录:

codesign --verify --deep --strict build/StarlineWorkbench.xcarchive/Products/Applications/StarlineWorkbench.app
codesign -dv --verbose=4 build/StarlineWorkbench.xcarchive/Products/Applications/StarlineWorkbench.app
plutil -p build/StarlineWorkbench.xcarchive/Products/Applications/StarlineWorkbench.app/Info.plist

Xcode Archive、导出、上传回执、处理完成、选择构建、审核提交、审核通过与正式可下载应逐项记录。iOS 的真实账号授权、自动返回、冷启动、取消与记忆保护必须在目标设备完成;历史系统表单测试不能代替完整授权。Apple iPad 登录驳回与商业模式说明仍需形成新的后台闭环,不能引用 Android 成功作为修复证明。

服务端、数据库与兼容门禁

检查阶段 执行内容 通过标准
配置 按配置参考核对变量来源、格式和依赖 无 fixture 混入;稳定密钥可匹配当前数据;外部能力明确启用条件
迁移 在隔离副本运行对应版本,验证 schema、读写与权限 Account 001–007 与 PII 迁移有配套备份;聊天构造迁移不破坏旧记录
切换 停旧写入口、按维护窗口启用新实例 无双写、无指错持久卷、无新建空库误报健康
验证 HTTP、身份、消息、媒体、事件、通话等分层探测 合成业务断言与拒绝路径通过,真实依赖另有证据
观测 错误、延迟、重启、磁盘、队列和外部接受状态 发现异常能关联阶段,日志不含秘密与用户内容

数据库升级没有通用降级脚本。发布前应验证旧客户端对新增字段的容忍、旧服务是否能读取升级后结构、数据保护密钥是否变化。退镜像与退数据是两种动作:退镜像可能遇到 schema 不兼容,退数据库可能丢失恢复点后写入。不能承诺一键无损回滚;按恢复演练预先验证并记录边界。

下载、渠道与正式回执

下载地址只指向已核验的最终产物。iOS 使用真实公开 App Store 链接;Android 填写最终版本、最低系统、大小、SHA-256 与渠道状态。只有稳定版验收完成后才切 stable,预览包需保留其可用范围说明;空地址继续显示准备中。

可以在发布后的授权核验阶段下载公开候选并比较,以下域名与文件名为合成示例:

set -eu
curl --fail --location --output qa-download.apk https://downloads.example.test/starline-release.apk
shasum -a 256 qa-download.apk
apksigner verify --verbose qa-download.apk

同时核对 HTTPS 信任链、重定向、响应文件类型、真实字节和安装升级,不只发 HEAD 请求或检查 URL 格式。备案标识、包名、签名证书和商店材料应属于同一产品;网站号与 App 号分开,星线与星企不混用。小米仍缺版权证明与聊天安全评估材料,草稿保存不能当作提审;正式 APK 与渠道回执仍需取得。

星线智联 0.1.0 只有开发上传历史,未提审、未发布,且保持暂停。上传版本号、开发者工具预览或设置 published 环境开关均不是官方发布回执。watchOS 独立联网版没有成品交付,手机包不能替它填报已上线。

渠道操作前把版本记录与材料逐项对应:创建草稿只记录草稿;上传成功记录包处理状态;选择构建后确认实际提交;审核结果以后台决定为准;公开发布后核对目标地区、可下载版本与安装结果。被拒后保留具体原因和对应设备,再关联修复提交、复验和新回执。截图、客服说明、审核回复和补件上传分别保存,不能用一项替代整套流程。渠道要求变化时核对当前后台字段,不从旧材料复制过期状态。

关闭发行记录

发行记录至少包含:最终源码/工作区基线、工具链、版本与签名标识、产物摘要、数据兼容结论、所选设备与网络、通过和失败用例、外部依赖、上传/审核/发布回执、公开下载核验、可回退版本和已知限制。给每项写准确阶段,不用“已经弄好”概括整条链路。后续紧急修复仍须关联相同清单,避免源码、文档、安装包和商店说明分别指向不同版本。

Markdown 原文完整文档文本