Files

295 lines
30 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 01 · 任务分解(WBS
> 全量任务清单。每个任务含:**目标 / 产出物 / 依赖 / 验收 / 估时 / 角色**。
> 角色缩写:桥=桥/容器、台=平台/领域、能=能力工程师、Q=QA。估时单位:人日(pd)。
> 验收一律以《契约规范》对应条目为准;通用 DoD 见 [00_总体规划 §7](./00_总体规划.md)。
---
## 进度总览
> 状态图例:☐ 未开始 / ◐ 进行中 / ☑ 完成 / ⚠ 受阻 / ⏸ 延后 / ✗ 取消。每完成任务或里程碑**及时更新**(CLAUDE.md 工作约定)。最后更新:2026-06-27(本期开发全部完成,整合入 master)。
| 里程碑 | 状态 | 说明 |
|---|---|---|
| **M0** 脚手架 + 契约类型 | ☑ 完成 | 7 任务全完成并真机/模拟器验证 |
| **M1** 桥引擎 | ☑ 完成 | 8 任务全完成;**V1 真机通过**、桥核心单测覆盖 87.3% |
| **M2** 容器 + 启动 + 资源 | ☑ 完成 | 13 任务全完成;**V2 真机通过(R-02 关闭)**、VersionResolver 单测覆盖 81.8%T-M2-12 机制已验证(真实远程大厅待服务端可用时终验) |
| **M3** 本期能力 | ☑ 完成 | 全 Provider 落地;分享/getcompareCode/app_gamename 补全;录音 prepareaudio 全链路真机通过;T-M3-16 前后台、T-M3-17 全量契约真机回归 均完成(微信开放平台注册/登录 profile 换取等"待外部/服务端"项已闭环) |
| **M4** 通用网页容器 | ☑ 完成 | GenericWebContainer+SettingsProxy(6方法)+getWebdata/gamebackkeydown/backgameData 直调+101回传+返回键;子游戏切换(路径A)/打开通用容器(路径B) |
| **M5** 性能与加固 | ☑ 完成 | 01/02 双 Web 架构 ✓;04 onRenderExited 崩溃兜底 ✓;05 安全加固 ✓;**03 节流(Debouncer/Throttler+网络防抖)✓;06 可观测(BridgeTracer 全链路 traceId+ErrorCenter→APM sink)✓;07 冷启动(远程配置/内置资源并行化+耗时打点)✓**(均 build 通过);**T-M5-08 包体裁剪 ✗ 取消**HAP≈1.2MB 已很小,微信/七牛 SDK 仅~400K 且均已真集成,HSP 裁剪过度优化、收益微小) |
| **M6** 暂缓能力集成 | ✗ 不实现 | 视频房(声网)/支付 **决定保持占位桩、不做真集成**;M6-03 补齐项(抖音/快手登录、getCanvasBase64、QQ/抖音分享回传)**按需**,待业务+开放平台注册再启 |
**M0 任务明细(全部 ☑)**
- ☑ T-M0-01 多模块工程(entry + 6 HAR
- ☑ T-M0-02 模块依赖与导出(单向向下、无环)
- ☑ T-M0-03 构建/签名/CI(签名已配 `tsgames.p12`CI = `scripts/ci.sh`
- ☑ T-M0-04 契约类型 SSOT45 入站 + 21 出站 + 17 DTO + Result/Errors
- ☑ T-M0-05 公共设施 commonLogger/Tracer/EventBus/DI/ErrorCenter
- ☑ T-M0-06 引入桥 JSlzyzsd 原文件 + BridgeJsLoader
- ☑ T-M0-07 App 入口与路由壳(Navigation;真机验证启动→路由→回传→横屏)
**M1 任务明细**
- ☑ T-M1-01 IWebController + WebviewControllerAdapter(emitter UI 线程守卫) + FakeWebController
- ☑ T-M1-02 Message + MessageCodeclzyzsd 二次转义逐字复刻 + 单引号转义修复)
- ☑ T-M1-03 HandlerRegistry + 空实现 DefaultHandler 兜底
- ☑ T-M1-04 BridgeController(对能力零感知、纯逻辑可测)
- ☑ T-M1-05 桥 JS 注入(onPageEnd
- ☑ T-M1-06 最小回显 H5 + 容器接桥(BridgeGameContainer 挂 Web
-**T-M1-07 V1 阻塞性验证真机通过**yy:// 被 onLoadIntercept 捕获、_fetchQueue 经
yy://return 回传、双向回执、含 `\"\\/'中文` 特殊字符转义往返一致。技术路线成立。
- ☑ T-M1-08 桥引擎单测:15 用例全通过,桥核心覆盖率 87.3%(≥80%);
运行方式 = scripts/test.shDevEco hvigorw 本地单测,已解决 R-18
**M2 任务明细(全部 ☑)**
- ☑ T-M2-01 平台存储/文件:KvStore(preferences)、FileSystem(fileIo 增删读写/列目录/拷贝内置 rawfile)
- ☑ T-M2-02 网络/下载:HttpClient(GET 禁缓存)、Downloader(http 流式写盘+进度)
- ☑ T-M2-03 解压:Unzipper(zlib.decompressFile)。**偏差**:下载/解压用原生异步 API 即满足"UI 不阻塞"
独立 TaskScheduler(TaskPool) 推迟到 M5 真有 CPU 密集任务(MD5)时再加,避免投机性死代码
- ☑ T-M2-04 权限/上传:PermissionGuard(用时申请,沙箱文件免存储权限)、LocalUploadServer(**已落地**@ohos.net.socket 本机 HTTP server,接 H5 POST 截图→PHOTO_UPLOAD→微信图片分享,见 T-M3-13)
- ☑ T-M2-05 ConfigManager:本地 rawfile/app_config.json + 远程拉取/校验(<30 阻断) + 决策(按线上真实格式:单 agentlist 树,无二级 url
- ☑ T-M2-06 VersionResolver:纯函数,按线上真实格式 agent→game→channel→market 后层覆盖(game_zip / 数字 id 归一 / gameid 回退 version.xml);单测重写为真实格式 + 线上大厅样例;模拟器端到端验证(下载 261 版大厅渲染)
- ☑ T-M2-07 ResourceManager:路径规范、内置包拷贝解压、version.xml 解析、远程 zip 下载/删旧/解压、版本比较
- ☑ T-M2-09 AppDataInjector:加载前写 app_data.js(§6 全局变量同名同义)
- ☑ T-M2-11 StartupOrchestratorINIT→…→ENTER_HALL 状态机,远程失败降级本地、showmessage 阻断
- ☑ T-M2-13 能力插件框架骨架:CapabilityProvider/Context/Registrar + 组装根 buildCapabilities() + 样板
- ☑ T-M2-10 BridgeGameContainer 完整化:Registrar 注册能力、首次 100% 推 appservice/setPostUrl、清理、入口 URL
-**T-M2-08 V2 阻塞性验证真机通过**file:// fetch/XHR 首测被 CORS 拦截,用
`setPathAllowingUniversalAccess` 放开资源根跨域(对 H5 透明)后复测 OK;R-02 关闭
- ☑ T-M2-12 集成联调:用内置测试大厅(gamehall_builtin.zip)端到端验证全链路(启动→资源→app_data→
file:// 加载→跨域 fetch→桥双向)真机通过。**真实远程大厅** H5 需服务端/网络可用时做终验
**M3 任务明细**17/17 完成):
- ☑ T-M3-15 RoomStubProvider/PayStubProvider(§6.5 占位桩,全 void、不触发出站)
- ☑ T-M3-04 VibrateProvidervibrator/repeatvibrator/canclevibrator
- ☑ T-M3-05 ClipboardProvidergameCopytext/gamepastetext
- ☑ T-M3-01 AppSystemProviderorientation/browser/finsh/openApplyDownloadpath/notification空)
- ☑ T-M3-02 DeviceProvidergetTime/getphonestate/getbattery/getwifiLevel/getcompareCode/getphoneInfo/getmarketname/getothername/getOther
- ☑ T-M3-03 NetworkProvidergetnetwork + 出站广播)
- ☑ T-M3-08 ShakeProvider@ohos.sensor 加速度合力阈值 + shakeEnd
- ☑ T-M3-09 LocationProvidergeoLocationManager 定位+逆地理编码,用时申请权限,错误码 0/-1/-2)
- ☑ T-M3-10 AudioProviderAVPlayer 播放:mediaTypeAudio/srcIsloop/voicePlaying + gameui_play/stop_voice
**录音 prepareaudio 全链路完成并真机验证通过**AmrRecorder(AVRecorder AMR-NB) → 七牛端侧 token(HMAC-SHA1,对齐原工程 AK/SKbucket gameaudio) → getaudiourl 回投;
手势走方案A(Web onTouch 上滑取消/抬手发送/太短)+录音浮层+分层静音;getaudiourl 双回投(松手空+上传真实 URL)对齐 Android reset()
gameui_play/stop_voice 时机对齐 Android play() 且 user 强转字符串。详见 docs/superpowers/plans/2026-06-27-录音流程.md
- ☑ T-M3-11 ScanProvider@kit.ScanKit 默认界面扫码,免权限)
- ☑ T-M3-12 CameraProvider@kit.CameraKit cameraPicker,免权限)
- ☑ T-M3-07 PhotoProvider(批量下载到资源根 photos/,复用 Downloader
- ☑ T-M3-13 ShareProvider(对齐原工程分享面板:微信 SDK 网页/Canvas截图→sharesuccessQQ/抖音 @kit.ShareKit 系统分享;截图经 CapabilityContext.captureCanvas);**另支持 H5 主动 POST 截图上传链路**LocalUploadServer→PHOTO_UPLOAD→微信图片分享,对齐原 OkHttpPhotoServer
- **2026-06 去SDK化重构**:经验证鸿蒙不接官方 SDK 无法"拉起 App 分享界面预填内容",遂三端统一改为「写剪贴板 + 指引窗 ShareGuideDialog(打开App best-effort / 用系统分享 / 取消)→ 系统分享(systemText/systemImage)」,**分享不再依赖 wechat_open_sdk**(微信登录仍用);文本统一 `title\ndescription` 单换行不含 url;图片 type2 截图/type3 链接下载走剪贴板 PIXELMAP(尽力)+systemImage 兜底;微信乐观回传 sharesuccess,QQ/抖音不回传;契约/DTO 零改动。**QQ/抖音 官方鸿蒙 SDK 直分享(选好友) 列为延期项**(需开放平台 AppId/签名/AppLinking 注册);**图片剪贴板能否在微信/QQ对话框粘贴待真机验证**(见 03_风险登记册 R-19)。spec/plan: docs/superpowers/specs|plans/2026-06-27-分享重构*
- ☑ T-M3-14 LoginProvider(微信授权取 codeprofile 换取待服务端端点,AppSecret 不入端)
- ☑ T-M3-06 NavProvider(随 M4 完成):OpenurlTitleData(开通用容器+101回传)/SwitchOverGameData(同容器切换+app_data重注入)/getGameinstall(同步)/backgameData(返回大厅)
- ☑ T-M3-16 前后台 appservice(容器 EventBus 联动,随 EntryAbility 前后台触发 appservice
- ☑ T-M3-17 契约一致性回归(全量入站 handler 真机核对完成)
> 已落地 Provider 当前为 **build 验证 + 契约逐字对齐**;真机逐条验证在 T-M3-17 回归阶段统一做(最小回显页不覆盖业务 handler)。
> getcompareCode 已接启动期版本决策(KvStore 缓存网络 App 版本)app_gamename 已解析 version.xml 子 game nameEchoSampleProvider 已移除(getTime 由 DeviceProvider 提供)ShareProvider 已完整(微信真分享待开放平台注册做真机验证)LoginProvider profile 换取仍待服务端。
**M2 期间确立的项目决策/偏差**
- file:// 跨域采用 `WebviewController.setPathAllowingUniversalAccess([filesDir/tsgames])`(官方"本地资源跨域"方案),优于通用 onInterceptRequest 代理。
- 沙箱路径简化:弃用 Android 的 `<包名>/<时间戳>` 多级目录,用固定 `filesDir/tsgames/<gamedir>`(§5.1 许可,对 H5 无影响)。
- 启动期不申请敏感权限(沙箱文件免存储权限;定位/电话等由 M3 Provider 用时申请),仅声明 INTERNET。
- 内置 `gamehall_builtin.zip` 为 M2 测试大厅(含 V2 验证页),真实大厅由远程 zip 生产下发;M3 用真实 Provider 替换 EchoSampleProvider。
**M0 期间确立的项目决策(超出原计划的补充)**
- 包名 `com.lobby.daoqi`;横屏项目,`module.json5``auto_rotation_landscape`(横屏两朝向跟随旋转、不进竖屏,H5 显式方向控制保留)。
- ArkTS 验证用 `devecocli build`(其 CompileArkTS 为权威编译器);deveco-mcp 的 LSP check 因 70s 索引 / 20s 超时不可用。
- `devecocli``test` 子命令,单测运行方式待 M1 解决。
---
## M0 · 工程脚手架 + 契约类型
| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M0-01** | 创建多模块工程 | `devecocli create` 生成 entry + 6 HAR`feature_bridge`/`feature_capabilities`/`domain_resource`/`platform`/`contracts`/`common` | — | 工程可 `devecocli build`debug)通过 | 1 | 桥 |
| **T-M0-02** | 模块依赖与导出 | 各 `oh-package.json5` 依赖关系(单向向下);`index.ets` 导出 | T-M0-01 | 跨模块 import 无环、可编译 | 0.5 | 桥 |
| **T-M0-03** | 构建/签名/CI | `build-profile.json5`debug/release product);调试签名;CI 脚本(build+单测) | T-M0-01 | PR 触发 CI 通过 | 1 | 桥 |
| **T-M0-04** | 契约类型(SSOT | `contracts` HAR`enum Handlers`(全部入站/出站 handler 名常量,含 `finsh`/`getcameraaAddress`/`backgameData-` 等原样拼写);DTO interface`sharetypeBean`/`MaplocationInfo`/`phoneInfoBean`/`savephotoURLBean`/`videoinfobean`/`Othervideoinfo`/`GamePay`/`sharelogin`/`sharesuccess`);`Result<T>`/`Errors`;每 handler 的 `payloadType:'raw'|'json'` 标注 | T-M0-02 | 全量对照《契约规范》§8/§9/§12,零缺漏;编译通过 | 1.5 | 台 |
| **T-M0-05** | 公共设施 | `common` HAR`Logger`(分级)/`BridgeTracer`(traceId)/`EventBus`(emitter 封装)/`DIContainer`/**`ErrorCenter`(异常收敛+弹窗/静默/上报策略)**/`Result<T>` 配套 | T-M0-02 | 单测覆盖;可被各模块引用(框架 §10) | 1.5 | 台 |
| **T-M0-06** | 引入桥 JS | 把 lzyzsd `WebViewJavascriptBridge.js` **原文件**放入 `feature_bridge/assets`,建读取/内联机制 | T-M0-01 | 文件就位、可被注入流程读取 | 0.5 | 桥 |
| **T-M0-07** | App 入口与路由壳 | `EntryAbility`Stage 模型生命周期,含 `onForeground/onBackground` 钩子接口)+ `Navigation`/路由骨架(Splash↔BridgeGameContainer↔GenericWebContainer 跳转与回传通道)+ `SplashPage` 壳(框架 §4) | T-M0-01 | 空壳可启动、可路由跳转;前后台钩子可触发 | 1 | 桥 |
---
## M1 · 桥引擎(最高优先 ⭐)
| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M1-01** | Web 控制器抽象 | `IWebController` 接口 + `WebviewControllerAdapter`(包 `webview.WebviewController`+ `FakeWebController`(测试用) | T-M0-01 | 桥不直接依赖系统类;Fake 可记录脚本/模拟回执 | 1 | 桥 |
| **T-M1-02** | 消息编解码 | `Message`5 字段)+ `MessageCodec``toJson`/`toArray`/`escape`,**与 lzyzsd 完全一致的二次转义**(`\``"` | T-M0-04 | 单测:与 Android 端样例字节级一致 | 1 | 桥 |
| **T-M1-03** | Handler 注册表 | `HandlerRegistry`put/get/default+ `DefaultHandler`(空实现兜底) | T-M0-04 | 未注册名落默认 handler 不抛错(框架 §5.2/§6.5 | 0.5 | 桥 |
| **T-M1-04** | 桥控制器 | `BridgeController``onLoadIntercept`/`callHandler`/`registerHandler`/`onPageEnd`/`flushMessageQueue`/`handleReturnData`/`dispatch`/`queue`**`_fetchQueue``yy://return/` 回传**(非 runJavaScript 返回值);**UI 线程守卫**(§5.5 | T-M1-01/02/03 | 单测(FakeWebController):模拟 H5 callHandler→handler 分发、原生 callHandler→下发、回执路由、启动队列补发 | 2.5 | 桥 |
| **T-M1-05** | 桥 JS 注入 | `onPageEnd``runJavaScript(BRIDGE_JS)` + 启动消息补发 | T-M1-04/T-M0-06 | 页面就绪后 `window.WebViewJavascriptBridge` 可用 | 0.5 | 桥 |
| **T-M1-06** | 最小回显 H5 | 测试用 H5(`registerHandler('echo')``callHandler('getTime')`)+ 一个挂桥的最小测试页 | T-M1-04 | 真机:H5↔原生双向回显成功 | 1 | 桥/Q |
| **T-M1-07 ⚠** | **阻塞性验证 V1** | 真机验证 `yy://` 的 iframe 导航被 `onLoadIntercept` 捕获;产出结论报告 | T-M1-06 | V1 通过;若不通过,按 [00 §5](./00_总体规划.md) 回退方案并更新设计 | 1 | 桥/技术负责人 |
| **T-M1-08** | 桥引擎单测 | `BridgeController`/`MessageCodec`/`HandlerRegistry` 单测套件 | T-M1-04 | 覆盖率 ≥80%(框架 §13 | 1.5 | 桥/Q |
> **M1 出口**T-M1-06 跑通 + **T-M1-07V1)通过** + T-M1-08 达标。
---
## M2 · 容器 + 启动 + 资源(轨道 A 容器 / 轨道 B 平台领域)
### 平台层(轨道 B,可与 M1 并行起步)
| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M2-01** | 存储/文件 | `KvStore`(@ohos.data.preferences)、`FileSystem`(@ohos.file.fs) | T-M0-01 | 读写 `urlpath`/`upurlpath`;文件增删查 | 1 | 台 |
| **T-M2-02** | 网络/下载 | `HttpClient`(@ohos.net.http 或 rcp)、`Downloader`(断点可选、进度回调) | T-M0-01 | GET 禁缓存;大文件下载带进度 | 1.5 | 台 |
| **T-M2-03** | 解压/并发 | `Unzipper`(@ohos.zlib decompressFile)、`TaskScheduler`(TaskPool/Worker) **仅传 Sendable + emitter 进度**(§9.1 | T-M0-01 | zip 解压成功;解压在子线程、UI 不阻塞 | 1.5 | 台 |
| **T-M2-04** | 权限/上传服务 | `PermissionGuard`(存储/电话/定位/相机/麦克风 用时申请);`LocalUploadServer`socket/NAPI 本机端口服务,截图上传用) | T-M0-01 | 权限流程合规;本机端口可访问 | 1.5 | 台 |
### 配置/资源/启动(轨道 B
| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M2-05** | 本地+远程配置 | `ConfigManager`:内置 `rawfile/app_config.json`(§4.2 全键);远程配置请求(`http://gameconfig 去-换/ .txt?a=ts`,禁缓存);`showmessage` 阻断、<30 错误文案 | T-M2-02 | 配置键齐全;远程 JSON 正确解析、阻断逻辑生效 | 2 | 台 |
| **T-M2-06** | 分层覆盖 | `VersionResolver`:线上真实格式 单 `agentlist` 树 + **agent→game→channel→market 后层覆盖**`game_zip` / 数字 id 归一 / gameid 回退 version.xml,纯函数) | T-M2-05 | 单测:多层样例覆盖结果正确(《契约规范》§4.4) | 2 | 台 |
| **T-M2-07** | 资源管理 | `ResourceManager`:路径规范、内置包拷贝+解压、`version.xml` 解析(@ohos.xml)、远程 zip 下载/删旧/解压、版本比较 | T-M2-03/06 | 首启拷贝、版本更新下载解压到正确目录(§5) | 2 | 台 |
| **T-M2-08 ⚠** | **阻塞性验证 V2** | 真机验证 `file://` 大厅页 XHR/fetch 取本地资源;结论报告 | T-M2-07 + T-M2-10 | V2 通过;否则启用 §7.3 自定义协议方案并更新设计 | 1 | 台/桥 |
| **T-M2-09** | app_data 注入 | `AppDataInjector`:加载前写 `<urlpath>/gamehall/app_data.js`(§6 全局变量同名同义) | T-M2-07 | H5 加载时能读到 `app_*` 变量;**时序在加载前**(§7.1 铁律) | 1 | 台 |
| **T-M2-11** | 启动状态机 | `StartupOrchestrator`INIT→…→ENTER_HALL;可重试/降级/阻断 | T-M2-05/07/09 | 真机按序走通;失败降级本地缓存 | 1.5 | 台 |
### 容器(轨道 A
| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M2-13** | **能力插件框架骨架** | `feature_capabilities``CapabilityProvider` 接口、`CapabilityContext`、注册表对接桥、组装根 `buildCapabilities()`/`AppModule`DI 装配)、Provider 样板(框架 §6.1/§6.2 | T-M1-04、T-M0-05 | 一个示例 Provider 可注册并被桥分发;组装根可批量装配 | 1 | 桥 |
| **T-M2-10** | 大厅/子游戏容器 | `BridgeGameContainer``Web` + 属性(JS/DOM/file/mixed/cache/geo/zoom+ 生命周期接桥(`onControllerAttached` 注册能力、`onLoadIntercept` 接桥、`onPageEnd` 注桥)+ **首次进度 100% 推 `appservice`/`setPostUrl`** + `SwitchOverGameData` 同容器 `loadUrl` 切换 + `aboutToDisappear` 清理 | T-M1-08、T-M2-13、T-M0-07 | 入口 URL 规则正确(`weburl` 空→file://,非空→http://,带 `?Launchtype=0` | 2 | 桥 |
| **T-M2-12** | 集成联调 | 大厅 H5 真机加载 + 进子游戏 | T-M2-08/10/11 | 现有大厅 `index.html` 正常显示、可进子游戏 | 1 | 桥/Q |
> **M2 出口**T-M2-12 跑通 + **T-M2-08V2)通过**。
> **注**`T-M2-13` 能力插件框架骨架是 **M3 全部 Provider 与 T-M2-10 容器注册能力的前置依赖**,须先于铺开能力完成。
---
## M3 · 本期能力(轨道 C,各 Provider 高度并行)
> **前置依赖**M3 全部 Provider 均依赖 `T-M2-13`(能力插件框架骨架)+ `T-M2-10`(容器可加载)+ `T-M0-04`(契约类型)。这三者就绪后,各 Provider 之间**互不依赖、可多人并行**。
> 通用验收(每个 Provider):入站 handler 名/参数解析、出站 handler 名/data 结构/时机**逐条对照《契约规范》§8/§9/§12**;异步回传经 UI 线程守卫;真机录用例。
| ID | Provider | 入站 handler | 出站 handler | 关键实现/SDK | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M3-01** | `AppSystemProvider` | `orientation``browser``finsh``openApplyDownloadpath``notification`(空) | — | 屏幕方向、拉起浏览器、退出、按包名启动/下载兜底 | 1.5 | 能 |
| **T-M3-02** | `DeviceProvider` | `getTime``getphonestate``getbattery``getwifiLevel``getcompareCode``getphoneInfo``getmarketname``getothername``getOther` | `getBattery``getwifiLevel``phonestate` | deviceInfo/telephony/batteryInfo/wifiManager;裸串 vs JSON 严格区分 | 2.5 | 能 |
| **T-M3-03** | `NetworkProvider` | `getnetwork` | `getnetwork`(广播变化) | NetworkKit 监听 | 1 | 能 |
| **T-M3-04** | `VibrateProvider` | `vibrator``repeatvibrator``canclevibrator` | — | @ohos.vibrator | 0.5 | 能 |
| **T-M3-05** | `ClipboardProvider` | `gameCopytext``gamepastetext` | —(gamepastetext 同步返回串) | @ohos.pasteboard | 0.5 | 能 |
| **T-M3-06** | `NavProvider` | `OpenurlTitleData``SwitchOverGameData``getGameinstall`(同步 0/1)、`backgameData` | `getWebdata` | 打开通用容器(M4)、同容器切换、目录判断 | 1.5 | 能/桥 |
| **T-M3-07** | `PhotoProvider` | `getphoto` | `getphoto`(下载完成数组) | 批量下载图片到本地 + Downloader | 1.5 | 能 |
| **T-M3-08** | `ShakeProvider` | `startshake``SwitchShake``stopshake` | `shakeEnd`(空串,触发后~1s) | @ohos.sensor 加速度 + 节流;声音可选 | 1.5 | 能 |
| **T-M3-09** | `LocationProvider` | `startlocation`(1连续/否单次)、`getlocationinfo`(同步) | `getlocationinfo`(MaplocationInfo/错误码) | geoLocationManager**隐私合规初始化**;错误码 0/-1/-2 | 2 | 能 |
| **T-M3-10** | `AudioProvider` | `prepareaudio`(录音)、`mediaTypeAudio``srcIsloop``voicePlaying` | `getaudiourl`(`{audiourl,time}`)、`gameui_play_voice``gameui_stop_voice` | AVPlayer/SoundPool;录音上传(七牛等)wav 路径拼接 | 3 | 能 |
| **T-M3-11** | `ScanProvider` | `opensaoma` | `getsaomaData` | Scan Kit | 1 | 能 |
| **T-M3-12** | `CameraProvider` | `opencamera` | `getcameraaAddress` | Camera Picker | 1 | 能 |
| **T-M3-13** | `ShareProvider` | `friendsSharetypeUrlToptitleDescript` | `sharesuccess`(仅微信) | 微信分享 SDK`type==2` 截图:`runJavaScript(canvas.toDataURL)` + LocalUploadServer | 2.5 | 能 |
| **T-M3-14** | `LoginProvider` | `accreditlogin` | `sharelogin`(用户资料) | 微信登录;**建议 code 模式**(密钥下沉) | 2 | 能 |
| **T-M3-15** | `RoomStubProvider`/`PayStubProvider` | `createRoom`/`exitRoom`/`getVideoinfo`/`DragViewvideoIsshow``paybrowser`/`getGameplay` | —(不触发) | **占位桩**:空实现 + 日志(§6.5 | 0.5 | 能 |
| **T-M3-16** | 前后台联动 | — | `appservice`('1'/'2') | `UIAbility.onForeground/onBackground` → callHandler | 0.5 | 桥 |
| **T-M3-17** | 契约一致性回归 | 全 44 入站 + 全出站真机逐条核对 | — | 对照《契约规范》§8/§9,出回归报告 | 2 | Q |
> **M3 出口**:本期能力真机逐条通过;**视频房/支付桩被调用不报错不卡死**(T-M3-17 含此项)。
---
## M4 · 通用网页容器(轨道 A,可与 M3 尾段并行)
| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M4-01** | 通用容器 | `GenericWebContainer``Web` + cacheMode(有网 Default/无网 Only) + `javaScriptProxy` 注入 `settings` | T-M2-10 | 打开任意 url、属性正确 | 1.5 | 桥 |
| **T-M4-02** | settings 注入 + 直调 | `SettingsProxy` 6 方法(`backgameData`/`loadurl`/`browser`/`finishweb`/`isexitdialogeshow`/`isbackfinishweb`+ 3 个 `runJavaScript` 直调(`getWebdata`/`gamebackkeydown`/`backgameData` | T-M4-01 | 逐一对照《契约规范》§11.3 | 1.5 | 桥 |
| **T-M4-03** | 回传与返回键 | 101 结果经 router/emitter 回上层 → 上层 `callHandler('getWebdata')`;返回键逻辑(isbackfinishweb/isexitdialogeshow | T-M4-02 | 活动页/收银台/客服打开、回传、返回正常 | 1 | 桥 |
---
## M5 · 性能与加固(轨道 D,部分贯穿 M3/M4)
| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M5-01 ☑** | Web 保活/激活(**双 Web 槽**模型,框架 §7.5| 大厅 Web 常驻(Stack 内,subgame 时 Hidden+onInactive);子游戏 Web 进入创建/返回销毁;**同时只一个激活**:WebSlot 激活协议(appservice'2'/'1' + setActive 桥闸门 + forEachForeground/Background + onActive/onInactive);各 Web 独立桥+能力。已落地 WebSlot + 双 Web 容器 | T-M2-10 | ☑ 真机验证:返回保留大厅(未重载)、接口不串、非激活端停 native 监听 | 3 | 桥 |
| **T-M5-02 ☑** | 切换与桥重绑 | 子游戏 Web 创建即注册自己的桥+能力;销毁时 dispose;大厅桥常驻不重绑。已替换单 WebView loadUrl。**真机验证:大厅未重载(常驻)、子游戏 LT=1 独立桥、appservice 1/2 互斥、backgameData→getWebdata 回传** | T-M5-01 | ☑ 切换后两端桥各自正常、大厅状态保留 | 1.5 | 桥 |
| **T-M5-03 ☑** | 高频节流/批处理 | common `Debouncer/Throttler`NetworkProvider 网络变化 300ms 防抖合并;连续定位受系统 5s 约束、Device 被动查询无需节流;lzyzsd 单条协议不跨条合并(保 H5 零改动) | T-M3-* | 跨引擎调用次数下降、无卡顿(真机终验待真机阶段) | 1 | 桥 |
| **T-M5-04 ☑** | 崩溃兜底/内存 | `onRenderExited` 重载;`aboutToDisappear` 彻底清理 | T-M2-10 | 渲染子进程崩溃可自恢复 | 1 | 桥 |
| **T-M5-05 ☑** | 安全加固 | WebDebug 按 `isDebug` 守卫;密钥下沉服务端;明文 HTTP 域名白名单;file 跨域最小授权;自定义 scheme 注册(module.json5);日志脱敏 | 各能力就绪 | 安全审查清单(附录 B)全过 | 2 | 桥/台 |
| **T-M5-06 ☑** | 可观测 | `BridgeTracer` 全链路 traceId(桥流转 OUTBOUND/INBOUND/HANDLER/RESPONSE/DISPATCH/RETURN 打点,Message 非协议 traceId 字段);entry `installErrorSink` 打通 ErrorCenter Report→APM/Crash | T-M0-05 | 能还原一条桥消息全链路 | 1 | 台 |
| **T-M5-07 ☑** | 冷启动优化 | StartupOrchestrator 远程配置与内置资源准备并行化(max 而非求和);各阶段 `[startup]` 耗时打点 | T-M2-11 | 冷启动到首帧达标(<2s 基线;真机量化待真机阶段) | 1 | 台 |
| **T-M5-08 ✗** | 包体/渠道裁剪(可选) | 能力 Provider 按渠道用 HSP 动态特性裁剪;包体瘦身(框架 §9 包体) | T-M3-* | **取消**2026-06-27):实测 HAP≈1.2MBdebugrelease 去 sourceMap 更小),微信/七牛 SDK 仅~400K 源码且均已真集成——原"SDK 大需裁剪"前提不成立;HSP 化徒增构建复杂度、收益微小,属过度优化。如未来需"按渠道出不同能力集的包"再启 | 1 | 桥/台 |
---
## M6 · 暂缓能力集成(按需,可延后)
| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M6-01 ✗** | 视频房真实 | `RoomProvider`(声网 RTC HarmonyOS SDK)替换桩 | M3 完成 | **不实现**2026-06-27 决定):保持 RoomStubProvider 占位桩,H5 调用不报错不卡死 | 视 SDK | 能 |
| **T-M6-02 ✗** | 支付真实 | `PayProvider`(浏览器收银台/或 App 内支付)替换桩 | M3 完成 | **不实现**2026-06-27 决定):保持 PayStubProvider 占位桩 | 视 SDK | 能 |
| **T-M6-03** | 补齐项(可选) | 抖音/快手登录(code)、主动截图 `getCanvasBase64`、QQ/抖音分享回传统一 | 按需 | 对照框架 §6.4 | 视需求 | 能 |
---
## 任务总数与估时汇总
| 里程碑 | 任务数 | 估时(pd) |
|---|---|---|
| M0 | 7 | 7 |
| M1 | 8 | 9 |
| M2 | 13 | 19 |
| M3 | 17 | 24.5 |
| M4 | 3 | 4 |
| M5 | 8 | 10 |
| **合计(M0M5)** | **56** | **≈73.5 pd(含测试/缓冲)** |
| M6 | 3 | 视集成 |
> 估时为"工作量"非"日历"。3 人并行、关键路径串行下,日历周期约 5–7 周(见 [00 §1](./00_总体规划.md))。
---
## 附:框架设计 → 计划覆盖矩阵(完整性自检)
> 逐条证明《框架设计与开发指南》每个章节都有计划任务承接,**无遗漏**。
| 框架章节 | 计划任务 | 状态 |
|---|---|---|
| §1 设计原则 | 贯穿 DoD([00 §7](./00_总体规划.md))与代码规范(00 §6) | ✓ 原则类,非任务 |
| §2 能力映射总表 | 各能力/桥任务的实现依据(引用表) | ✓ 参考 |
| §3 分层架构 / §4 工程结构 | T-M0-01/02(建 entry+6 HAR)、**T-M0-07**EntryAbility/路由/Splash | ✓ |
| §5.15.2 桥协议/控制器 | T-M1-02/03/04/05 | ✓ |
| §5.3 同步/异步 | T-M1-04 + 各 Provider | ✓ |
| §5.4 裸串vsJSON | T-M0-04payloadType | ✓ |
| §5.5 线程模型 | T-M1-04UI 守卫) | ✓ |
| §5.6 IWebController | T-M1-01 | ✓ |
| §6.1/6.2 插件框架/组装根/DI | **T-M2-13**(能力插件框架骨架) | ✓ 已补 |
| §6.3 Provider 样板/截图分享 | T-M3-09(样板)、T-M3-13(分享截图) | ✓ |
| §6.4 补齐项 | T-M6-03 | ✓ |
| §6.5 占位桩 | T-M3-15 | ✓ |
| §7.1 大厅/子游戏容器 | T-M2-10 | ✓ |
| §7.2 通用网页容器 | T-M4-01/02/03 | ✓ |
| §7.3 file:// 跨域 | T-M2-08V2 阻塞验证) | ✓ |
| §8.1 启动状态机 | T-M2-11 | ✓ |
| §8.2 ConfigManager | T-M2-05 | ✓ |
| §8.2 分层覆盖 | T-M2-06VersionResolver | ✓ |
| §8.3 ResourceManager | T-M2-07 | ✓ |
| §8.4 AppDataInjector | T-M2-09 | ✓ |
| §9 性能(保活/并发/批处理/就绪渲染/内存/冷启动) | T-M5-01/02/03/04/07、T-M2-03 | ✓ |
| §9 包体/HSP 裁剪 | **T-M5-08** | ✓ 已补 |
| §9.1 TaskPool Sendable | T-M2-03 | ✓ |
| §10 契约类型 SSOT | T-M0-04 | ✓ |
| §10 日志/追踪 | T-M0-05Tracer)、T-M5-06 | ✓ |
| §10 ErrorCenter | **T-M0-05**(已含 ErrorCenter | ✓ 已补 |
| §10 事件总线/DI | T-M0-05 | ✓ |
| §10 权限 | T-M2-04PermissionGuard | ✓ |
| §10 安全 | T-M5-05 | ✓ |
| §10 可测试 | T-M1-01/08 + 各单测 | ✓ |
| §11 可追溯矩阵 | [02 测试与验收 §4](./02_测试与验收计划.md) 契约核对清单 + 本矩阵 | ✓ |
| §12 路线图 M0M6 | 本 WBS 全部里程碑 | ✓ |
| §13 验收标准 | [02 测试与验收计划](./02_测试与验收计划.md) | ✓ |
| 附录 A ArkTS/ArkUI 适配 | 贯穿 DoD[00 §7](./00_总体规划.md) 已引用 §5.5/§9.1+ T-M0-07/T-M2-10 落地 | ✓ |
| 附录 B 生产加固合规 | T-M5-05(逐项)+ [02 §5 M5 Gate](./02_测试与验收计划.md) | ✓ |
> **结论**:框架设计指南全部章节均有计划任务承接,覆盖完整。本次自检新增 `T-M0-07`、`T-M2-13`、`T-M5-08` 及 `T-M0-05` 的 ErrorCenter,补齐了能力插件框架骨架、入口/路由壳、ErrorCenter、包体裁剪四处缺口。