docs(android): adopt login-page legal consent

This commit is contained in:
key
2026-07-29 10:35:41 +08:00
parent b9e0878926
commit 6bf365d591
9 changed files with 56 additions and 49 deletions
+2 -1
View File
@@ -4,7 +4,8 @@
## Unreleased ## Unreleased
- **2026-07-28 至 2026-07-29,8 月 1 日 Android 受控内测候选包与法务链路,当前总体 No-Go**:补齐登录页协议默认不勾选与法务地址失败关闭、App-Plus 原生隐私配置生成/校验、APK 包名/版本/API/签名/哈希/包内资源一致性/敏感值门禁、DCloud 云证书自定义基座和独立测试包流程;《服务协议》《隐私政策》静态页已部署到 `/legal/`,发布前整站备份为 `/opt/wygj/backups/www-20260728224710`。客户端法务校验已移除 App-Plus 不保证支持的浏览器 `URL` 构造器,测试验证码也不再以源码常量进入安装包;五个文件选择服务与九个消费页面进一步统一“用户取消/平台失败”分流,取消后不再残留上传或转写错误;直通车首次弱网加载失败后可原位重试,失败时清空旧通道并禁止提交。当前独立 APK `com.yincheng.wygj 0.1.10 (110)` 的 `targetSdkVersion=35`,SHA-256 为 `20CB16B4E9D024DBF5EEEF577BFBA3B4DF5E5E78B597BABB99CB7450C7AE5034`;Android 原生网络安全配置经 APK 反编译确认 `usesCleartextTraffic=false`、`networkSecurityConfig` 引用和系统证书信任配置均已进入安装包。本机 `Medium_Phone` Android 15/API 35 虚拟机已完成从 `0.1.9` 保留数据覆盖升级和冷启动,真实显示原生隐私弹窗,四项敏感权限保持未授权且未见 FATAL/ANR;`0.1.6` 已在 vivo V2443A(Android 15)完成覆盖安装和冷启动。代码候选提交 `dc20b920` 已在干净工作区通过统一 RC 门禁,`releaseEligible=true`:移动端 198 项测试、类型检查、H5/App 构建、管理端构建、`ruoyi-aihr` 698 项全量测试、后端打包及 APK 强化门禁全部通过;最小交付包 SHA-256 为 `4BAA79B2CA2C4D486B6194288D90022D5F994A4D8C8E05D7C2DDD87F9BF5B3B7`,解压后 9 个文件、其中 8 个载荷逐文件复验通过。只读生产预检确认根站、租户接口、移动首页和 64/64 schema 门禁通过,但生产后端模块、管理端和移动 H5 与本地候选仍不一致;用户隐私选择、权限反例、认证态核心业务和正式内容也未完成,故 Go/No-Go 为 **No-Go**。本次没有新增生产发布、服务重启、数据库或静态资源变更。 - **2026-07-29,Android 法务交互按企业内测体验收口,候选升级为 `0.1.12 (112)`,未发布生产**:取消启动阶段的 DCloud 原生隐私确认,统一由登录页协议勾选承担同意门槛;协议默认未勾选,服务协议与隐私政策可点击查看,未勾选时发送验证码和登录均在请求前失败关闭。两个公开 HTTPS 地址进入版本化 `.env`,npm 与 HBuilderX 云打包共用;源码、App-Plus 产物和 APK 门禁同时检查 `prompt=none`、登录法务链接、未勾选拦截、网络安全与敏感值。DCloud 独立内测 APK `com.yincheng.wygj 0.1.12 (112)` 大小 `33,921,458` 字节,SHA-256 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`,API 35、v2 测试签名、`usesCleartextTraffic=false`;本机 Android 15/API 35 虚拟机全新安装后确认原生隐私层不可见、四项敏感权限未授权、无 Crash/ANR。干净提交 `b9e08789` 的统一 RC 为 `releaseEligible=true`:移动端 199 项、后端 698 项、类型检查、H5/App、管理端、后端打包和 APK 深检全部通过,证据位于 `output/aug1-rc/0.1.12-112-b9e08789-frozen/`。该 x86_64 虚拟机对 ARM-only DCloud Weex 运行时出现 IPC 初始化超时,因此不把空白 WebView 作为页面通过;登录页链接/未勾选反例及认证业务仍须 ARM64 真机验收。本项没有发布后端、H5、数据库或新的生产静态资源。
- **2026-07-28 至 2026-07-29,前一版 Android 受控内测候选包与法务链路,历史总体 No-Go**:补齐登录页协议默认不勾选与法务地址失败关闭、App-Plus 原生隐私配置生成/校验、APK 包名/版本/API/签名/哈希/包内资源一致性/敏感值门禁、DCloud 云证书自定义基座和独立测试包流程;《服务协议》《隐私政策》静态页已部署到 `/legal/`,发布前整站备份为 `/opt/wygj/backups/www-20260728224710`。客户端法务校验已移除 App-Plus 不保证支持的浏览器 `URL` 构造器,测试验证码也不再以源码常量进入安装包;五个文件选择服务与九个消费页面进一步统一“用户取消/平台失败”分流,取消后不再残留上传或转写错误;直通车首次弱网加载失败后可原位重试,失败时清空旧通道并禁止提交。当时独立 APK `com.yincheng.wygj 0.1.10 (110)` 的 `targetSdkVersion=35`,SHA-256 为 `20CB16B4E9D024DBF5EEEF577BFBA3B4DF5E5E78B597BABB99CB7450C7AE5034`;Android 原生网络安全配置经 APK 反编译确认 `usesCleartextTraffic=false`、`networkSecurityConfig` 引用和系统证书信任配置均已进入安装包。本机 `Medium_Phone` Android 15/API 35 虚拟机已完成从 `0.1.9` 保留数据覆盖升级和冷启动,真实显示原生隐私弹窗,四项敏感权限保持未授权且未见 FATAL/ANR;`0.1.6` 已在 vivo V2443A(Android 15)完成覆盖安装和冷启动。代码候选提交 `dc20b920` 已在干净工作区通过统一 RC 门禁,`releaseEligible=true`:移动端 198 项测试、类型检查、H5/App 构建、管理端构建、`ruoyi-aihr` 698 项全量测试、后端打包及 APK 强化门禁全部通过;最小交付包 SHA-256 为 `4BAA79B2CA2C4D486B6194288D90022D5F994A4D8C8E05D7C2DDD87F9BF5B3B7`,解压后 9 个文件、其中 8 个载荷逐文件复验通过。只读生产预检确认根站、租户接口、移动首页和 64/64 schema 门禁通过,但生产后端模块、管理端和移动 H5 与本地候选仍不一致;用户隐私选择、权限反例、认证态核心业务和正式内容也未完成,故当时 Go/No-Go 为 **No-Go**。本项没有新增生产发布、服务重启、数据库或静态资源变更。
- **2026-07-29,发布预检支持定向后端/schema 范围和冻结物核验,未发布**:`release-preflight.sh` 不再把远端后端或 schema 核验强制绑定到管理端/H5 静态匹配;定向后端发布可只启用 `RELEASE_VERIFY_REMOTE_BACKEND=true RELEASE_VERIFY_REMOTE_SCHEMA=true`,且只要求本地后端 JAR 新鲜。完整包口径仍必须同时启用远端静态、后端和 schema 三项。新增范围回归脚本,校验缺少 `RELEASE_REMOTE_URL` 时失败关闭、定向模式不回退为静态耦合、完整模式命令仍保留;`feece9bb` 再新增 `RELEASE_ARTIFACT_COMMIT` 与 `RELEASE_LOCAL_BACKEND_PATH`,允许从后续文档提交上安全地核验冻结提交及其实际候选 JAR。提交 `566f222e` 后只重建后端并实跑生产只读定向预检:输出没有管理端/H5 哈希,根站、租户、移动首页、64/64 schema 和生产禁 DDL 门禁通过,最终仅因现网/候选 AIHR 模块哈希 `15f5513a…` / `c93460e8…` 不同而按预期失败。随后以 `dc20b920` 和发布 ZIP 解压 JAR 再跑后端只读预检,确认候选整包哈希 `8c676f2f…`,仍仅在同一模块差异处失败;这证明范围和冻结物选择正确,不代表后端已经发布。本项没有执行生产同步、重启或数据库变更。 - **2026-07-29,发布预检支持定向后端/schema 范围和冻结物核验,未发布**:`release-preflight.sh` 不再把远端后端或 schema 核验强制绑定到管理端/H5 静态匹配;定向后端发布可只启用 `RELEASE_VERIFY_REMOTE_BACKEND=true RELEASE_VERIFY_REMOTE_SCHEMA=true`,且只要求本地后端 JAR 新鲜。完整包口径仍必须同时启用远端静态、后端和 schema 三项。新增范围回归脚本,校验缺少 `RELEASE_REMOTE_URL` 时失败关闭、定向模式不回退为静态耦合、完整模式命令仍保留;`feece9bb` 再新增 `RELEASE_ARTIFACT_COMMIT` 与 `RELEASE_LOCAL_BACKEND_PATH`,允许从后续文档提交上安全地核验冻结提交及其实际候选 JAR。提交 `566f222e` 后只重建后端并实跑生产只读定向预检:输出没有管理端/H5 哈希,根站、租户、移动首页、64/64 schema 和生产禁 DDL 门禁通过,最终仅因现网/候选 AIHR 模块哈希 `15f5513a…` / `c93460e8…` 不同而按预期失败。随后以 `dc20b920` 和发布 ZIP 解压 JAR 再跑后端只读预检,确认候选整包哈希 `8c676f2f…`,仍仅在同一模块差异处失败;这证明范围和冻结物选择正确,不代表后端已经发布。本项没有执行生产同步、重启或数据库变更。
- **2026-07-29,Android 人工验收新增只读统一取证**:新增 `capture-android-acceptance.ps1`,只读取指定设备当前包版本、前台 Activity、四项敏感权限、UI 层级、截图和应用退出记录,证据限定写入 Git 已忽略的 `output/`;静态回归拒绝安装、启动、停止、清数据、授权、撤权和输入类命令。脚本已在 `emulator-5554` 实跑,确认 `0.1.10 (110)` / API 35 的原生隐私标题与拒绝/同意按钮可见、手机号登录不可见、四项权限均未授权、退出记录无 Crash/ANR。本项只记录用户选择前状态,未代替用户点击隐私选项。 - **2026-07-29,Android 人工验收新增只读统一取证**:新增 `capture-android-acceptance.ps1`,只读取指定设备当前包版本、前台 Activity、四项敏感权限、UI 层级、截图和应用退出记录,证据限定写入 Git 已忽略的 `output/`;静态回归拒绝安装、启动、停止、清数据、授权、撤权和输入类命令。脚本已在 `emulator-5554` 实跑,确认 `0.1.10 (110)` / API 35 的原生隐私标题与拒绝/同意按钮可见、手机号登录不可见、四项权限均未授权、退出记录无 Crash/ANR。本项只记录用户选择前状态,未代替用户点击隐私选项。
- **2026-07-29,Android 隐私拒绝取证补齐二次确认与退出态**:只读取证脚本现在按实际原生模板区分首次选择 `first-choice`、二次“确认提示/退出应用” `exit-confirmation` 和弹窗不可见 `not-visible`,并记录 App 进程是否存在、是否前台及当前 UI 是否属于 App。`pidof` 在用户退出后返回非零不再让取证失败,因此可分别留存“暂不同意后的二次确认”和“退出应用后的 Launcher/退出记录”证据;脚本仍不发送点击、启动/停止或权限命令。 - **2026-07-29,Android 隐私拒绝取证补齐二次确认与退出态**:只读取证脚本现在按实际原生模板区分首次选择 `first-choice`、二次“确认提示/退出应用” `exit-confirmation` 和弹窗不可见 `not-visible`,并记录 App 进程是否存在、是否前台及当前 UI 是否属于 App。`pidof` 在用户退出后返回非零不再让取证失败,因此可分别留存“暂不同意后的二次确认”和“退出应用后的 Launcher/退出记录”证据;脚本仍不发送点击、启动/停止或权限命令。
+1 -1
View File
@@ -11,7 +11,7 @@
- 品牌:管理端与员工端统一显示“帮道”,继续使用现有红色品牌图标。 - 品牌:管理端与员工端统一显示“帮道”,继续使用现有红色品牌图标。
- 基础链路:租户列表、验证码、`000000 / admin / admin123` 加密登录已验证。 - 基础链路:租户列表、验证码、`000000 / admin / admin123` 加密登录已验证。
- 管理端:除 AI 面试、训练、案例、SOP 和资料处理外,已包含大喇叭发布、单文件提炼与多岗位解读、五渠道直通反馈收件箱、内容/任务运营、问题榜运营、知识空间、全网 AI 配置和组织权限;员工个人训练、主管复盘、团队难题、成长证据与训练录音仅在认证 APP 按项目范围访问。 - 管理端:除 AI 面试、训练、案例、SOP 和资料处理外,已包含大喇叭发布、单文件提炼与多岗位解读、五渠道直通反馈收件箱、内容/任务运营、问题榜运营、知识空间、全网 AI 配置和组织权限;员工个人训练、主管复盘、团队难题、成长证据与训练录音仅在认证 APP 按项目范围访问。
- 用户侧:`mobile-uni/` 承载员工、候选人和主管三端;“问”已改为数字师傅 Agent,文字、ASR 转写和图片/视频统一先做意图规划,再按服务端权限调用知识、训练、待办、记忆、媒体或全网工具,寒暄和不完整表达不再机械落入 RAG。现有能力还包括手机号登录、30 分钟短期多轮、原文件/视频受控交付、大喇叭公司文件摘要/下载/多岗位解读/追问、五渠道直通反馈、“记一下”确认卡、三级字号、训练/题目反馈、问题榜与积分、岗位考试、案例、候选面试/资料、主管复盘/派发及学员模式。Agent 代码已随 2026-07-25 完整包部署;2026-07-29 当前候选包为 `0.1.10 (110)`,已通过 API 35、法务链接、包内资源一致性、敏感值、禁止明文 HTTP 和网络安全资源门禁,并在本机 Android 15/API 35 虚拟机从 `0.1.9` 覆盖升级、冷启动且保持四项敏感权限未授权。媒体选择取消不再被误报为上传/转写失败;直通车首次弱网加载失败后可原位重试,失败时清空旧通道并禁止提交;移动端 198 项测试通过。代码候选提交 `dc20b920` 的统一 RC 证据为 `releaseEligible=true`,`ruoyi-aihr` 698 项测试通过;5 个场景和 30 道政策题已整理为禁用/待审候选,但正式可发布内容仍为 0/0。最新包已真实显示原生隐私弹窗且未见崩溃,`0.1.6` 已在 Android 15 真机完成覆盖安装。用户亲自执行的隐私选择、权限正反例、认证态核心业务全回归、生产依赖匹配和发布签认仍未完成,当前 Go/No-Go 仍为 No-Go。旧 `mobile/` 只用于历史回溯。 - 用户侧:`mobile-uni/` 承载员工、候选人和主管三端;“问”已改为数字师傅 Agent,文字、ASR 转写和图片/视频统一先做意图规划,再按服务端权限调用知识、训练、待办、记忆、媒体或全网工具,寒暄和不完整表达不再机械落入 RAG。现有能力还包括手机号登录、30 分钟短期多轮、原文件/视频受控交付、大喇叭公司文件摘要/下载/多岗位解读/追问、五渠道直通反馈、“记一下”确认卡、三级字号、训练/题目反馈、问题榜与积分、岗位考试、案例、候选面试/资料、主管复盘/派发及学员模式。Agent 代码已随 2026-07-25 完整包部署;2026-07-29 当前候选包为 `0.1.12 (112)`,启动阶段不再展示 DCloud 原生隐私确认,法务同意统一由登录页承担:协议默认未勾选、两个正文可点击、未勾选时验证码和登录均失败关闭。包体已通过 API 35、登录法务链接、包内资源一致性、敏感值、禁止明文 HTTP 和网络安全资源门禁;本机 Android 15/API 35 虚拟机全新安装后确认无原生隐私弹窗、四项敏感权限未授权且无 Crash/ANR。提交 `b9e08789` 的统一 RC 证据为 `releaseEligible=true`,移动端 199 项、`ruoyi-aihr` 698 项测试及全部构建通过。该 x86_64 虚拟机无法可靠运行仅含 ARM ABI 的 DCloud Weex 页面,因此登录页点击和认证业务仍须在 ARM64 真机完成;正式内容仍为 0/0,生产后端、业务签认和发布授权也未闭环,当前 Go/No-Go 仍为 No-Go。旧 `mobile/` 只用于历史回溯。
- 英雄路径:AI 面试(真模型出题/评分)、三角色对练(真 LLM 客户回复+评分,ASR/TTS 配置后支持语音)、案例沉淀(真实语音上传+ASR 转写+模型整理)均为真模型优先、未配置或失败回退本地兜底;生产短音频 ASR 当前为阿里云百炼 `qwen3-asr-flash`,SiliconFlow audio 接口保留兼容。SOP 知识库已接中文关键词 + MySQL Fulltext + Qdrant 混合召回 + rerank 重排,支持 txt/md/PDF/Word/Excel/PPT/图片/视频上传解析入库(图片走 vision OCR,视频走 ffmpeg 抽音轨转写+关键帧描述),资料处理中心支持 ZIP 异步展开后逐文件入队;模型配置页可查看向量库维度/点数并一键重建。 - 英雄路径:AI 面试(真模型出题/评分)、三角色对练(真 LLM 客户回复+评分,ASR/TTS 配置后支持语音)、案例沉淀(真实语音上传+ASR 转写+模型整理)均为真模型优先、未配置或失败回退本地兜底;生产短音频 ASR 当前为阿里云百炼 `qwen3-asr-flash`,SiliconFlow audio 接口保留兼容。SOP 知识库已接中文关键词 + MySQL Fulltext + Qdrant 混合召回 + rerank 重排,支持 txt/md/PDF/Word/Excel/PPT/图片/视频上传解析入库(图片走 vision OCR,视频走 ffmpeg 抽音轨转写+关键帧描述),资料处理中心支持 ZIP 异步展开后逐文件入队;模型配置页可查看向量库维度/点数并一键重建。
- 资料处理:已新增解析任务状态页,按 `aihr_knowledge_attach` 和 `aihr_knowledge_fragment` 展示等待解析、解析中、已完成、失败、片段数和向量化状态;任务列表按当前筛选结果前端分页(10/20/50 条,筛选或刷新回到第一页)。页面只保留“批量导入”,通过异步队列处理多文件或 ZIP,不提供浏览器目录选择和服务端目录导入入口。后端目录导入接口仅保留为运维/调试能力。 - 资料处理:已新增解析任务状态页,按 `aihr_knowledge_attach` 和 `aihr_knowledge_fragment` 展示等待解析、解析中、已完成、失败、片段数和向量化状态;任务列表按当前筛选结果前端分页(10/20/50 条,筛选或刷新回到第一页)。页面只保留“批量导入”,通过异步队列处理多文件或 ZIP,不提供浏览器目录选择和服务端目录导入入口。后端目录导入接口仅保留为运维/调试能力。
- 组织人员:`aihr_org_snapshot` 本地 reset 保留演示 seed;生产通过 `POST /api/aihr/org/sync` 同步外部组织。2026-07-25 记录的生产快照为 3417 人、2938 人在职且均有姓名、3392 个手机号映射、175 名在职主管和 20 名项目经理;姓名通过稳定 `employee_id` 定向补齐,未执行全量覆盖。当前上游 `employee_number` 与既有主体不一致且手机号大量脱敏,修复契约前禁止强制全量同步;人数属于时点事实,发布或验收前应重新查询。 - 组织人员:`aihr_org_snapshot` 本地 reset 保留演示 seed;生产通过 `POST /api/aihr/org/sync` 同步外部组织。2026-07-25 记录的生产快照为 3417 人、2938 人在职且均有姓名、3392 个手机号映射、175 名在职主管和 20 名项目经理;姓名通过稳定 `employee_id` 定向补齐,未执行全量覆盖。当前上游 `employee_number` 与既有主体不一致且手机号大量脱敏,修复契约前禁止强制全量同步;人数属于时点事实,发布或验收前应重新查询。
+2 -2
View File
@@ -366,11 +366,11 @@ Android 人工验收每完成一个步骤,用 `.\scripts\capture-android-accep
./scripts/verify-aug1-production-api-readonly.sh ./scripts/verify-aug1-production-api-readonly.sh
``` ```
冻结运行时产物后,如发布/回滚或验收工具继续修正,不要重编同版本 APK/JAR冒充新运行时。使用双提交打包器保留 `dc20b920` 运行时提交,并把当前干净 `HEAD` 作为 operations commit;新包名同时包含两者短哈希,旧 ZIP 不覆盖: 冻结运行时产物后,如发布/回滚或验收工具继续修正,不要重编同版本 APK/JAR 冒充新运行时。当前打包器默认使用 `b9e08789` 的 `0.1.12 (112)` 统一 RC 证据,并把当前干净 `HEAD` 作为 operations commit;新包名同时包含两者短哈希,旧 ZIP 不覆盖:
```powershell ```powershell
.\scripts\package-aug1-release.ps1 ` .\scripts\package-aug1-release.ps1 `
-BackendJar .\output\aug1-release\0.1.10-110-dc20b920\ruoyi-admin-dc20b920.jar -BackendJar .\backend\ruoyi-admin\target\ruoyi-admin.jar
``` ```
打包器重新校验冻结证据、APK/JAR/内容哈希和提交祖先关系,按固定顺序与时间戳生成 14 个文件的 ZIP,并附带发布、预检、API 探针、Android 取证及最新 Go/No-Go 的审计快照。ZIP 内 operations 脚本用于交付审计;实际执行仍须从对应 operations commit 的干净仓库运行。 打包器重新校验冻结证据、APK/JAR/内容哈希和提交祖先关系,按固定顺序与时间戳生成 14 个文件的 ZIP,并附带发布、预检、API 探针、Android 取证及最新 Go/No-Go 的审计快照。ZIP 内 operations 脚本用于交付审计;实际执行仍须从对应 operations commit 的干净仓库运行。
+11 -8
View File
@@ -5,7 +5,7 @@
## 预条件 ## 预条件
1. 已执行 `npm --prefix mobile-uni run build:app`,并使用 HBuilderX 的**自定义运行基座**运行当前资源。 1. 已执行 `npm --prefix mobile-uni run build:app`,并使用 HBuilderX 的**自定义运行基座**运行当前资源。
2. Android 首次上机前,在同一构建会话设置法务确认的 `VITE_APP_TERMS_URL`、`VITE_APP_PRIVACY_URL`,执行 `npm --prefix mobile-uni run configure:app-privacy`、`build:app` 和 `verify:app-release`;不得手工放入占位地址,也不得让原生弹窗与登录页使用不同地址。 2. Android 首次上机前,核对版本化 `mobile-uni/.env` 中法务确认的 `VITE_APP_TERMS_URL`、`VITE_APP_PRIVACY_URL`,执行 `npm --prefix mobile-uni run configure:app-legal`、`build:app` 和 `verify:app-release`;不得手工放入占位地址。启动原生提示必须关闭,登录页是唯一法务同意入口。
3. 使用有效的移动端测试账号;不得把管理员 Web 登录态当作 App 登录验证。 3. 使用有效的移动端测试账号;不得把管理员 Web 登录态当作 App 登录验证。
4. 每台设备保留系统版本、App `versionName/versionCode`、基座/包哈希、录屏或截图和失败日志。 4. 每台设备保留系统版本、App `versionName/versionCode`、基座/包哈希、录屏或截图和失败日志。
5. HBuilderX/CLI 编译链必须与手机调试基座兼容;启动时出现版本不匹配弹窗即视为未通过。当前版本组合和排障命令见 `MOBILE_APP_PACKAGING.md`。 5. HBuilderX/CLI 编译链必须与手机调试基座兼容;启动时出现版本不匹配弹窗即视为未通过。当前版本组合和排障命令见 `MOBILE_APP_PACKAGING.md`。
@@ -15,10 +15,10 @@ Android 每个人工步骤完成后,可在不改变设备状态的前提下保
```powershell ```powershell
.\scripts\capture-android-acceptance.ps1 ` .\scripts\capture-android-acceptance.ps1 `
-Serial emulator-5554 ` -Serial emulator-5554 `
-Stage privacy-before-choice -Stage fresh-install-no-native-privacy
``` ```
每次手动操作后换一个简短的 `-Stage`。首次点击“暂不同意”后会进入第二层“确认提示”,先用 `privacy-exit-confirmation` 取证;用户再亲自点击“退出应用”后用 `privacy-rejected-exited` 取证。脚本会区分 `first-choice`、`exit-confirmation` 和 `not-visible`,并在应用进程已经退出时继续记录前台 Activity、退出记录和权限,不会因 `pidof` 无结果而失败。随后重新启动并由用户点击“同意并继续”,使用 `privacy-consented`;麦克风拒绝可使用 `microphone-denied`。脚本不把“拍到页面”自动判成业务通过;验收人仍须结合预期、截图和 `acceptance-evidence.json` 签认。 每次手动操作后换一个简短的 `-Stage`。当前版本首次启动应记录为 `fresh-install-no-native-privacy`;登录页默认未勾选、两个法务链接可打开、未勾选发送验证码和登录均被阻止,可分别使用 `login-consent-default`、`login-legal-links`、`login-consent-required`。麦克风拒绝可使用 `microphone-denied`。脚本仍兼容识别旧包的 `first-choice`、`exit-confirmation` 和 `not-visible`,仅用于历史取证,不再是当前验收流程。脚本不把“拍到页面”自动判成业务通过;验收人仍须结合预期、截图和 `acceptance-evidence.json` 签认。
## 当前证据边界 ## 当前证据边界
@@ -30,7 +30,7 @@ Android 每个人工步骤完成后,可在不改变设备状态的前提下保
23:12 又生成可独立安装的非自定义基座 DCloud 云证书内测 APK `bangdao-0.1.5-dcloud-test.apk`,大小 `33,920,950` 字节,SHA-256 为 `AB634EB9A9F0939804151ED14815484FBD75DFE36CC24DF00EC23BDD762D8FD1`。APK 反编译门禁已确认包内 `androidPrivacy.json` 使用线上《服务协议》和《隐私政策》地址;同签名覆盖安装成功。只清除 `com.yincheng.wygj` 测试数据后,以系统 Launcher Activity 冷启动,原生 template 弹窗真实显示“同意并继续/暂不同意”,两个链接均在 vivo 系统浏览器打开对应 HTTPS 页面,且未发现 `FATAL EXCEPTION`。验收过程没有代替用户点击同意或拒绝;拒绝退出、同意后登录、主动录音权限、弱网、方言、iOS 和下列全项仍未通过。 23:12 又生成可独立安装的非自定义基座 DCloud 云证书内测 APK `bangdao-0.1.5-dcloud-test.apk`,大小 `33,920,950` 字节,SHA-256 为 `AB634EB9A9F0939804151ED14815484FBD75DFE36CC24DF00EC23BDD762D8FD1`。APK 反编译门禁已确认包内 `androidPrivacy.json` 使用线上《服务协议》和《隐私政策》地址;同签名覆盖安装成功。只清除 `com.yincheng.wygj` 测试数据后,以系统 Launcher Activity 冷启动,原生 template 弹窗真实显示“同意并继续/暂不同意”,两个链接均在 vivo 系统浏览器打开对应 HTTPS 页面,且未发现 `FATAL EXCEPTION`。验收过程没有代替用户点击同意或拒绝;拒绝退出、同意后登录、主动录音权限、弱网、方言、iOS 和下列全项仍未通过。
2026-07-29 当前候选包升级为 `0.1.6 (106)`,大小 `33,921,279` 字节,SHA-256 为 `A5F026B70F11327355597B9FEA3625C4168700297E6D7847F10B079CEB860914`。191 项移动端单元测试和类型检查通过;APK 已通过 API 35、法务链接、签名、包内 `app-service.js` 与当前 App-Plus 编译产物一致性以及手机号、固定测试验证码、私钥和常见令牌扫描。该包在同一 vivo V2443A 完成保留数据的覆盖安装和 Launcher 冷启动,系统读取为 `minSdk=21`、`targetSdk=35`,相机、录音和媒体权限保持未授权,未发现 `FATAL EXCEPTION`。因为覆盖安装保留了前一版本的隐私状态,本次未重新触发首次隐私弹窗;仍须由用户亲自完成最新包的拒绝/同意反例。 2026-07-29 当时候选包升级为 `0.1.6 (106)`,大小 `33,921,279` 字节,SHA-256 为 `A5F026B70F11327355597B9FEA3625C4168700297E6D7847F10B079CEB860914`。191 项移动端单元测试和类型检查通过;APK 已通过 API 35、法务链接、签名、包内 `app-service.js` 与当前 App-Plus 编译产物一致性以及手机号、固定测试验证码、私钥和常见令牌扫描。该包在同一 vivo V2443A 完成保留数据的覆盖安装和 Launcher 冷启动,系统读取为 `minSdk=21`、`targetSdk=35`,相机、录音和媒体权限保持未授权,未发现 `FATAL EXCEPTION`。因为覆盖安装保留了前一版本的隐私状态,本次未重新触发首次隐私弹窗;该记录仅作历史追溯。
同日,本机 Android Studio `Medium_Phone` 虚拟机完成 Android 15/API 35 启动,物理分辨率 `1080×2400`、密度 `420`。在虚拟机此前未安装本应用的前提下,`0.1.6 (106)` 首次安装成功并从系统 Launcher 冷启动,`am start -W` 记录总耗时约 `6.4s`;最新包真实显示原生《服务协议和隐私政策》弹窗,四项相机、录音、图片和视频权限均为 `granted=false`,crash 缓冲区为空。截图和 UI 层级保存在忽略目录 `output/aug1-rc/android-emulator/`;验收未代替用户点击同意或拒绝。虚拟机证据用于补充干净安装和 API 35 权限基线,不能替代真实设备的媒体、WebRTC、弱网和系统浏览器交互。 同日,本机 Android Studio `Medium_Phone` 虚拟机完成 Android 15/API 35 启动,物理分辨率 `1080×2400`、密度 `420`。在虚拟机此前未安装本应用的前提下,`0.1.6 (106)` 首次安装成功并从系统 Launcher 冷启动,`am start -W` 记录总耗时约 `6.4s`;最新包真实显示原生《服务协议和隐私政策》弹窗,四项相机、录音、图片和视频权限均为 `granted=false`,crash 缓冲区为空。截图和 UI 层级保存在忽略目录 `output/aug1-rc/android-emulator/`;验收未代替用户点击同意或拒绝。虚拟机证据用于补充干净安装和 API 35 权限基线,不能替代真实设备的媒体、WebRTC、弱网和系统浏览器交互。
@@ -40,10 +40,12 @@ Android 每个人工步骤完成后,可在不改变设备状态的前提下保
随后针对 Android 系统文件选择器“用户取消”被误判成上传或转写失败的问题,将五个文件选择服务统一为结构化取消信号,并在九个页面恢复空闲态、清理残留“转写中”提示;真实平台异常仍显示稳定中文错误。新增回归覆盖五个选择器的取消/失败分流以及九个消费页面。直通车页同时补齐首次弱网导致五个直达对象加载失败后的原位重试,失败时清空旧通道并禁止提交,恢复后自动选择有效通道;再增加 package、lockfile 与 manifest 版本一致性门禁。移动端测试增至 `198/198`,类型检查通过。自动化证明状态机已修复,但真实系统文件选择器取消与断网恢复仍须人工点击确认。 随后针对 Android 系统文件选择器“用户取消”被误判成上传或转写失败的问题,将五个文件选择服务统一为结构化取消信号,并在九个页面恢复空闲态、清理残留“转写中”提示;真实平台异常仍显示稳定中文错误。新增回归覆盖五个选择器的取消/失败分流以及九个消费页面。直通车页同时补齐首次弱网导致五个直达对象加载失败后的原位重试,失败时清空旧通道并禁止提交,恢复后自动选择有效通道;再增加 package、lockfile 与 manifest 版本一致性门禁。移动端测试增至 `198/198`,类型检查通过。自动化证明状态机已修复,但真实系统文件选择器取消与断网恢复仍须人工点击确认。
当前候选包已升级为 `0.1.10 (110)`,大小 `33,922,134` 字节,SHA-256 为 `20CB16B4E9D024DBF5EEEF577BFBA3B4DF5E5E78B597BABB99CB7450C7AE5034`。DCloud 云打包成功后,APK 元数据、测试签名、包内资源、法务链接、网络安全配置和敏感值门禁全部通过;同一虚拟机从 `0.1.9` 保留数据覆盖安装成功,Launcher 冷启动约 `1.271s`,显示最新原生隐私弹窗,四项敏感权限仍为 `granted=false`,未发现 FATAL 或 ANR。验收仍未代替用户点击拒绝或同意。 当时候选包继续升级为 `0.1.10 (110)`,大小 `33,922,134` 字节,SHA-256 为 `20CB16B4E9D024DBF5EEEF577BFBA3B4DF5E5E78B597BABB99CB7450C7AE5034`。DCloud 云打包成功后,APK 元数据、测试签名、包内资源、法务链接、网络安全配置和敏感值门禁全部通过;同一虚拟机从 `0.1.9` 保留数据覆盖安装成功,Launcher 冷启动约 `1.271s`,显示原生隐私弹窗,四项敏感权限仍为 `granted=false`,未发现 FATAL 或 ANR。该记录仅作历史追溯。
2026-07-29 又以新增的只读统一取证脚本复核同一虚拟机的当前状态:前台 Activity 为 `io.dcloud.PandoraEntryActivity`,原生隐私标题、“暂不同意”和“同意并继续”三个控件均可见,手机号登录尚不可见;相机、录音、图片和视频权限仍为 `false`,应用退出记录中未出现 Crash/ANR。截图、UI、权限、Activity、退出记录和 JSON 均落在忽略目录 `output/aug1-rc/android-acceptance/20260728-192056-privacy-before-choice/`。该次只记录选择前基线,仍未代替用户做隐私选择。 2026-07-29 又以新增的只读统一取证脚本复核同一虚拟机的当前状态:前台 Activity 为 `io.dcloud.PandoraEntryActivity`,原生隐私标题、“暂不同意”和“同意并继续”三个控件均可见,手机号登录尚不可见;相机、录音、图片和视频权限仍为 `false`,应用退出记录中未出现 Crash/ANR。截图、UI、权限、Activity、退出记录和 JSON 均落在忽略目录 `output/aug1-rc/android-acceptance/20260728-192056-privacy-before-choice/`。该次只记录选择前基线,仍未代替用户做隐私选择。
随后根据企业内部应用的体验决策,`0.1.12 (112)` 取消 DCloud 启动原生确认,法务同意统一放到登录页。新 APK 大小 `33,921,458` 字节,SHA-256 为 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`;包体门禁确认 `prompt=none`、登录页两个 HTTPS 链接和未勾选拦截均已内置。在同一 Android 15/API 35 虚拟机卸载旧包后全新安装,取证结果为原生隐私层 `not-visible`、四项敏感权限未授权、进程与前台 Activity 正常且无 Crash/ANR,证据位于 `output/aug1-rc/android-acceptance/20260729-021418-no-native-privacy-fresh-install-retry/`。该 x86_64 虚拟机运行 ARM-only DCloud Weex 时出现 IPC 初始化超时,页面主体不能作为通过证据;登录页交互和认证业务仍须在 ARM64 真机完成。
## 已完成的 Android 基座证据 ## 已完成的 Android 基座证据
- [x] 自定义基座包名、版本、API 35、单签名、v2 签名和 SHA-256 可重复校验。 - [x] 自定义基座包名、版本、API 35、单签名、v2 签名和 SHA-256 可重复校验。
@@ -52,16 +54,17 @@ Android 每个人工步骤完成后,可在不改变设备状态的前提下保
- [x] 启动后设备信息、外部存储、相机和麦克风权限均保持未授权。 - [x] 启动后设备信息、外部存储、相机和麦克风权限均保持未授权。
- [x] 独立 DCloud 云证书内测 APK 的包内法务配置、API 35、单签名、v2 签名和 SHA-256 可重复校验。 - [x] 独立 DCloud 云证书内测 APK 的包内法务配置、API 35、单签名、v2 签名和 SHA-256 可重复校验。
- [x] 清除本 App 测试数据后首次启动先显示原生隐私弹窗,服务协议与隐私政策链接均可在系统浏览器打开。 - [x] 清除本 App 测试数据后首次启动先显示原生隐私弹窗,服务协议与隐私政策链接均可在系统浏览器打开。
- [x] `0.1.6 (106)` 当前候选包完成同签名覆盖安装、冷启动和启动权限复核,包内资源与当前 App-Plus 编译产物一致。 - [x] `0.1.6 (106)` 历史候选包完成同签名覆盖安装、冷启动和启动权限复核,包内资源与当时 App-Plus 编译产物一致。
- [x] `0.1.8 (108)` 在本机 Android 15/API 35 虚拟机完成卸载重装和冷启动,最新包原生隐私弹窗真实显示,四项敏感权限保持未授权、网络安全配置已进入 APK 且未见崩溃。 - [x] `0.1.8 (108)` 在本机 Android 15/API 35 虚拟机完成卸载重装和冷启动,最新包原生隐私弹窗真实显示,四项敏感权限保持未授权、网络安全配置已进入 APK 且未见崩溃。
- [x] `0.1.8 (108)` 在同一虚拟机完成保留数据覆盖安装、标准 Launcher 启动和首次隐私弹窗前的后台/前台恢复,未见 FATAL 或 ANR。 - [x] `0.1.8 (108)` 在同一虚拟机完成保留数据覆盖安装、标准 Launcher 启动和首次隐私弹窗前的后台/前台恢复,未见 FATAL 或 ANR。
- [x] `0.1.10 (110)` 从 `0.1.9` 保留数据覆盖安装并冷启动成功,最新原生隐私弹窗、未授权权限基线和无 FATAL/ANR 状态保持。 - [x] `0.1.10 (110)` 从 `0.1.9` 保留数据覆盖安装并冷启动成功,最新原生隐私弹窗、未授权权限基线和无 FATAL/ANR 状态保持。
- [x] 只读统一取证脚本已通过状态变更命令回归并在虚拟机实跑,可重复保存当前版本、Activity、隐私控件、权限、UI、截图和退出记录。 - [x] 只读统一取证脚本已通过状态变更命令回归并在虚拟机实跑,可重复保存当前版本、Activity、隐私控件、权限、UI、截图和退出记录。
- [x] 媒体选择取消/真实失败与直通车首次弱网恢复状态机已由 198/198 个移动端测试覆盖;真实 Android 文件选择器取消与断网恢复仍列为下方人工门禁。 - [x] 媒体选择取消/真实失败、直通车首次弱网恢复和登录法务门禁状态机已由当前 199/199 个移动端测试覆盖;真实 Android 文件选择器取消与断网恢复仍列为下方人工门禁。
- [x] `0.1.12 (112)` 全新安装后不显示原生隐私确认,四项敏感权限保持未授权且无 Crash/ANR;包内登录协议门禁与统一 RC 自动校验通过。
## Android(最低 Android 10 + 一台当前主流机型) ## Android(最低 Android 10 + 一台当前主流机型)
- [ ] 用户实际选择“暂不同意”后退出;选择“同意并继续”后才进入登录,且升级后的协议版本策略符合预期。 - [ ] 登录页协议默认未勾选;两个法务链接能打开正确正文;未勾选时验证码和登录均不发请求,勾选后才允许继续。
- [ ] 手机号登录、短信验证码错误、登录失效重登均符合预期。 - [ ] 手机号登录、短信验证码错误、登录失效重登均符合预期。
- [ ] 首次录音允许麦克风后,可完成转写;拒绝麦克风后不循环申请,能选择本地音频继续。 - [ ] 首次录音允许麦克风后,可完成转写;拒绝麦克风后不循环申请,能选择本地音频继续。
- [ ] 原生实时对练可完成麦克风授权、实时转写与远端语音播放;WebRTC/WebView 不可用或断线时明确提示并保留录音对练。 - [ ] 原生实时对练可完成麦克风授权、实时转写与远端语音播放;WebRTC/WebView 不可用或断线时明确提示并保留录音对练。
+13 -14
View File
@@ -30,22 +30,21 @@ npm --prefix mobile-uni run verify:android-apk
该命令默认校验 `mobile-uni/dist/debug/android_debug.apk` 自定义基座,包括包名、源码版本、`targetSdkVersion`、调试属性、单签名、APK Signature Scheme v2 和 SHA-256。脚本使用 HBuilderX `app-safe-pack` 内的只读 APK 工具;非默认安装目录可通过 `-HBuilderHome` 指定。 该命令默认校验 `mobile-uni/dist/debug/android_debug.apk` 自定义基座,包括包名、源码版本、`targetSdkVersion`、调试属性、单签名、APK Signature Scheme v2 和 SHA-256。脚本使用 HBuilderX `app-safe-pack` 内的只读 APK 工具;非默认安装目录可通过 `-HBuilderHome` 指定。
Android 内测包或正式 RC 必须在同一个 PowerShell 会话注入本次签认的两个公开地址,再生成原生隐私配置、构建 App-Plus 资源并执行联网门禁。当前受控内测技术地址如下;正式发布前仍须由公司法务签认正文: Android 内测包或正式 RC 使用版本化的 `mobile-uni/.env` 保存两个公开法务地址,确保 npm 和 HBuilderX 云打包得到同一配置。地址不是秘密,可由 PowerShell 环境变量覆盖;正式发布前仍须由公司法务签认正文:
```powershell ```powershell
$env:VITE_APP_TERMS_URL = 'https://peilian.njzhmj.top/legal/terms.html'
$env:VITE_APP_PRIVACY_URL = 'https://peilian.njzhmj.top/legal/privacy.html'
Remove-Item Env:VITE_DEV_SMS_HINT_ENABLED -ErrorAction SilentlyContinue Remove-Item Env:VITE_DEV_SMS_HINT_ENABLED -ErrorAction SilentlyContinue
Remove-Item Env:VITE_DEV_SMS_HINT_VALUE -ErrorAction SilentlyContinue Remove-Item Env:VITE_DEV_SMS_HINT_VALUE -ErrorAction SilentlyContinue
npm --prefix mobile-uni run configure:app-privacy npm --prefix mobile-uni run configure:app-legal
npm --prefix mobile-uni run build:app npm --prefix mobile-uni run build:app
npm --prefix mobile-uni run verify:app-release npm --prefix mobile-uni run verify:app-release
``` ```
`configure:app-privacy` 会同时校验 HTTPS、公网域名、两个地址互不相同,并从模板生成被 Git 忽略的 `mobile-uni/src/androidPrivacy.json`;`build:app` 再将其复制到 `dist/build/app/androidPrivacy.json`,并把项目根的 `AndroidManifest.xml` 与 `nativeResources/android/res/xml/network_security_config.xml` 同步到云打包输入目录。源码和编译产物都纳入门禁,避免 npm/Vite CLI 项目把原生配置留在源码但未进入安装包而产生假绿。`verify:app-release` 还会确认: `configure:app-legal` 会校验 HTTPS、公网域名和两个地址互不相同,并从模板生成被 Git 忽略的 `mobile-uni/src/androidPrivacy.json`;其唯一职责是明确 `prompt=none`,不再提供启动原生确认。`build:app` 将该配置复制到 `dist/build/app/androidPrivacy.json`,并把项目根的 `AndroidManifest.xml` 与 `nativeResources/android/res/xml/network_security_config.xml` 同步到云打包输入目录。源码、编译产物和实际 APK 都纳入门禁。兼容别名 `configure:app-privacy` 暂时保留。`verify:app-release` 还会确认:
- 首次与二次隐私弹窗使用同一组地址; - `manifest.json` 使用 `useOriginalMsgbox=false`,`androidPrivacy.json` 使用 `prompt=none`;
- 原生弹窗地址与本次 App 编译使用的 `VITE_APP_TERMS_URL`、`VITE_APP_PRIVACY_URL` 完全一致; - 登录页默认未勾选协议,服务协议与隐私政策链接来自本次 App 编译的 `VITE_APP_TERMS_URL`、`VITE_APP_PRIVACY_URL`;
- 发送验证码和登录均先通过同一个 `ensureLegalConsent()` 门禁;
- 两个页面可通过公网 HTTPS 访问并包含可识别的协议正文; - 两个页面可通过公网 HTTPS 访问并包含可识别的协议正文;
- `VITE_DEV_SMS_HINT_ENABLED` 与 `VITE_DEV_SMS_HINT_VALUE` 均未进入发布环境; - `VITE_DEV_SMS_HINT_ENABLED` 与 `VITE_DEV_SMS_HINT_VALUE` 均未进入发布环境;
- 编译产物不含手机号、固定测试验证码、私钥或常见云端/API 令牌格式。 - 编译产物不含手机号、固定测试验证码、私钥或常见云端/API 令牌格式。
@@ -61,11 +60,11 @@ npm --prefix mobile-uni run verify:app-release
HBuilderX 5.22 当前实测中,自定义调试基座不支持安心打包,新应用也不能再使用公共测试证书;调试基座改用 DCloud 云端证书并通过普通云打包生成,CLI 项目的产物位于 `mobile-uni/dist/debug/android_debug.apk`。该云端证书和调试 APK 不替代企业正式签名资产。 HBuilderX 5.22 当前实测中,自定义调试基座不支持安心打包,新应用也不能再使用公共测试证书;调试基座改用 DCloud 云端证书并通过普通云打包生成,CLI 项目的产物位于 `mobile-uni/dist/debug/android_debug.apk`。该云端证书和调试 APK 不替代企业正式签名资产。
自定义基座 APK 只包含原生调试运行壳,业务 `www` 资源由 HBuilderX 真机运行时另行同步,因此不能要求法务链接出现在基座 APK 内。可直接安装分发的 DCloud 云证书内测包必须使用非自定义基座打包,并用 `dcloud-test` 模式从 APK 内置的 `assets/apps/.../www/androidPrivacy.json` 复核两个地址: 自定义基座 APK 只包含原生调试运行壳,业务 `www` 资源由 HBuilderX 真机运行时另行同步,因此不能要求登录页法务链接出现在基座 APK 内。可直接安装分发的 DCloud 云证书内测包必须使用非自定义基座打包,并用 `dcloud-test` 模式复核包内 `prompt=none`、`app-service.js` 的两个登录页地址和未勾选拦截:
```powershell ```powershell
& '.\mobile-uni\scripts\verify-android-apk.ps1' ` & '.\mobile-uni\scripts\verify-android-apk.ps1' `
-ApkPath '.\mobile-uni\dist\debug\bangdao-0.1.10-dcloud-test.apk' ` -ApkPath '.\mobile-uni\dist\debug\bangdao-0.1.12-dcloud-test.apk' `
-BuildKind dcloud-test -BuildKind dcloud-test
``` ```
@@ -75,13 +74,13 @@ APK 门禁还会比较包内与当前 `dist/build/app/app-service.js` 的 SHA-25
```powershell ```powershell
.\scripts\prepare-aug1-rc.ps1 ` .\scripts\prepare-aug1-rc.ps1 `
-ApkPath '.\mobile-uni\dist\debug\bangdao-0.1.10-dcloud-test.apk' ` -ApkPath '.\mobile-uni\dist\debug\bangdao-0.1.12-dcloud-test.apk' `
-BuildKind dcloud-test -BuildKind dcloud-test
``` ```
脚本会复跑移动端测试/类型检查/H5/App 构建、管理端构建、后端定向测试和打包,验证 APK 后在被 Git 忽略的 `output/aug1-rc/` 生成标准文件名、哈希及 JSON/Markdown 证据。它不执行生产同步、数据库迁移、服务重启或用户隐私选择。 脚本会复跑移动端测试/类型检查/H5/App 构建、管理端构建、后端定向测试和打包,验证 APK 后在被 Git 忽略的 `output/aug1-rc/` 生成标准文件名、哈希及 JSON/Markdown 证据。它不执行生产同步、数据库迁移、服务重启或登录页人工同意操作。
2026-07-28 最终自定义基座大小为 `21,158,193` 字节,SHA-256 为 `82D3352FF96A86F5DB4AC0C71DCB0ED6CEC98F2A785F6EAED2FE8D4FC0C5F704`。2026-07-29 当前独立内测候选包为 `bangdao-0.1.10-dcloud-test.apk`:包名 `com.yincheng.wygj`、版本 `0.1.10 (110)`、`targetSdkVersion=35`,大小 `33,922,134` 字节,SHA-256 为 `20CB16B4E9D024DBF5EEEF577BFBA3B4DF5E5E78B597BABB99CB7450C7AE5034`,签名证书 SHA-256 为 `AB06ECC0DE544DE73C385F3F0690B22966EBC12887FB8BEE1830CDBEFDEBEF5D`。APK 反编译门禁已确认包内业务资源等于当前 App-Plus 编译产物,法务配置、敏感值扫描、`usesCleartextTraffic=false`、`networkSecurityConfig` 引用和系统证书信任配置均通过;本机 Android 15/API 35 虚拟机已从 `0.1.9` 保留数据覆盖升级并在约 `1.271s` 内冷启动,原生隐私弹窗继续显示,四项敏感权限保持未授权且未见 FATAL/ANR。统一 RC 在干净提交 `dc20b920` 上复跑移动端 198/198、`ruoyi-aihr` 698/698 及全部构建/校验门禁,证据为 `output/aug1-rc/0.1.10-110-dc20b920-frozen/`。该包仍使用 DCloud 云端测试证书,只能作为 8 月 1 日受控内测包;企业正式 release 还必须使用签认后的企业证书摘要。 2026-07-28 最终自定义基座大小为 `21,158,193` 字节,SHA-256 为 `82D3352FF96A86F5DB4AC0C71DCB0ED6CEC98F2A785F6EAED2FE8D4FC0C5F704`。2026-07-29 当前独立内测候选包为 `bangdao-0.1.12-dcloud-test.apk`:包名 `com.yincheng.wygj`、版本 `0.1.12 (112)`、`targetSdkVersion=35`,大小 `33,921,458` 字节,SHA-256 为 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`,签名证书 SHA-256 为 `AB06ECC0DE544DE73C385F3F0690B22966EBC12887FB8BEE1830CDBEFDEBEF5D`。APK 反编译门禁确认包内业务资源等于当前 App-Plus 编译产物、启动原生隐私提示已关闭、登录页法务链接与未勾选拦截已进入包体,并通过敏感值、`usesCleartextTraffic=false`、`networkSecurityConfig` 和系统证书信任检查。本机 Android 15/API 35 虚拟机全新安装后确认原生隐私层不可见、四项敏感权限未授权且无 Crash/ANR。统一 RC 在干净提交 `b9e08789` 上复跑移动端 199/199、`ruoyi-aihr` 698/698 及全部构建/校验门禁,证据为 `output/aug1-rc/0.1.12-112-b9e08789-frozen/`。该 x86_64 虚拟机无法可靠运行仅含 ARM ABI 的 DCloud Weex 页面,登录页和业务路径必须改由 ARM64 真机验收。该包仍使用 DCloud 云端测试证书,只能作为 8 月 1 日受控内测包;企业正式 release 还必须使用签认后的企业证书摘要。
企业正式签名 APK 还必须用发布负责人保管的证书摘要执行 release 模式核验;该模式会额外拒绝 `debuggable=true`、明文 HTTP 和签名摘要不一致: 企业正式签名 APK 还必须用发布负责人保管的证书摘要执行 release 模式核验;该模式会额外拒绝 `debuggable=true`、明文 HTTP 和签名摘要不一致:
@@ -94,7 +93,7 @@ APK 门禁还会比较包内与当前 `dist/build/app/app-service.js` 的 SHA-25
## 发布前尚需提供的资产 ## 发布前尚需提供的资产
- 当前受控内测版《服务协议》《隐私政策》已部署到 `https://peilian.njzhmj.top/legal/`,服务器发布前备份为 `/opt/wygj/backups/www-20260728224710`;仍需公司法务对正文、处理者信息、第三方清单和保存期限正式签认。Android 已用实际链接配置原生 template 隐私弹窗,iOS 仍需在后续出包时复核相应的麦克风、相机、相册/文件用途说明。 - 当前受控内测版《服务协议》《隐私政策》已部署到 `https://peilian.njzhmj.top/legal/`,服务器发布前备份为 `/opt/wygj/backups/www-20260728224710`;仍需公司法务对正文、处理者信息、第三方清单和保存期限正式签认。Android 登录页已使用实际链接且启动不再弹出原生确认;iOS 仍需在后续出包时复核相应的麦克风、相机、相册/文件用途说明。
- 无透明通道的 1024×1024 App Store 图标,以及 Android 自适应图标/启动图。 - 无透明通道的 1024×1024 App Store 图标,以及 Android 自适应图标/启动图。
- 企业持有的 Android 签名证书、Apple Team、Bundle ID 注册与 iOS 发布证书。上述资产缺失时可以完成代码与真机调试,不能声称已具备商店上架条件。 - 企业持有的 Android 签名证书、Apple Team、Bundle ID 注册与 iOS 发布证书。上述资产缺失时可以完成代码与真机调试,不能声称已具备商店上架条件。
@@ -102,7 +101,7 @@ APK 门禁还会比较包内与当前 `dist/build/app/app-service.js` 的 SHA-25
- 图标和启动图由 `scripts/generate-app-assets.sh` 从现有 `src/static/brand-logo.png` 生成,输出位于 `src/static/app/`,并由 `manifest.json` 显式关联。iOS App Store 图标为 1024×1024、无 alpha、未预制圆角;生成后可用 `npm --prefix mobile-uni run verify:app-assets` 校验尺寸和映射。 - 图标和启动图由 `scripts/generate-app-assets.sh` 从现有 `src/static/brand-logo.png` 生成,输出位于 `src/static/app/`,并由 `manifest.json` 显式关联。iOS App Store 图标为 1024×1024、无 alpha、未预制圆角;生成后可用 `npm --prefix mobile-uni run verify:app-assets` 校验尺寸和映射。
- 现有品牌源图仅为 64×64,因此这里生成的是**可用于自定义基座和测试包的派生资产**。正式提交商店前应替换为品牌方提供的高分辨率母版,再重新执行生成和预检。 - 现有品牌源图仅为 64×64,因此这里生成的是**可用于自定义基座和测试包的派生资产**。正式提交商店前应替换为品牌方提供的高分辨率母版,再重新执行生成和预检。
- `androidPrivacy.json.example` 是法务配置模板,其中 `__TERMS_URL__` 与 `__PRIVACY_URL__` 只能由生成器替换。不要手工复制或改写;按“本地验证与出包”设置两个 `VITE_APP_*` 环境变量并执行 `configure:app-privacy`,确保原生弹窗、登录页和发布门禁使用同一组地址。生成文件被 Git 忽略,模板和校验逻辑才是版本化事实源。 - `androidPrivacy.json.example` 是原生提示策略模板,固定 `prompt=none`;生成文件被 Git 忽略,模板和校验逻辑才是版本化事实源。两个公开法务 URL 的版本化事实源是 `mobile-uni/.env`,`configure:app-legal` 会校验它们,登录页和 APK 门禁必须使用同一组地址。
- iOS 已按实际功能填写麦克风和照片库用途说明;不申请相机、定位、通讯录、蓝牙或广告追踪权限。 - iOS 已按实际功能填写麦克风和照片库用途说明;不申请相机、定位、通讯录、蓝牙或广告追踪权限。
- `build:app` 依赖 `@dcloudio/uni-app-plus`,它必须与 `@dcloudio/uni-app`、`@dcloudio/uni-h5`、`@dcloudio/vite-plugin-uni` 同版本。缺少 App 编译器时命令**不报错**,只静默产出带 `/h5/` 基路径的 H5 空壳,产物里没有 `app-service.js` 与 `app-renderjs.js`,App 平台代码等于从未编译。判定 `build:app` 是否真的成功要看产物中是否存在 `app-service.js`、`app-renderjs.js`、`manifest.json`,不能只看 `DONE Build complete.`。 - `build:app` 依赖 `@dcloudio/uni-app-plus`,它必须与 `@dcloudio/uni-app`、`@dcloudio/uni-h5`、`@dcloudio/vite-plugin-uni` 同版本。缺少 App 编译器时命令**不报错**,只静默产出带 `/h5/` 基路径的 H5 空壳,产物里没有 `app-service.js` 与 `app-renderjs.js`,App 平台代码等于从未编译。判定 `build:app` 是否真的成功要看产物中是否存在 `app-service.js`、`app-renderjs.js`、`manifest.json`,不能只看 `DONE Build complete.`。
- App-Plus 实时对练通过 `renderjs` 在系统 WebView 中执行媒体/WebRTC;认证 SDP 与工具请求仍由逻辑层代理。发布前必须在 Android/iOS 真机验证麦克风授权、实时转写、远端语音播放、前后台切换和断线降级。 - App-Plus 实时对练通过 `renderjs` 在系统 WebView 中执行媒体/WebRTC;认证 SDP 与工具请求仍由逻辑层代理。发布前必须在 Android/iOS 真机验证麦克风授权、实时转写、远端语音播放、前后台切换和断线降级。
@@ -1,6 +1,6 @@
# 帮道 8 月 1 日 Android 内测 Go/No-Go # 帮道 8 月 1 日 Android 内测 Go/No-Go
> 评估时间:2026-07-29 03:42(CST) > 评估时间:2026-07-29 10:31(CST)
> >
> 评估对象:2026-08-01 受控内部测试 APK,不代表正式发布、应用商店上架或阶段一严格试点验收。 > 评估对象:2026-08-01 受控内部测试 APK,不代表正式发布、应用商店上架或阶段一严格试点验收。
> >
@@ -16,18 +16,18 @@
| 检查项 | 当前结果 | | 检查项 | 当前结果 |
|---|---| |---|---|
| 双提交冻结 | 运行时提交 `dc20b92061f10a356ed73eb105ef7b00c8b8a617` 的 APK/JAR 保持不变,统一 RC 证据 `releaseEligible=true`;后续仅以独立 operations commit 冻结发布、回滚、API 探针和 Android 取证工具。双提交打包器重新核对提交祖先关系与三项载荷哈希,旧 ZIP 不覆盖 | | 当前运行时冻结 | 移动端候选提交 `b9e08789265b73524e3ce2646abe2f2fc4565906` 的统一 RC 证据 `releaseEligible=true`,目录 `output/aug1-rc/0.1.12-112-b9e08789-frozen/`;前一 `dc20b920` 双提交包只保留追溯,不能再作为当前 APK |
| 移动端自动化 | 198 项单元测试通过;TypeScript 类型检查通过;五个文件选择器和九个消费页面已覆盖用户取消/平台失败分流,直通车首次弱网加载失败可原位重试并失败关闭 | | 移动端自动化 | 199 项单元测试通过;TypeScript 类型检查通过;登录页协议默认未勾选,法务链接、验证码和登录共用失败关闭门禁;五个文件选择器和九个消费页面已覆盖用户取消/平台失败分流,直通车首次弱网加载失败可原位重试并失败关闭 |
| 构建 | `mobile-uni` H5、App-Plus、管理端生产构建通过;后端 `ruoyi-admin.jar` 重建通过 | | 构建 | `mobile-uni` H5、App-Plus、管理端生产构建通过;后端 `ruoyi-admin.jar` 重建通过 |
| P0 后端语义 | `AihrSopSeedServiceTest` 39 项、`AihrPracticeSeedServiceTest` 102 项通过;`ruoyi-aihr` 698 项全量测试通过,0 失败、0 错误 | | P0 后端语义 | `AihrSopSeedServiceTest` 39 项、`AihrPracticeSeedServiceTest` 102 项通过;`ruoyi-aihr` 698 项全量测试通过,0 失败、0 错误 |
| 内容候选门禁 | 已生成 5 个禁用场景候选和 30 道待审政策题,机器校验通过;正式可发布场景 `0`、正式有据标准答案 `0`,不得导入或启用 | | 内容候选门禁 | 已生成 5 个禁用场景候选和 30 道待审政策题,机器校验通过;正式可发布场景 `0`、正式有据标准答案 `0`,不得导入或启用 |
| App 资源门禁 | 正式法务 URL、原生隐私配置、API 35、图标和启动图检查通过 | | App 资源门禁 | 正式法务 URL、登录页同意门禁、原生 `prompt=none`、API 35、图标和启动图检查通过 |
| 独立 APK | `com.yincheng.wygj`,`0.1.10 (110)`,`targetSdkVersion=35`,v2 签名,明文 HTTP 关闭且网络安全资源已进入 APK;SHA-256 `20CB16B4E9D024DBF5EEEF577BFBA3B4DF5E5E78B597BABB99CB7450C7AE5034` | | 独立 APK | `com.yincheng.wygj`,`0.1.12 (112)`,`targetSdkVersion=35`,v2 签名,明文 HTTP 关闭且网络安全资源已进入 APK;SHA-256 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB` |
| APK 内容门禁 | 包内业务资源等于当前 App-Plus 编译产物;法务链接、手机号、固定测试验证码、私钥和常见令牌扫描通过 | | APK 内容门禁 | 包内业务资源等于当前 App-Plus 编译产物;原生提示关闭、登录法务链接、未勾选拦截、手机号、固定测试验证码、私钥和常见令牌扫描通过 |
| 真机安装启动 | vivo V2443A(Android 15)完成 `0.1.6` 覆盖安装和冷启动;相机、录音、媒体权限保持未授权,未见 `FATAL EXCEPTION` | | 真机安装启动 | vivo V2443A(Android 15)完成 `0.1.6` 覆盖安装和冷启动;相机、录音、媒体权限保持未授权,未见 `FATAL EXCEPTION` |
| 虚拟机安装与生命周期 | 本机 `Medium_Phone` Android 15/API 35 已完成历史卸载重装、同版本覆盖及冷/暖/热启动,并从 `0.1.9` 保留数据升级到 `0.1.10`;新包冷启动 `1.271s`,原生隐私弹窗与四项未授权状态保持,未见 FATAL/ANR | | 虚拟机安装与生命周期 | 本机 `Medium_Phone` Android 15/API 35 已全新安装 `0.1.12`;启动原生隐私层不可见、四项敏感权限为 `false`、未见 Crash/ANR。该 x86_64 虚拟机无法可靠运行 ARM-only DCloud Weex 页面,不能替代页面与业务验收 |
| Android 统一取证 | 新增只读脚本并通过状态变更命令回归;实跑确认前台原生隐私弹窗标题与拒绝/同意按钮可见、登录不可见、四项敏感权限为 `false`、退出记录无 Crash/ANR,证据在忽略目录 `output/aug1-rc/android-acceptance/` | | Android 统一取证 | 只读脚本确认 `0.1.12 (112)` 进程和前台 Activity 正常、原生隐私层 `not-visible`、四项敏感权限为 `false`、退出记录无 Crash/ANR,证据在 `output/aug1-rc/android-acceptance/20260729-021418-no-native-privacy-fresh-install-retry/` |
| 首次隐私弹窗 | 最新包已在虚拟机干净启动显示原生弹窗;前一候选包的两个 HTTPS 链接已在 vivo 系统浏览器打开,仍需用户亲自执行拒绝/同意反例 | | 登录页法务策略 | 启动不再弹原生确认;登录页协议默认未勾选,两个 HTTPS 正文可点击,验证码与登录在未勾选时失败关闭。包体与自动化已通过,ARM64 真机点击反例仍待完成 |
| 法务静态页 | `https://peilian.njzhmj.top/legal/terms.html` 与 `https://peilian.njzhmj.top/legal/privacy.html` 已部署并可访问;发布前站点备份为 `/opt/wygj/backups/www-20260728224710` | | 法务静态页 | `https://peilian.njzhmj.top/legal/terms.html` 与 `https://peilian.njzhmj.top/legal/privacy.html` 已部署并可访问;发布前站点备份为 `/opt/wygj/backups/www-20260728224710` |
| 生产 API 只读契约 | 线上与候选包的 9 个关键控制器 class 哈希逐一相同,短信登录、移动首页、查/练/问、直通车和 ASR/TTS 路由均存在;可重复 GET-only 探针覆盖 20 个 APK 入口,得到公开首页 `1×200`、鉴权入口 `6×401`、仅 POST 入口 `13×405`。`answer-feedback` 因同路径另有运营 GET 归入鉴权组;脚本排除短信验证码,不登录、不上传、不发送业务 POST | | 生产 API 只读契约 | 线上与候选包的 9 个关键控制器 class 哈希逐一相同,短信登录、移动首页、查/练/问、直通车和 ASR/TTS 路由均存在;可重复 GET-only 探针覆盖 20 个 APK 入口,得到公开首页 `1×200`、鉴权入口 `6×401`、仅 POST 入口 `13×405`。`answer-feedback` 因同路径另有运营 GET 归入鉴权组;脚本排除短信验证码,不登录、不上传、不发送业务 POST |
| 定向发布预检 | `566f222e` 已支持只核对后端 + schema;`feece9bb` 进一步允许以冻结提交和解压后的候选 JAR 为准。两次实际只读运行均跳过管理端/H5,根站、租户、移动首页和生产禁 DDL 门禁通过;后端 + schema 模式另通过 64/64 schema。冻结物模式确认本地 JAR SHA-256 为 `8c676f2f…`,最终均仅因现网/候选模块哈希 `15f5513a…` / `c93460e8…` 不同而按预期失败 | | 定向发布预检 | `566f222e` 已支持只核对后端 + schema;`feece9bb` 进一步允许以冻结提交和解压后的候选 JAR 为准。两次实际只读运行均跳过管理端/H5,根站、租户、移动首页和生产禁 DDL 门禁通过;后端 + schema 模式另通过 64/64 schema。冻结物模式确认本地 JAR SHA-256 为 `8c676f2f…`,最终均仅因现网/候选模块哈希 `15f5513a…` / `c93460e8…` 不同而按预期失败 |
@@ -36,7 +36,7 @@
## No-Go 阻断项 ## No-Go 阻断项
1. **生产接口兼容,但候选后端语义修复未部署。** 只读预检确认生产根站、租户接口、移动首页和 64/64 schema 门禁通过;线上与候选 `ruoyi-aihr` 都有 819 个非目录/非 Manifest 条目,0 个增删、775 个逐字节相同、44 个不同。9 个关键控制器及其路由逐字节一致,差异只落在 `AihrModelSeedService`、`AihrPracticeSeedService`、`AihrSopSeedService` 及编译生成的内部类:候选包补了“不得冒充已创建/派发工单”的兜底文案,以及场景发布前的占位内容/五维评分门禁。因此现网可以承接 APK 的既有接口,但尚不满足本次候选的业务语义红线,仍需获得授权后定向发布后端。管理端和移动 H5 入口资源也与候选不一致,但不属于独立 APK 本轮必发单元;schema 本批不变。此次仅上线法务静态页,未发布后端、H5 业务资源或数据库迁移。 1. **生产接口兼容,但候选后端语义修复未部署。** 只读预检确认生产根站、租户接口、移动首页和 64/64 schema 门禁通过;线上与候选 `ruoyi-aihr` 都有 819 个非目录/非 Manifest 条目,0 个增删、775 个逐字节相同、44 个不同。9 个关键控制器及其路由逐字节一致,差异只落在 `AihrModelSeedService`、`AihrPracticeSeedService`、`AihrSopSeedService` 及编译生成的内部类:候选包补了“不得冒充已创建/派发工单”的兜底文案,以及场景发布前的占位内容/五维评分门禁。因此现网可以承接 APK 的既有接口,但尚不满足本次候选的业务语义红线,仍需获得授权后定向发布后端。管理端和移动 H5 入口资源也与候选不一致,但不属于独立 APK 本轮必发单元;schema 本批不变。此次仅上线法务静态页,未发布后端、H5 业务资源或数据库迁移。
2. **原生人工反例未完成。** 覆盖升级和冷启动已通过,媒体取消状态机已自动化修复;仍缺用户亲自执行的同意/拒绝、拒绝后退出、同意后登录、短信失败与重新登录、麦克风允许/拒绝、真实系统选择器取消、登录后前后台切换和弱网验证。 2. **原生人工反例未完成。** 全新安装、无启动原生隐私提示和权限基线已通过,媒体取消状态机已自动化修复;仍缺 ARM64 真机上的登录页协议默认未勾选、两个链接、未勾选拦截、勾选后登录、短信失败与重新登录、麦克风允许/拒绝、真实系统选择器取消、登录后前后台切换和弱网验证。
3. **核心业务真机闭环未完成。** 仍缺认证账号下完整“查/练/问”、五个直通渠道、五个正式对练场景、ASR/TTS、附件上传下载和越权反例。 3. **核心业务真机闭环未完成。** 仍缺认证账号下完整“查/练/问”、五个直通渠道、五个正式对练场景、ASR/TTS、附件上传下载和越权反例。
4. **内容与业务验收不足。** 当前仅收到 1/24 份生活顾问访谈。技术侧已把调研整理为 30 道政策题候选和 5 个场景候选,但全部保持待审/禁用,正式可发布场景和正式有据标准答案仍为 0/0;五渠道真实处理人也没有业务签认证据。 4. **内容与业务验收不足。** 当前仅收到 1/24 份生活顾问访谈。技术侧已把调研整理为 30 道政策题候选和 5 个场景候选,但全部保持待审/禁用,正式可发布场景和正式有据标准答案仍为 0/0;五渠道真实处理人也没有业务签认证据。
5. **发布与回滚尚未签认。** 固定目标、默认只读、显式授权、备份、原子切换、失败恢复和并发保护的后端工具已经落地,冻结候选的只读发布计划也已通过;但尚无负责人发布授权、实际发布后匹配结果或回滚演练记录。当前 APK 已关闭明文流量但仍使用 DCloud 测试证书,只能用于受控内测;企业签名和公司法务正式签认仍是正式发布门槛。 5. **发布与回滚尚未签认。** 固定目标、默认只读、显式授权、备份、原子切换、失败恢复和并发保护的后端工具已经落地,冻结候选的只读发布计划也已通过;但尚无负责人发布授权、实际发布后匹配结果或回滚演练记录。当前 APK 已关闭明文流量但仍使用 DCloud 测试证书,只能用于受控内测;企业签名和公司法务正式签认仍是正式发布门槛。
@@ -45,11 +45,11 @@
| 顺序 | 必须完成 | 验收证据 | | 顺序 | 必须完成 | 验收证据 |
|---|---|---| |---|---|---|
| 已完成 | 确定 APK、后端、管理端/H5、数据库四个发布单元,并分别冻结运行时与运维工具 | 运行时 `dc20b920`、`releaseEligible=true`、`output/aug1-rc/0.1.10-110-dc20b920-frozen/`;双提交 ZIP 必须包含运行时/运维完整提交、14 个条目和内部 `SHA256SUMS.txt`,外层 ZIP 哈希记录在任务计划与变更记录中 | | 已完成 | 确定 APK、后端、管理端/H5、数据库四个发布单元并冻结当前 APK 运行时 | 运行时 `b9e08789`、`releaseEligible=true`、`output/aug1-rc/0.1.12-112-b9e08789-frozen/`;新的双提交 ZIP 仍须包含运行时/运维完整提交、14 个条目和内部 `SHA256SUMS.txt`,旧 `0.1.10` ZIP 只保留追溯 |
| 1 | 获得明确授权后使用已通过只读计划的 `release-backend.sh deploy`,只发布上述 3 个服务类语义修复所在的候选后端 JAR;管理端/H5 延期,schema 本批不变;不得手工覆盖或绕过脚本失败恢复 | 候选 JAR SHA-256 `8C676F2FBFCCB4F4573CBCA1259E8B26EB83EBDB469ADCBAF714C5931EF3CF2D`;输出备份目录,生产 `ruoyi-aihr` 模块与候选匹配,64/64 schema 继续通过,兜底回答不显示已创建/已派发状态 | | 1 | 获得明确授权后使用已通过只读计划的 `release-backend.sh deploy`,只发布上述 3 个服务类语义修复所在的候选后端 JAR;管理端/H5 延期,schema 本批不变;不得手工覆盖或绕过脚本失败恢复 | 候选 JAR SHA-256 `8C676F2FBFCCB4F4573CBCA1259E8B26EB83EBDB469ADCBAF714C5931EF3CF2D`;输出备份目录,生产 `ruoyi-aihr` 模块与候选匹配,64/64 schema 继续通过,兜底回答不显示已创建/已派发状态 |
| 2 | 用户在已连接 Android 手机上完成隐私选择和权限正反例 | 设备、包版本、步骤、结果;不记录手机号、验证码和个人内容 | | 2 | 用户在 ARM64 Android 真机完成登录页法务门禁和权限正反例 | 默认未勾选、两个链接、未勾选拦截、勾选后登录、权限允许/拒绝;不记录手机号、验证码和个人内容 |
| 3 | 用正式测试账号完成“查/练/问”、五直通渠道及附件/语音闭环 | 每条用例的时间、结果、失败截图或日志 | | 3 | 用正式测试账号完成“查/练/问”、五直通渠道及附件/语音闭环 | 每条用例的时间、结果、失败截图或日志 |
| 4 | 业务方审核当前 30 道题和 5 个场景候选,补齐正式来源并签认五渠道处理人 | 审核单、正式内容版本、授权矩阵;正式可发布计数从 0/0 提升到至少 5/30 | | 4 | 业务方审核当前 30 道题和 5 个场景候选,补齐正式来源并签认五渠道处理人 | 审核单、正式内容版本、授权矩阵;正式可发布计数从 0/0 提升到至少 5/30 |
| 5 | 7 月 31 日复跑安装、升级、回滚和完整 Go/No-Go | RC APK 哈希、签认人、回滚点、最终结论 | | 5 | 7 月 31 日复跑安装、升级、回滚和完整 Go/No-Go | RC APK 哈希、签认人、回滚点、最终结论 |
公司法务签认与企业签名可在负责人明确接受“仅限小范围受控内部测试”的前提下不阻断技术验收,但不能省略隐私选择、权限反例、版本冻结、生产依赖匹配和核心业务闭环。 公司法务签认与企业签名可在负责人明确接受“仅限小范围受控内部测试”的前提下不阻断技术验收,但不能省略登录页协议门禁、权限反例、版本冻结、生产依赖匹配和核心业务闭环。
@@ -102,11 +102,13 @@
| 工单边界后端定向测试 | 通过 | 39 个测试,0 失败、0 错误 | | 工单边界后端定向测试 | 通过 | 39 个测试,0 失败、0 错误 |
| `ruoyi-aihr` 后端全量测试 | 通过 | 698 个测试,0 失败、0 错误;包含正式场景占位来源/回合/Rubric 禁止发布的新增回归;Windows CRLF 引发的 7 个源码契约误判已通过读取时统一 LF 修复并全量复跑 | | `ruoyi-aihr` 后端全量测试 | 通过 | 698 个测试,0 失败、0 错误;包含正式场景占位来源/回合/Rubric 禁止发布的新增回归;Windows CRLF 引发的 7 个源码契约误判已通过读取时统一 LF 修复并全量复跑 |
| 法务配置技术链路 | 通过 | 登录协议默认不勾选;协议未配置时禁止验证码与登录;配置生成器和发布联网校验已接入,发布包拒绝开发验证码提示 | | 法务配置技术链路 | 通过 | 登录协议默认不勾选;协议未配置时禁止验证码与登录;配置生成器和发布联网校验已接入,发布包拒绝开发验证码提示 |
| 正式 App 发布配置校验 | **技术通过,法务签认阻断** | 受控内测版协议正文已通过 Caddy 公网 HTTPS 发布,原生弹窗、登录页和联网门禁使用同一组地址;公司法务尚未正式签认正文,不能视为正式发布通过 | | 正式 App 发布配置校验 | **技术通过,法务签认阻断** | 受控内测版协议正文已通过 Caddy 公网 HTTPS 发布;启动原生提示关闭,登录页协议默认未勾选且验证码/登录失败关闭,包体与联网门禁使用同一组地址。公司法务尚未正式签认正文,不能视为正式发布通过 |
| Android 设备、调试基座、测试签名和真机门禁 | **部分通过,仍阻断** | HBuilderX 5.22 已识别 vivo V2443A(Android 15);API 35 自定义基座和可独立安装的 DCloud 云证书内测 APK 均已生成。`0.1.10` 在 Android 15 虚拟机完成从 `0.1.9` 保留数据升级、冷启动并保持原生隐私弹窗和四项敏感权限未授权;媒体选择取消与直通车首次弱网恢复状态机已自动化修复。用户同意/拒绝、登录后录音允许/拒绝、真实系统选择器取消、真实断网恢复和完整反例仍未通过 | | Android 设备、调试基座、测试签名和真机门禁 | **部分通过,仍阻断** | HBuilderX 5.22 已识别 vivo V2443A(Android 15);API 35 自定义基座和可独立安装的 DCloud 云证书内测 APK 均已生成。`0.1.12` 在 Android 15 虚拟机全新安装后确认无原生隐私提示、四项敏感权限未授权且无 Crash/ANR;媒体选择取消与直通车首次弱网恢复状态机已自动化修复。该虚拟机为 x86_64,不能完成 ARM-only DCloud 页面验收;登录页法务门禁、录音允许/拒绝、真实系统选择器取消、真实断网恢复和完整业务反例仍需 ARM64 真机 |
统一 RC 脚本已在干净运行时提交 `dc20b92061f10a356ed73eb105ef7b00c8b8a617` 上完整复跑,证据目录为 `output/aug1-rc/0.1.10-110-dc20b920-frozen/`,结果为 `releaseEligible=true`。发布/回滚、API 探针和可识别隐私二次确认/退出态的 Android 取证工具另冻结在 operations commit `71f005c22981989c5f2b24fa31c385a1b82657b7`。当前双提交交付包为 `output/aug1-release/bangdao-aug1-0.1.10-110-dc20b920-ops71f005c2.zip`,大小 `192,926,422` 字节,SHA-256 为 `4391895420B50EBBD8CB87EA20AF71A70D5DABAD5003F5361A8B034CF7525BCA`;已完成 14 个 ZIP 条目和 13 个 `SHA256SUMS.txt` 载荷的逐条复验。旧无 operations 后缀包、`ops861fa0ea` 与 `ops414af66e` 包保留作追溯但均已被替代。上述本地自动化冻结不替代生产后端发布授权和人工验收。 统一 RC 脚本已在干净运行时提交 `dc20b92061f10a356ed73eb105ef7b00c8b8a617` 上完整复跑,证据目录为 `output/aug1-rc/0.1.10-110-dc20b920-frozen/`,结果为 `releaseEligible=true`。发布/回滚、API 探针和可识别隐私二次确认/退出态的 Android 取证工具另冻结在 operations commit `71f005c22981989c5f2b24fa31c385a1b82657b7`。当前双提交交付包为 `output/aug1-release/bangdao-aug1-0.1.10-110-dc20b920-ops71f005c2.zip`,大小 `192,926,422` 字节,SHA-256 为 `4391895420B50EBBD8CB87EA20AF71A70D5DABAD5003F5361A8B034CF7525BCA`;已完成 14 个 ZIP 条目和 13 个 `SHA256SUMS.txt` 载荷的逐条复验。旧无 operations 后缀包、`ops861fa0ea` 与 `ops414af66e` 包保留作追溯但均已被替代。上述本地自动化冻结不替代生产后端发布授权和人工验收。
2026-07-29 根据企业内部应用体验决策,当前候选升级为 `0.1.12 (112)`,取消启动原生隐私确认,法务同意统一由登录页协议勾选承担。干净提交 `b9e08789265b73524e3ce2646abe2f2fc4565906` 的统一 RC 证据位于 `output/aug1-rc/0.1.12-112-b9e08789-frozen/`,结果为 `releaseEligible=true`;移动端 199 项、`ruoyi-aihr` 698 项及全部构建、APK 门禁通过。APK 大小 `33,921,458` 字节,SHA-256 为 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`。前述 `0.1.10` 双提交包仅保留追溯,不能再作为当前 APK 分发。
生活顾问调研已转成 `docs/content-candidates/aug1-life-advisor-content-candidates-v0.1.json`:包含 5 个禁用场景候选和 30 道待审政策题,内容候选校验脚本通过。由于当前只收到 1/24 份访谈,且正式来源、业务审核和 Rubric 签认尚未完成,正式可发布场景与正式有据标准答案均为 `0`;交付包中的候选文件只供审核,不得直接导入或启用。 生活顾问调研已转成 `docs/content-candidates/aug1-life-advisor-content-candidates-v0.1.json`:包含 5 个禁用场景候选和 30 道待审政策题,内容候选校验脚本通过。由于当前只收到 1/24 份访谈,且正式来源、业务审核和 Rubric 签认尚未完成,正式可发布场景与正式有据标准答案均为 `0`;交付包中的候选文件只供审核,不得直接导入或启用。
### 3.3 Android 真机预检快照(2026-07-28) ### 3.3 Android 真机预检快照(2026-07-28)
@@ -123,14 +125,14 @@
- `configure:app-privacy` 已修正为写入 uni-app CLI 输入目录 `mobile-uni/src/androidPrivacy.json`,并同时核对 `dist/build/app/androidPrivacy.json`;APK 门禁区分“只含原生运行壳的自定义基座”和“内置业务资源的独立测试包”,避免再以 DCloud 默认空链接产生假绿。 - `configure:app-privacy` 已修正为写入 uni-app CLI 输入目录 `mobile-uni/src/androidPrivacy.json`,并同时核对 `dist/build/app/androidPrivacy.json`;APK 门禁区分“只含原生运行壳的自定义基座”和“内置业务资源的独立测试包”,避免再以 DCloud 默认空链接产生假绿。
- 2026-07-28 23:12 生成的独立 DCloud 云证书内测 APK 位于 `mobile-uni/dist/debug/bangdao-0.1.5-dcloud-test.apk`,大小 `33,920,950` 字节,SHA-256 为 `AB634EB9A9F0939804151ED14815484FBD75DFE36CC24DF00EC23BDD762D8FD1`。脚本已验证包名、`0.1.5 (105)`、API 35、非调试、单签名、v2 签名和包内两个法务地址。 - 2026-07-28 23:12 生成的独立 DCloud 云证书内测 APK 位于 `mobile-uni/dist/debug/bangdao-0.1.5-dcloud-test.apk`,大小 `33,920,950` 字节,SHA-256 为 `AB634EB9A9F0939804151ED14815484FBD75DFE36CC24DF00EC23BDD762D8FD1`。脚本已验证包名、`0.1.5 (105)`、API 35、非调试、单签名、v2 签名和包内两个法务地址。
- 该内测 APK 已在 vivo V2443A 完成同签名覆盖安装;只清除本 App 测试数据后,以系统 Launcher Activity 干净启动,原生 template 隐私弹窗真实显示,服务协议与隐私政策链接均通过 vivo 系统浏览器打开线上正文,未见 `FATAL EXCEPTION`。验收过程未代替用户点击同意或拒绝。 - 该内测 APK 已在 vivo V2443A 完成同签名覆盖安装;只清除本 App 测试数据后,以系统 Launcher Activity 干净启动,原生 template 隐私弹窗真实显示,服务协议与隐私政策链接均通过 vivo 系统浏览器打开线上正文,未见 `FATAL EXCEPTION`。验收过程未代替用户点击同意或拒绝。
- 2026-07-29 当前候选包升级为 `0.1.6 (106)`,位于 `mobile-uni/dist/debug/bangdao-0.1.6-dcloud-test.apk`,大小 `33,921,279` 字节,SHA-256 为 `A5F026B70F11327355597B9FEA3625C4168700297E6D7847F10B079CEB860914`。登录页法务校验已移除 App-Plus 不保证支持的浏览器 `URL` 构造器,测试验证码不再以源码常量进入包内;APK 反编译门禁已确认包内业务资源等于当前编译产物,并通过法务链接、签名和敏感值扫描。 - 2026-07-29 当时候选包升级为 `0.1.6 (106)`,位于 `mobile-uni/dist/debug/bangdao-0.1.6-dcloud-test.apk`,大小 `33,921,279` 字节,SHA-256 为 `A5F026B70F11327355597B9FEA3625C4168700297E6D7847F10B079CEB860914`。登录页法务校验已移除 App-Plus 不保证支持的浏览器 `URL` 构造器,测试验证码不再以源码常量进入包内;APK 反编译门禁已确认包内业务资源等于当时编译产物,并通过法务链接、签名和敏感值扫描。
- `0.1.6 (106)` 已在同一设备完成保留数据的覆盖安装和 Launcher 冷启动;相机、录音和媒体权限保持未授权,未见 `FATAL EXCEPTION`。覆盖安装保留了前一版本的隐私状态,因此最新包的拒绝/同意反例仍须由用户亲自执行。 - `0.1.6 (106)` 已在同一设备完成保留数据的覆盖安装和 Launcher 冷启动;相机、录音和媒体权限保持未授权,未见 `FATAL EXCEPTION`。覆盖安装保留了前一版本的隐私状态,因此最新包的拒绝/同意反例仍须由用户亲自执行。
- 本机 Android Studio `Medium_Phone` 虚拟机已启动为 Android 15/API 35(`1080×2400`、密度 `420`)。在此前未安装本应用的虚拟机上,`0.1.6 (106)` 首次安装和 Launcher 冷启动成功,最新包真实显示原生隐私弹窗,四项相机、录音、图片和视频权限均未授予,crash 缓冲区为空。虚拟机只补充干净安装和 API 35 权限基线,不替代真机媒体、WebRTC、弱网与系统浏览器验收;拒绝/同意仍由用户亲自执行。 - 本机 Android Studio `Medium_Phone` 虚拟机已启动为 Android 15/API 35(`1080×2400`、密度 `420`)。在此前未安装本应用的虚拟机上,`0.1.6 (106)` 首次安装和 Launcher 冷启动成功,最新包真实显示原生隐私弹窗,四项相机、录音、图片和视频权限均未授予,crash 缓冲区为空。虚拟机只补充干净安装和 API 35 权限基线,不替代真机媒体、WebRTC、弱网与系统浏览器验收;拒绝/同意仍由用户亲自执行。
- `0.1.8 (108)` 进一步把 Android 原生清单和 `network_security_config.xml` 纳入 App 构建链及 APK 反编译门禁。独立内测 APK 大小 `33,921,705` 字节,SHA-256 为 `E252140645F3AAD14B3594FD78E76BDF1A2122F7DC70EBD21CC5DF53223C7878`;APK 反编译确认 `usesCleartextTraffic=false`、`networkSecurityConfig` 引用和系统证书信任配置均已进入安装包,本机虚拟机卸载旧实例后全新安装并在 `2.904s` 内冷启动,最新隐私弹窗真实显示,四项敏感权限未授予且 crash 缓冲区为空。 - `0.1.8 (108)` 进一步把 Android 原生清单和 `network_security_config.xml` 纳入 App 构建链及 APK 反编译门禁。独立内测 APK 大小 `33,921,705` 字节,SHA-256 为 `E252140645F3AAD14B3594FD78E76BDF1A2122F7DC70EBD21CC5DF53223C7878`;APK 反编译确认 `usesCleartextTraffic=false`、`networkSecurityConfig` 引用和系统证书信任配置均已进入安装包,本机虚拟机卸载旧实例后全新安装并在 `2.904s` 内冷启动,最新隐私弹窗真实显示,四项敏感权限未授予且 crash 缓冲区为空。
- 同一 `0.1.8` APK 随后在虚拟机完成保留数据的覆盖安装:覆盖后冷启动 `3.092s`、标准 Launcher Intent 暖启动 `0.538s`、切到系统桌面再恢复热启动 `0.120s`;三次均回到 `PandoraEntryActivity`,隐私弹窗保持可见,四项权限仍为 `granted=false`,未发现 FATAL 或 ANR。该证据只完成安装与首次弹窗前的生命周期基线,未代替用户选择隐私选项。 - 同一 `0.1.8` APK 随后在虚拟机完成保留数据的覆盖安装:覆盖后冷启动 `3.092s`、标准 Launcher Intent 暖启动 `0.538s`、切到系统桌面再恢复热启动 `0.120s`;三次均回到 `PandoraEntryActivity`,隐私弹窗保持可见,四项权限仍为 `granted=false`,未发现 FATAL 或 ANR。该证据只完成安装与首次弹窗前的生命周期基线,未代替用户选择隐私选项。
- 针对 Android 系统文件选择器“用户取消”被误判为上传或转写失败的问题,五个选择服务已统一结构化取消信号,九个页面在取消时恢复空闲态并清理残留“转写中”;真实错误仍显示稳定中文。自动化已覆盖该状态机,但真实系统选择器取消仍须人工点击确认。 - 针对 Android 系统文件选择器“用户取消”被误判为上传或转写失败的问题,五个选择服务已统一结构化取消信号,九个页面在取消时恢复空闲态并清理残留“转写中”;真实错误仍显示稳定中文。自动化已覆盖该状态机,但真实系统选择器取消仍须人工点击确认。
- `0.1.10 (110)` DCloud 独立内测 APK 大小 `33,922,134` 字节,SHA-256 为 `20CB16B4E9D024DBF5EEEF577BFBA3B4DF5E5E78B597BABB99CB7450C7AE5034`。同一虚拟机从 `0.1.9` 保留数据覆盖安装成功,Launcher 冷启动约 `1.271s`,最新原生隐私弹窗可见,四项权限仍为 `granted=false`,未发现 FATAL 或 ANR。 - `0.1.10 (110)` DCloud 独立内测 APK 大小 `33,922,134` 字节,SHA-256 为 `20CB16B4E9D024DBF5EEEF577BFBA3B4DF5E5E78B597BABB99CB7450C7AE5034`。同一虚拟机从 `0.1.9` 保留数据覆盖安装成功,Launcher 冷启动约 `1.271s`,最新原生隐私弹窗可见,四项权限仍为 `granted=false`,未发现 FATAL 或 ANR。
- 自定义基座和独立内测 APK 均使用 DCloud 云端测试证书,不是企业正式签名 APK;当前 `0.1.10` 已关闭明文流量并内置网络安全配置,但仍只可用于 8 月 1 日受控内测。公司法务签认、企业签名、用户实际同意/拒绝、登录后权限反例仍是正式发布阻断。 - 自定义基座和独立内测 APK 均使用 DCloud 云端测试证书,不是企业正式签名 APK;当前 `0.1.12` 已关闭明文流量、内置网络安全配置并取消启动原生隐私确认,但仍只可用于 8 月 1 日受控内测。公司法务签认、企业签名、登录页协议门禁和登录后权限反例仍是正式发布阻断。
## 4. P0 工作分解 ## 4. P0 工作分解
@@ -161,12 +163,12 @@
1. 使用 HBuilderX 5.22 重新生成并安装自定义运行基座。 1. 使用 HBuilderX 5.22 重新生成并安装自定义运行基座。
2. 执行 App 资源校验和 App-Plus 构建,阻止“命令成功但未生成有效资源”的假成功。 2. 执行 App 资源校验和 App-Plus 构建,阻止“命令成功但未生成有效资源”的假成功。
3. 配置测试签名、应用标识、版本号、图标、启动图、原生隐私弹窗和麦克风/相机/相册/文件用途说明。 3. 配置测试签名、应用标识、版本号、图标、启动图、关闭启动原生隐私提示,并保留登录页协议门禁和麦克风/相机/相册/文件用途说明。
4. 确认 App 只请求正式 HTTPS 后端地址,安装包中不包含短信、模型、数据库、签名或其他服务端密钥。 4. 确认 App 只请求正式 HTTPS 后端地址,安装包中不包含短信、模型、数据库、签名或其他服务端密钥。
5. 生成 Release Candidate APK,并记录文件大小、SHA-256、构建源提交和构建时间。 5. 生成 Release Candidate APK,并记录文件大小、SHA-256、构建源提交和构建时间。
6. 保留上一可用 APK,准备安装失败、启动崩溃或关键接口异常时的回退说明。 6. 保留上一可用 APK,准备安装失败、启动崩溃或关键接口异常时的回退说明。
8 月 1 日交付的是内部受控测试 APK。法务 HTTPS 页面已经技术上线并进入原生弹窗,但在未完成公司法务签认、企业正式签名和完整真机门禁前,不得描述为正式发布包或商店上架包。 8 月 1 日交付的是内部受控测试 APK。法务 HTTPS 页面已经技术上线并进入登录页协议入口,启动不再弹原生确认;在未完成公司法务签认、企业正式签名和完整真机门禁前,不得描述为正式发布包或商店上架包。
### 4.3 P0-03:政策制度知识空间 ### 4.3 P0-03:政策制度知识空间
@@ -295,8 +297,8 @@
- [x] APK 文件名、版本号、`versionCode`、SHA-256 和构建源提交可追溯。 - [x] APK 文件名、版本号、`versionCode`、SHA-256 和构建源提交可追溯。
- [x] 全新安装、覆盖安装、卸载重装均可正常启动。 - [x] 全新安装、覆盖安装、卸载重装均可正常启动。
- [x] 干净首次启动显示原生隐私弹窗,服务协议和隐私政策链接均可通过系统浏览器访问。 - [x] `0.1.12` 干净首次启动不显示原生隐私确认,四项敏感权限保持未授权且无 Crash/ANR。
- [ ] 用户实际拒绝后退出、同意后才进入登录,并保留相应验收证据。 - [ ] 登录页协议默认未勾选,服务协议和隐私政策链接正确;未勾选时验证码和登录均被阻止,勾选后才允许继续。
- [ ] 同意麦克风后可录音;拒绝后不循环申请,并提供明确的文字或文件降级。 - [ ] 同意麦克风后可录音;拒绝后不循环申请,并提供明确的文字或文件降级。
- [ ] 图片、视频、文档和音频选择取消后不残留错误状态。 - [ ] 图片、视频、文档和音频选择取消后不残留错误状态。
- [ ] 前后台切换、网络断开和恢复不出现白屏或重复提交。 - [ ] 前后台切换、网络断开和恢复不出现白屏或重复提交。
+2 -2
View File
@@ -1,13 +1,13 @@
[CmdletBinding()] [CmdletBinding()]
param( param(
[string]$EvidenceDirectory = 'output\aug1-rc\0.1.10-110-dc20b920-frozen', [string]$EvidenceDirectory = 'output\aug1-rc\0.1.12-112-b9e08789-frozen',
[Parameter(Mandatory = $true)] [Parameter(Mandatory = $true)]
[string]$BackendJar, [string]$BackendJar,
[string]$ContentCandidate = 'docs\content-candidates\aug1-life-advisor-content-candidates-v0.1.json', [string]$ContentCandidate = 'docs\content-candidates\aug1-life-advisor-content-candidates-v0.1.json',
[string]$RuntimeCommit = 'dc20b92061f10a356ed73eb105ef7b00c8b8a617', [string]$RuntimeCommit = 'b9e08789265b73524e3ce2646abe2f2fc4565906',
[string]$OperationsCommit = 'HEAD', [string]$OperationsCommit = 'HEAD',
@@ -5,6 +5,8 @@ $devSetupPath = Join-Path $projectRoot 'docs\DEV_SETUP.md'
$source = Get-Content -Raw -Encoding UTF8 -LiteralPath $scriptPath $source = Get-Content -Raw -Encoding UTF8 -LiteralPath $scriptPath
$requiredFragments = @( $requiredFragments = @(
"output\aug1-rc\0.1.12-112-b9e08789-frozen",
'b9e08789265b73524e3ce2646abe2f2fc4565906',
'Runtime commit must be an ancestor of the operations commit', 'Runtime commit must be an ancestor of the operations commit',
'Frozen evidence is not release eligible', 'Frozen evidence is not release eligible',
'Frozen APK hash mismatch', 'Frozen APK hash mismatch',