# 01 · 任务分解(WBS) > 全量任务清单。每个任务含:**目标 / 产出物 / 依赖 / 验收 / 估时 / 角色**。 > 角色缩写:桥=桥/容器、台=平台/领域、能=能力工程师、Q=QA。估时单位:人日(pd)。 > 验收一律以《契约规范》对应条目为准;通用 DoD 见 [00_总体规划 §7](./00_总体规划.md)。 --- ## 进度总览 > 状态图例:☐ 未开始 / ◐ 进行中 / ☑ 完成 / ⚠ 受阻 / ⏸ 延后。每完成任务或里程碑**及时更新**(CLAUDE.md 工作约定)。最后更新:2026-06-26。 | 里程碑 | 状态 | 说明 | |---|---|---| | **M0** 脚手架 + 契约类型 | ☑ 完成 | 7 任务全完成并真机/模拟器验证 | | **M1** 桥引擎 | ☑ 完成 | 8 任务全完成;**V1 真机通过**、桥核心单测覆盖 87.3% | | **M2** 容器 + 启动 + 资源 | ☑ 完成 | 13 任务全完成;**V2 真机通过(R-02 关闭)**、VersionResolver 单测覆盖 81.8%;T-M2-12 机制已验证(真实远程大厅待服务端可用时终验) | | **M3** 本期能力 | ◐ 进行中 | 全 Provider 落地;分享面板(微信SDK+QQ/抖音系统分享)/getcompareCode(接版本决策)/app_gamename 补全,EchoSample 移除;余 T-M3-17 真机回归(录音 prepareaudio、微信开放平台注册 待外部) | | **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 包体裁剪⏸延后 M6 | | **M6** 暂缓能力集成 | ☐ 未开始 | 按需;含 T-M5-08(包体/渠道 HSP 裁剪,因微信/七牛 SDK 至 M6 才真集成而延后) | **M0 任务明细(全部 ☑)**: - ☑ T-M0-01 多模块工程(entry + 6 HAR) - ☑ T-M0-02 模块依赖与导出(单向向下、无环) - ☑ T-M0-03 构建/签名/CI(签名已配 `tsgames.p12`;CI = `scripts/ci.sh`) - ☑ T-M0-04 契约类型 SSOT(45 入站 + 21 出站 + 17 DTO + Result/Errors) - ☑ T-M0-05 公共设施 common(Logger/Tracer/EventBus/DI/ErrorCenter) - ☑ T-M0-06 引入桥 JS(lzyzsd 原文件 + BridgeJsLoader) - ☑ T-M0-07 App 入口与路由壳(Navigation;真机验证启动→路由→回传→横屏) **M1 任务明细**: - ☑ T-M1-01 IWebController + WebviewControllerAdapter(emitter UI 线程守卫) + FakeWebController - ☑ T-M1-02 Message + MessageCodec(lzyzsd 二次转义逐字复刻 + 单引号转义修复) - ☑ 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.sh(DevEco 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 StartupOrchestrator:INIT→…→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 任务明细**(进行中,8/17): - ☑ T-M3-15 RoomStubProvider/PayStubProvider(§6.5 占位桩,全 void、不触发出站) - ☑ T-M3-04 VibrateProvider(vibrator/repeatvibrator/canclevibrator) - ☑ T-M3-05 ClipboardProvider(gameCopytext/gamepastetext) - ☑ T-M3-01 AppSystemProvider(orientation/browser/finsh/openApplyDownloadpath/notification空) - ☑ T-M3-02 DeviceProvider(getTime/getphonestate/getbattery/getwifiLevel/getcompareCode/getphoneInfo/getmarketname/getothername/getOther) - ☑ T-M3-03 NetworkProvider(getnetwork + 出站广播) - ☑ T-M3-08 ShakeProvider(@ohos.sensor 加速度合力阈值 + shakeEnd) - ☑ T-M3-09 LocationProvider(geoLocationManager 定位+逆地理编码,用时申请权限,错误码 0/-1/-2) - ◐ T-M3-10 AudioProvider(AVPlayer 播放完成:mediaTypeAudio/srcIsloop/voicePlaying + gameui_play/stop_voice; **录音 prepareaudio 分档**:platform QiniuUploader(@qiniu/upload,token 走服务端)就绪,待按住说话手势+麦克风+七牛服务端 token) - ☑ 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截图→sharesuccess;QQ/抖音 @kit.ShareKit 系统分享;截图经 CapabilityContext.captureCanvas);**另支持 H5 主动 POST 截图上传链路**(LocalUploadServer→PHOTO_UPLOAD→微信图片分享,对齐原 OkHttpPhotoServer) - ☑ T-M3-14 LoginProvider(微信授权取 code;profile 换取待服务端端点,AppSecret 不入端) - ☑ T-M3-06 NavProvider(随 M4 完成):OpenurlTitleData(开通用容器+101回传)/SwitchOverGameData(同容器切换+app_data重注入)/getGameinstall(同步)/backgameData(返回大厅) - ◐ T-M3-16 前后台 appservice(容器 EventBus 联动已就位,随 EntryAbility 前后台触发) - ☐ T-M3-17 契约一致性回归(全 44 入站逐条真机核对) > 已落地 Provider 当前为 **build 验证 + 契约逐字对齐**;真机逐条验证在 T-M3-17 回归阶段统一做(最小回显页不覆盖业务 handler)。 > getcompareCode 已接启动期版本决策(KvStore 缓存网络 App 版本);app_gamename 已解析 version.xml 子 game name;EchoSampleProvider 已移除(getTime 由 DeviceProvider 提供);ShareProvider 已完整(微信真分享待开放平台注册做真机验证);LoginProvider profile 换取仍待服务端。 **M2 期间确立的项目决策/偏差**: - file:// 跨域采用 `WebviewController.setPathAllowingUniversalAccess([filesDir/tsgames])`(官方"本地资源跨域"方案),优于通用 onInterceptRequest 代理。 - 沙箱路径简化:弃用 Android 的 `<包名>/<时间戳>` 多级目录,用固定 `filesDir/tsgames/`(§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`/`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-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-07(V1)通过** + 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`:加载前写 `/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-08(V2)通过**。 > **注**:`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-* | **延后 M6**:最大包体头微信/七牛 SDK 至 M6 才真集成,现裁剪意义有限;HAR 不支持条件编译,真裁剪须 HSP 化 | 1 | 桥/台 | --- ## M6 · 暂缓能力集成(按需,可延后) | ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 | |---|---|---|---|---|---|---| | **T-M6-01** | 视频房真实 | `RoomProvider`(声网 RTC HarmonyOS SDK)替换桩 | M3 完成 | `createRoom/exitRoom/getVideoinfo/DragViewvideoIsshow` + 出站 `getVideoinfo` 真打通;H5 零改动 | 视 SDK | 能 | | **T-M6-02** | 支付真实 | `PayProvider`(浏览器收银台/或 App 内支付)替换桩;如启用 App 内支付则补 `PayuserPaytypePaystate` | M3 完成 | 支付闭环;H5 零改动 | 视 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 | | **合计(M0–M5)** | **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.1–5.2 桥协议/控制器 | T-M1-02/03/04/05 | ✓ | | §5.3 同步/异步 | T-M1-04 + 各 Provider | ✓ | | §5.4 裸串vsJSON | T-M0-04(payloadType) | ✓ | | §5.5 线程模型 | T-M1-04(UI 守卫) | ✓ | | §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-08(V2 阻塞验证) | ✓ | | §8.1 启动状态机 | T-M2-11 | ✓ | | §8.2 ConfigManager | T-M2-05 | ✓ | | §8.2 分层覆盖 | T-M2-06(VersionResolver) | ✓ | | §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-05(Tracer)、T-M5-06 | ✓ | | §10 ErrorCenter | **T-M0-05**(已含 ErrorCenter) | ✓ 已补 | | §10 事件总线/DI | T-M0-05 | ✓ | | §10 权限 | T-M2-04(PermissionGuard) | ✓ | | §10 安全 | T-M5-05 | ✓ | | §10 可测试 | T-M1-01/08 + 各单测 | ✓ | | §11 可追溯矩阵 | [02 测试与验收 §4](./02_测试与验收计划.md) 契约核对清单 + 本矩阵 | ✓ | | §12 路线图 M0–M6 | 本 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、包体裁剪四处缺口。