11 Commits
Author SHA1 Message Date
lanterngamescnandClaude Opus 4.8 e75f567948 修复 SwitchOverGameData 解析失败致无法跳转子游戏
H5 对 SwitchOverGameData 的 data 字段直接传 JSON 对象(如 {webtype:3,...})。
Android org.json getString 会把嵌套对象强制转为 JSON 字符串再交 handler JSON.parse;
而 ArkTS JSON.parse 保留为对象,handler 再 JSON.parse(对象) 得到 "[object Object]"
→ Invalid Token、解析失败、不发 SWITCH_GAME、不跳转。

- MessageCodec.toArray:新增 coerceToString,对 data/responseData 复刻 org.json
  getString 语义(对象/数组→紧凑 JSON 串,数字/布尔→字符串)。
- NavProvider:webtype 统一 String() 化,避免下游 `webtype !== '2'` 对数字恒真
  把竖屏子游戏错误强制横屏。

对应契约 §11.1 路径A、§2.4 Message。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 01:55:40 +08:00
lanterngamescnandClaude Opus 4.8 b461b291f5 M5(T-M5-06): 可观测——BridgeTracer 全链路 traceId + ErrorCenter→APM sink
- Message 加非协议 traceId 字段(不进 toJson/toArray,对 H5 透明)
- BridgeController 在 OUTBOUND/INBOUND/HANDLER/RESPONSE/DISPATCH/RETURN/DROP
  各阶段打点,一条桥消息往返可经 traceId 还原
- entry 新增 ErrorReporter.installErrorSink(),打通 ErrorCenter Report→APM/Crash
  上报通道(结构化字段就位,接入真实 SDK 仅改 reportToApm)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 07:09:14 +08:00
lanterngamescn 9be1a23635 review: M5 双 Web 审查后的质量加固(两轮真机验证)
八角度审查双 Web 批次。修确凿问题:

铁律风险(最高)
- network_config:base-config cleartextTrafficPermitted 由 false 改 true。我之前的"白名单收紧"比平台默认更严,
  会拦掉 H5 可能访问的任意第三方明文 http 与本地 127.0.0.1 上传 → 违反 H5 零改动。改回允许明文(对齐原 Android)

正确性
- 子游戏 controller 不再复用:每次进子游戏 new WebviewController()(存 slotS.controller),消除"复用同一 controller
  时 onControllerAttached 不再触发致第二个子游戏建不出桥"的竞态。真机两轮验证 subB 桥正常 ✓
- BridgeController.dispose 置 active=false:显式抑制 dispose 后能力延迟异步 callHandler(不靠 adapter emitter-off 偶然安全)
- WebSlot.resumeLoaded 补发 setPostUrl:覆盖"非激活期渲染崩溃重载后 onFirstProgress 被闸门抑制丢失上传地址"。真机验证返回必带 setPostUrl ✓
- onRenderExited 不可见时延迟重载:非激活槽崩溃标记 needReload,激活时再 reload(官方建议可见后重载);activate 返回是否重载,resumeLoaded 据此避免重复推送
- 容器 aboutToDisappear:先退订 cancels 再 dispose 槽,关闭销毁期事件又建槽窗口
- LocationProvider:权限对话框 await 后加 disposed 守卫(防 onDestroy 后再注册监听泄漏+打已弃桥)
- AudioProvider:createAVPlayer.then 加 disposed 守卫(创建期已销毁则直接 release,防孤儿播放器泄漏)
- NetworkProvider.onForeground:重订阅后补播当前网络(覆盖非激活期网络变化,避免 H5 状态陈旧)

研判驳回:network_config 需 metadata 关联(官方文档证实 profile 路径自动识别);app 前后台只发 activeSlot(非激活大厅已收 appservice'2',正确)。
延期:WeChatApi 单例陈旧回调(随微信集成)。

devecocli build + scripts/test.sh 通过;模拟器两轮(大厅↔subA↔大厅↔subB↔大厅)无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 00:13:44 +08:00
lanterngamescn a865ac766b M5: BridgeController 激活闸门 setActive(双 Web 基础件)
- BridgeController 加 active 状态 + setActive/isActive:
  - 非激活:onLoadIntercept 拦截 yy:// 但不分发(入站忽略)、dispatch 直接返回(出站抑制)
  - 保证双 Web 下"同时只有一个 Web 执行桥接口",且去激活端不会收到 native 推送
- 去激活顺序约定:先 callHandler(appservice,'2')(彼时仍激活),再 setActive(false)
- 单测新增 inactive_gate_suppresses_outbound_and_inbound;scripts/test.sh 通过
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 23:25:49 +08:00
lanterngamescn 98854f7312 M4: 通用网页容器 + SettingsProxy + NavProvider + 子游戏切换
T-M4-01/02/03 GenericWebContainer(§11.3 第二套机制,不挂桥):
  - javaScriptProxy 注入 settings 对象 6 方法(SettingsProxy,函数回调避开 ArkTS 对象字面量限制)
  - 首次 100% runJavaScript 直调 getWebdata('<data>');返回键 isbackfinishweb→gamebackkeydown /
    isexitdialogeshow→退出确认→backgameData();关闭 pop({data}) 101 语义回上层
  - orientation "1"竖/其他横(window.setPreferredOrientation);browser 隐式 want
T-M3-06 NavProvider:OpenurlTitleData(开通用容器,onPop→callHandler getWebdata)、
  SwitchOverGameData(同容器 loadUrl 切子游戏+重注入 app_data(launchtype'1')+方向+复位首屏标志)、
  getGameinstall(同步 1/0 查 <解压根>/<dir>/index.html)、backgameData(重载大厅+待加载后 getWebdata)
导航解耦:common NavEvents(名+具名 payload interface);NavProvider 发 EventBus → BridgeGameContainer 执行
  (容器持 pathStack/controller)。EventBus payload 放宽为 Object(ArkTS 禁 Record 字面量),用 GenericEventData
domain AppDataInjector.buildValues 复用(StartupOrchestrator + 子游戏切换共用,去重)
组装根装配 NavProvider

devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 20:58:10 +08:00
lanterngamescnandClaude Opus 4.8 bdb920f61e review: M0/M1 成果审查后的质量加固
三路独立审查:桥引擎(对照 lzyzsd 逐字)与契约 SSOT(对照原 Android 44 handler)
两个命门维度【零问题】;以下为架构/质量改进项的修复:

- [安全红线] BridgeGameContainer setWebDebuggingAccess 加 AppEnv.isDebug() 守卫
  (common 新增 AppEnv,用 bundleManager.appInfo.debug 运行时判断,release 自动关闭,
  消除 CLAUDE.md 附录B 红线违反)
- [生命周期] BridgeController 加 dispose() 清回执表/注册表/启动队列;HandlerRegistry 加
  clear();容器 aboutToDisappear 先 dispose 桥再 dispose adapter 并置空,防残留命中/泄漏
- [事件总线] EventBus.on/once 返回取消函数支持 per-subscriber 精确退订;off→offAll 并
  标注谨慎(避免 M3 多容器订阅 appservice 时误注销他人回调)
- [单测] 加强 escape 断言覆盖内层 " 加倍(命门);新增 dispose 用例;16 用例全通过,
  桥核心覆盖率 89.0%
- [记录] Index.pageMap param as 运行期不校验,M4 外部 scheme 唤起时需补校验(已注释)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 13:16:37 +08:00
lanterngamescnandClaude Opus 4.8 3e2b1282ba M1: 容器接桥 + V1 阻塞性验证通过(T-M1-05/06/07)
- BridgeGameContainer 挂 Web + 接桥:onControllerAttached 建桥/注册 handler、
  onLoadIntercept 接桥、onPageEnd 注桥 JS + 补发启动队列、aboutToDisappear 释放
- test_echo.html 最小回显 H5(getTime 往返 + nativeEcho 特殊字符转义往返)
- 修复:dispatch 出站补转义单引号——lzyzsd 原版遗漏,_handleMessageFromNative('...')
  单引号包裹下 data 含 ' 会破坏字符串;补转义对 H5 透明(JSON.parse 仍得原始 data)
- ⚠ V1 真机通过:yy:// 被 onLoadIntercept 捕获、_fetchQueue 经 yy://return 回传、
  双向回执、含 "\/'中文 特殊字符转义往返一致。技术路线成立,无需回退

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 09:01:35 +08:00
lanterngamescnandClaude Opus 4.8 206db9730a M1: 桥引擎核心(T-M1-01~04)
100% 复刻 lzyzsd/JsBridge(对照原 Android com.tagmae.jsbridge 逐字):
- IWebController + WebviewControllerAdapter(emitter UI 线程守卫,§5.5) + FakeWebController(单测用)
- Message(5字段,undefined省略) + MessageCodec(toJson/toArray + dispatchMessage 两次正则转义逐字复刻)
- HandlerRegistry + 空实现 DefaultHandler 兜底(H5 调用永不报错最后防线)
- BridgeController:onLoadIntercept(decode→yy://return/yy://)/callHandler/send/onPageEnd/
  flushMessageQueue(_fetchQueue 经 yy://return 回传,非 runJavaScript 返回值)/handleReturnData/
  启动队列补发;对能力零感知、纯逻辑可测
- build 编译通过(ArkTS 严格)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 08:51:11 +08:00
lanterngamescnandClaude Opus 4.8 f89275ea4b M0: 引入桥 JS(T-M0-06)
- WebViewJavascriptBridge.js 原样复刻到 feature_bridge/src/main/resources/rawfile
  (与原 Android assets 去尾随空白后逐字一致,lzyzsd 协议 100% 复刻)
- BridgeJsLoader:从 rawfile 读取桥 JS(getRawFileContentSync + TextDecoder)并缓存,
  供 M1 BridgeController 在 onPageEnd 注入;HarmonyOS 走 runJavaScript 无需去注释
- 经 build smoke 验证 rawfile 读取 API 签名与编译通过

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 07:41:11 +08:00
lanterngamescnandClaude Opus 4.8 424c5f4d94 M0: 忽略 hvigor 生成物 BuildProfile.ets(保持仓库干净)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 06:59:12 +08:00
lanterngamescnandClaude Opus 4.8 6de9038a54 M0: 搭建多模块工程骨架(T-M0-01/T-M0-02)
- 在 entry 基础上新增 6 个 HAR:contracts/common/platform/domain_resource/feature_bridge/feature_capabilities(框架§4 工程结构)
- 依赖单向向下、无环、无传递依赖(T-M0-02):
  contracts←common←platform←domain_resource;feature_bridge←(contracts,common);
  feature_capabilities←(全部下层);entry←(全部下层)
- 各 HAR 含 build-profile/hvigorfile(harTasks)/module.json5(type:har)/Index.ets 导出入口
- devecocli build(debug) 全模块编译通过,entry 打包 HAP 成功

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 06:58:29 +08:00