lanterngamescn and Claude Opus 4.8
7179e95da1
调试:onConsole 转发 H5 console 到 hilog(debug 限定)
...
便于排查 H5 渲染/行为问题(如动画、缩放)。release 不转发以免噪声。
(移除临时诊断探针,保留 onConsole。)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 21:33:57 +08:00
lanterngamescn and Claude Opus 4.8
d16c7259b4
修复 H5 缩放等动画不播放:大厅 Web 首次显示补 onActive()
...
ArkWeb 文档:onInactive 态会暂停"可安全暂停的内容,例如动画"(CSS 动画/rAF),onActive 恢复。
本工程 controller.onActive() 原仅在从子游戏返回(activate)时调,**首次进大厅从未调用**,
大厅 Web 处于未激活态 → CSS transform/keyframes 动画与 requestAnimationFrame 被暂停,
表现为"画面在、但缩放等动画卡住不播放"。
修复:WebSlot 增 notifyShown()(调 controller.onActive(),幂等),在 setup() 激活槽建好即调,
并在 BridgeGameContainer 的 NavDestination.onShown 调用(首次进大厅 + 从通用网页返回均覆盖)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 21:19:33 +08:00
lanterngamescn and Claude Opus 4.8
5b9cfedb53
compatibleSdkVersion 设为最低基线 5.0.0(12),最大化设备覆盖
...
最低兼容 API 应覆盖尽量多设备,而非盯最新版。本项目定位 HarmonyOS NEXT API 12+
(CLAUDE.md),API 12(5.0.0) 为 NEXT 首发版本、覆盖面最广。compatibleSdkVersion 从
6.1.0(23) 进一步降到 5.0.0(12);编译通过(无高于 12 的 API 调用),targetSdkVersion 仍 6.1.1(24)。
真机(API23)/模拟器(API24) 及任意 API12+ 设备均可安装。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 21:06:28 +08:00
lanterngamescn and Claude Opus 4.8
f52f0707d7
修复真机安装:compatibleSdkVersion 降到 6.1.0(23) 匹配设备 API
...
真机(TLR-AL00) apiVersion=23(6.1.0)/Release,工程 compatibleSdkVersion=6.1.1(24) 要求
最低 API 24 > 设备 23 → "compatibleSdkVersion 与设备 apiVersion 不匹配"装不上
(releaseType 两端均为 Release,实际卡的是 API 版本)。
降 compatibleSdkVersion 至 6.1.0(23)(targetSdkVersion 仍 6.1.1(24)),真机+模拟器(24)均可装。
实测真机 install bundle successfully。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 21:04:28 +08:00
lanterngamescn and Claude Opus 4.8
81ba09b597
H5 全屏适配:Web 扩展系统安全区,消除底部白边
...
大厅/子游戏(BridgeGameContainer)与通用网页(GenericWebContainer)的 Web 组件加
.expandSafeArea([SYSTEM],[TOP,BOTTOM]),让 H5 铺满系统安全区(底部导航手势区),
消除底部白边,与原 Android 全屏 WebView 一致。模拟器验证:大厅满屏到底,无白边。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 20:56:51 +08:00
lanterngamescn and Claude Opus 4.8
f839c5b413
启动页:阶段提示文字移到进度条下方
...
SplashPage 覆盖层顺序调整为 进度条 → 阶段文案(原为文案 → 进度条)。模拟器验证通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 20:49:08 +08:00
lanterngamescn and Claude Opus 4.8
2702b619a7
启动改为:纯白启动窗 → 全屏 splash 启动图
...
- startWindowIcon 改为透明图 start_window_blank.png(108×108),系统启动窗仅剩白底 → 纯白屏
(顺带消除 startWindowIcon 超 144px 限制的构建警告)。
- SplashPage 恢复用全屏启动图 launch_image(ImageFit.Cover)+ navy 阶段文案 + 金色进度条。
- 删除不再引用的 startIcon.png。
时序:纯白启动窗 → 淡入全屏启动图(大 logo)+进度。系统窗无 logo,不存在两套资源比例不一致问题。
模拟器验证:首屏纯白,随后全屏启动图 + "准备游戏资源/正在下载更新NN%"。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 20:46:08 +08:00
lanterngamescn and Claude Opus 4.8
fbad796ab3
清理:删除已无人引用的 launch_image,闪屏资源统一为单一 startIcon
...
系统启动窗(startWindowIcon)与 SplashPage 现已统一引用同一个 $media:startIcon,
横图 launch_image 因系统启动窗无法铺全屏图而被淘汰、已无任何引用,删除以保证
"一套闪屏资源"单一来源,避免再次出现两套资源比例漂移。devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 20:33:57 +08:00
lanterngamescn and Claude Opus 4.8
4877e13f9a
闪屏一致性修复:SplashPage 复刻系统启动窗,消除两屏比例不一致
...
根因(代码层面):启动有两套不同资源/渲染的"闪屏":
- 系统启动窗(module.json5 startWindowIcon=$media:startIcon):1024×1024 方形(1:1),系统居中按图标尺寸渲染;
- ArkUI 闪屏(SplashPage):launch_image 2436×1125 横图(2.17:1),ImageFit.Cover 全屏铺满,logo 明显更大。
两套资源宽高比与 logo 占比都不同、渲染机制不同 → 同一 logo 两屏尺寸/比例不一致,切换跳变;
且系统启动窗图标尺寸系统固定、无法放大到全屏,只能让 ArkUI 闪屏向系统启动窗看齐。
修复:SplashPage 改为白底 + 居中显示**同一个 startIcon**(同资源/同宽高比/同位置),进度条置底。
两屏视觉一致,切换无跳变。(模拟器实测:系统启动窗在该机型渲染为纯白,序列为
白底→白底+logo淡入+进度,全程白底、logo 单次出现尺寸恒定。)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 20:30:38 +08:00
lanterngamescn and Claude Opus 4.8
ccf5a2acec
启动闪屏体验修复:品牌启动窗 + 阶段中文文案 + 白底可见的进度条
...
针对"首屏白底系统窗、闪屏文字不可见、缺阶段提示"修复:
- startWindowIcon(startIcon.png) 由 DevEco 默认蓝色图标换成与闪屏一致的品牌 logo
(白底+金色游戏手柄+快乐游戏健康生活),系统启动窗与 SplashPage 无缝衔接,消除白屏突兀感。
- SplashPage:
- 修复白色文字在白底闪屏上不可见的问题,改用品牌 navy 文字 + 金色进度条/加载圈。
- 各启动阶段展示中文文案:读取本地配置/检测网络权限/获取配置文件/检测升级版本/
准备游戏资源/正在下载更新NN%/即将进入大厅;下载阶段进度条实时推进。
模拟器验证:系统启动窗=白底金 logo;SplashPage 0.4s 显示"准备游戏资源35%",
下载期显示"正在下载更新69%"金色进度条。
注:网络/震动/传感器为 normal 级权限,安装即授予、无运行期弹窗(HarmonyOS 正常行为,非缺陷);
定位为 user_grant,按设计在 H5 首次调用定位能力时才弹窗,启动期不申请。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 18:07:35 +08:00
lanterngamescn and Claude Opus 4.8
0fcee6de1e
文档同步:远程配置格式按线上真实格式纠正(契约§4.3/4.4 + 框架指南 + WBS)
...
代码已对齐线上真实远程配置格式,同步修订设计文档(此前 §4 误录为废弃的
Bean1/GameupdateUtil 格式,会误导后续开发):
- 契约§4.3 配置 JSON 改为真实格式:顶层仅 agentlist、层级 agent→game→channel→market、
资源字段 game_zip、marketid/版本为数字、无二级 url 二次请求;附旧格式纠正说明。
- §4.4 分层匹配改为真实遍历与累积规则 + gameid 回退 version.xml。
- §4.2 gameconfig 改生产端点;§5.4/启动流程图 game_download→game_zip;验收清单同步。
- 框架设计指南 §8.2/§8.3/落地映射表、Plan WBS T-M2-05/06 描述同步。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 17:57:05 +08:00
lanterngamescn and Claude Opus 4.8
799e78d8af
启动链路真实化:版本解析层对齐线上配置,复刻 Android chuliversion_1(H5 零改动)
...
对照原 Android 工程 + 线上实测配置,修正 4 处会破坏 H5 适配的根因:
1. 配置树层级改为真实的 agentlist→gamelist→channellist→marketlist
(原抄了废弃 Bean1 的 agent→channel→market→game)。
2. 资源下载字段名 game_download → 真实的 game_zip(原永远取空,资源升级永不触发)。
3. marketid/版本为数字,匹配/比较做 string↔number 归一(原 === "3" 永不命中 market 层)。
4. 大厅 app_config.gameid 为空时回退 version.xml 的 <game id>(复刻 versd.getGameid()),
否则大厅永远定位不到自己的 game_zip。
实现:
- RemoteConfig/VersionResolver 按真实格式重写,VersionResolver 复刻 chuliversion_1
的 game/channel/market 三层累积 + market 层 app 升级,"0"/空不覆盖。
- ConfigManager 拆分 fetchRemote(IO) / resolveWith(纯函数 + gameid 回退),移除失效的二级 url 编排。
- VersionXml 补解析 <game id>;ResourceManager 增 localGameId()。
- StartupOrchestrator 调整时序:内置资源(version.xml 种子)就绪→取 gameid→解析远程,拉取仍并行。
- 内置 gamehall_builtin.zip 改为真实版本种子(game id=G2hw... version=42),离线首启阻断、联网下载真实大厅。
- app_config.json gameconfig 切生产端点(去 _test),不再使用测试配置。
- VersionResolver 单测重写为真实格式 + 线上大厅样例。
注:远程配置格式属原生内部消费(H5 不可见),按铁律以线上服务器为准对齐。devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 17:43:20 +08:00
lanterngamescn and Claude Opus 4.8
4b671c7437
素材接入:分享面板图标 + 启动闪屏 + App 图标(从 docs/Res 拷入)
...
- 分享图标:shareWechat/QQ/Douyin@3x → entry media,SharePanel 颜色块占位替换为
真实图标 Image($r('app.media.share_*'))
- 启动闪屏:LaunchImage(2436x1125 横屏) → launch_image,SplashPage 改为全屏背景图
+ 底部叠加启动进度/公告(白字)
- App 图标:AppIcon 替换 AppScope/entry 的 layered_image foreground 前景层
docs/Res 为只读原始素材库,按需拷入;显示效果待真机/模拟器确认
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 12:24:42 +08:00
lanterngamescn and Claude Opus 4.8
4e2b00b4b7
计划进度:LocalUploadServer 落地 + 分享截图上传链路
...
- T-M2-04 LocalUploadServer 从骨架→已落地(本机 HTTP server)
- T-M3-13 补 H5 主动 POST 截图上传链路(对齐原 OkHttpPhotoServer)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 08:20:02 +08:00
lanterngamescn and Claude Opus 4.8
187e73a549
M3(T-M2-04/T-M3-13): LocalUploadServer 截图上传分享链路落地
...
补「H5 主动 POST 截图上传分享」链路,对齐原工程 OkHttpPhotoServer + savehandler:
- LocalUploadServer 从骨架实现为真实本机 HTTP server(@ohos.net.socket TCPSocketServer):
127.0.0.1:8099 起逐端口重试 listen;手解极简 HTTP/1.1(\r\n\r\n 分隔 + Content-Length
累积读全 body);仅 POST /testurl,body 取 base64(form name=/raw 兼容)+type → emit
PHOTO_UPLOAD → 回 200;非 /testurl 回 404;16MB 上限;异常 log 不崩溃。
baseUrl 反映实际端口。注:TCPSocketServer 无显式 close,stop 用 off('connect')+释放引用
- common ShareEvents.PHOTO_UPLOAD + PhotoUploadPayload
- ShareProvider:订阅 PHOTO_UPLOAD(仅激活槽处理,避免双实例重复分享)→ 落盘 → 微信图片
分享(type=="1"好友/其他朋友圈)→ sharesuccess;onDestroy 退订;抽 wechatImageByFriend/
wechatSceneByFriend 供面板截图与 POST 上传两条链路共用
真机验证项:H5 真实 POST body 格式、127.0.0.1 端口可达、微信开放平台注册
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 08:19:21 +08:00
lanterngamescn and Claude Opus 4.8
cb3673cb1b
计划进度:M3 补全(分享面板/getcompareCode/app_gamename/EchoSample 移除)
...
- T-M3-13 更新为对齐原工程分享面板(微信SDK + QQ/抖音系统分享)
- 备注更新:getcompareCode 接版本决策、app_gamename 已解析、EchoSample 已移除
- M3 余项:T-M3-17 真机回归、录音 prepareaudio/微信注册 待外部
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 08:01:03 +08:00
lanterngamescn and Claude Opus 4.8
5cbe5d4dd0
M3(T-M3-13): 分享面板对齐原工程——微信SDK + QQ/抖音系统分享
...
对齐 Android SharePanelHelper 流程:H5 friendsSharetypeUrlToptitleDescript →
原生弹自定义面板(微信/QQ/抖音) → 按所选平台分享。
- common ShareEvents:SHOW_PANEL + SharePanelRequest/Result;ShareProvider 经一次性
resultEvent 与 entry 容器一对一解耦(双槽实例隔离,避免广播串扰)
- ShareProvider 重构:微信走 SDK(type2 Canvas截图→WXImageObject / 其他→WXWebpageObject;
scene 好友/朋友圈;回传 sharesuccess);QQ/抖音走 @kit.ShareKit 系统分享(文本/图片/链接/视频,
不集成对应 SDK、不回传);截图失败统一降级
- 截图:CapabilityContext.captureCanvas(WebSlot 用 controller.runJavaScript 取 canvas
toDataURL,非激活/出错返回空);FileSystem.writeBytes 落盘;fileUri 给 WXImageObject/系统分享
- entry SharePanel 组件 + BridgeGameContainer 顶层叠加;重复面板/销毁均取消回投防 once 悬挂
真机验证项:微信开放平台注册后的真分享、系统分享面板拉起、canvas 截图
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 08:00:03 +08:00
lanterngamescn and Claude Opus 4.8
01e4c0e99e
M3 补全:移除 EchoSample 样板 + getcompareCode 接版本决策 + app_gamename
...
- 移除 EchoSampleProvider(组装根/导出/文件):M3 全部 Provider 已就位,
getTime 由 DeviceProvider 提供;样板回显仅 M1 测试页用,生产无依赖
- getcompareCode:启动期 StartupOrchestrator 把网络 App 版本(VersionDecision.appVersion)
存 KvStore(KV_KEY_NET_APP_VERSION),DeviceProvider 同步读出与本地 config.appversion 比较,
本地>网络→'1' 否则'0'(对齐 Android apputil.code 语义)
- app_gamename:VersionXml.parse 解析子 <game name>;ResourceManager.localGameName 暴露;
AppDataInjector.buildValues 接 gameName 参数;大厅/子游戏两处注入均填入
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 07:33:13 +08:00
lanterngamescn and Claude Opus 4.8
cc5db07ddd
计划进度:M5 收尾 03/06/07 完成,T-M5-08 延后 M6
...
- T-M5-03/06/07 标记完成(build 通过;真机量化/回归留真机阶段)
- T-M5-04/05 明细补 ☑(总览已完成,明细表对齐)
- T-M5-08 标 ⏸ 延后 M6(微信/七牛 SDK M6 才真集成);M6 登记承接
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 07:15:00 +08:00
lanterngamescn and Claude Opus 4.8
c00f639ef7
M5(T-M5-07): 冷启动优化——远程配置与内置资源准备并行化 + 耗时打点
...
- FETCH_REMOTE_CONFIG(网络 1-5s) 与 prepareBuiltin(本地拷贝解压 0.2-0.8s) 无数据
依赖,改为同时进行;总耗时由 max(远程,内置) 决定而非求和(节省 ~内置耗时)
- 各阶段加 [startup] 耗时打点(fetch_remote_config/prepare_builtin/update_game/total),
便于真机量化冷启动到首帧基线
- 行为变化注记:showmessage 阻断现发生在 prepareBuiltin 之后(并行所致),阻断时多做
一次幂等的内置准备;属罕见运营公告路径,无副作用,可接受
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 07:13:44 +08:00
lanterngamescn and Claude Opus 4.8
0a372f1339
M5(T-M5-03): 高频出站节流——通用 Debouncer/Throttler + 网络变化防抖合并
...
- common 新增 Debouncer/Throttler 工具(不在桥核心按 handler 名节流,避免桥核心
感知能力,违反零感知约束;由 Provider 自治应用)
- NetworkProvider:netAvailable/netLost/netCapabilitiesChange 三事件统一经 300ms
防抖,切网瞬间多次突发合并为一次出站;onBackground/onDestroy 取消待发
- 说明:连续定位已受系统 timeInterval:5(5s) 约束、Device 为被动查询,无需额外节流;
lzyzsd 协议 _handleMessageFromNative 单条语义,不做跨条合并(保 H5 零改动)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 07:11:48 +08:00
lanterngamescn and Claude 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
c0addf8ec2
M5(T-M5-05): 安全加固清单(明文HTTP白名单 + 日志脱敏审计)
...
- 明文 HTTP 最小授权:新增 resources/base/profile/network_config.json(网络栈自动识别)——
base-config 默认禁明文,domain-config 仅放行 daoqi88.cn(含子域 tsgames/gameaudio)。附录B "明文域名显式放行"
- 日志脱敏审计:grep 确认无 code/token/openid/unionid/AppSecret/AK/SK 明文落日志(命中均为 resultCode/responseCode/stub)
- 已完成项复核:WebDebug 仅 debug(AppEnv.isDebug)、密钥下沉(微信code/七牛tokenProvider)、file 跨域最小授权(仅 filesDir/tsgames)
- 自定义 scheme(gamepaywelcome/gamepaywx…)随支付 M6 落地(现声明未处理 scheme 会致意外唤起,故延期)
WBS:M5 标记 T-M5-01/02/04/05 完成;余 T-M5-03 节流/06 可观测/07 冷启动/08 包体
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 23:57:16 +08:00
lanterngamescn
1aa1ccf9af
M5(T-M5-04): onRenderExited 渲染崩溃兜底
...
- WebSlot.onRenderExited(reason):渲染子进程异常退出(崩溃/被杀/OOM)时 controller.refresh() 重载恢复,
重置 firstDone 使重载后重推 appservice/setPostUrl;disposed 守卫避免子游戏销毁期误刷
- BridgeGameContainer:大厅 Web 与子游戏 Web 各挂 .onRenderExited → 对应 slot 恢复
- 防渲染子进程崩溃白屏(框架 §9 内存/崩溃兜底、附录 B 渲染兜底)
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 23:52:42 +08:00
lanterngamescn
9abd571f43
M5: 显式化导航拓扑约束(无子游戏→子游戏,须经大厅)
...
确认当前实现已符合用户拓扑:大厅常驻不销毁、子游戏临时销毁、仅 大厅↔子游戏、
子游戏换子游戏须 backgameData 回大厅再 SwitchOverGameData 进新子游戏。
- switchGame 守卫拆分:已在子游戏中(subgameUrl!='')时忽略 SwitchOverGameData 并告警日志
(此前静默忽略);注释说明拓扑约束与正确流程。无功能变更,仅可观测性。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 23:49:47 +08:00
lanterngamescn
cf2eebdad9
计划进度:M5 T-M5-01/02 双 Web 架构完成(真机验证)
...
01_WBS:T-M5-01/02 标记完成(双 Web 槽 + WebSlot 激活协议 + Provider 前后台,真机验证大厅常驻/接口隔离/只一个激活);
M5 进入进行中,余 T-M5-03 节流/04 崩溃兜底/05 安全加固/06 可观测/07 冷启动/08 包体
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 23:37:35 +08:00
lanterngamescn
0eabcac7e9
M5: Provider 前后台生命周期(非激活槽真正停 native 活动)
...
forEachForeground/forEachBackground 此前扇出但多数 Provider 未实现 → 非激活槽 native 监听仍跑。补齐:
- ShakeProvider:onBackground 停传感器、onForeground 按 H5 意图(wantShake)恢复;区分 H5 请求态与实际监听态
- LocationProvider:onBackground 停连续定位、onForeground 按 wantContinuous 恢复(单次定位无需恢复)
- NetworkProvider:onBackground 注销网络订阅、onForeground 重订阅(抽 unsubscribe)
- AudioProvider:onBackground 停语音/音效播放(非激活端不出声)
至此"同时只有一个激活"在 native 侧也落实:去激活槽停传感器/定位/网络/音频;H5 侧由 appservice('2') 自停。
WeChat resp 路由保持现状(微信整体延期;双 Web 下发起槽持续存活,边缘情形见 m3-deferred 记录)。
devecocli build + scripts/test.sh 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 23:35:25 +08:00
lanterngamescn
d7148a72e6
M5(T-M5-01/02): 双 Web 大厅/子游戏架构 + WebSlot 激活协议(真机验证通过)
...
- 新增 entry/web/WebSlot:封装单 Web 的桥+能力+激活生命周期(setup/onLoadIntercept/onPageEnd/
onFirstProgress/activate/resumeLoaded/deactivate/onAppForeground/onAppBackground/dispose)
- BridgeGameContainer 重写为 Stack 双 Web:大厅常驻(始终在 Stack,subgame 时 Hidden+onInactive)、
子游戏临时(subgameUrl 非空时渲染,onControllerAttached 各自 setup);替换 M2/M4 单 WebView loadUrl
- 激活协议:进子游戏 deactivate(大厅 appservice'2'+forEachBackground+setActive(false)+onInactive)→
注入子游戏 app_data(LT'1')→建子游戏 slot→onFirstProgress(appservice'1'+setPostUrl);
返回 dispose 子游戏→大厅 resumeLoaded(appservice'1'+getWebdata)
- 每槽独立 BridgeController+buildCapabilities(结构隔离,接口不串);nav/前后台事件路由到 activeSlot
- 内置测试包升级:gamehall+subA 自动驱动页(大厅→SwitchOverGameData→子游戏→backgameData→大厅)
真机验证(Pura 90 全新装):LOBBY LT=0 appservice1→SwitchOverGameData→LOBBY appservice2→
SUB LT=1 appservice1+独立 getTime→backgameData→LOBBY appservice1+getWebdata=fromSub。
大厅无二次 ready=未重载=常驻保活 ✓;接口不串 ✓;只一个激活 ✓。无 registration failed/RenderExited。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 23:32:18 +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
f190fe69e3
M5 设计验证:file:// 存储共享真机验证通过 + 文档定稿
...
验证(临时 VerifyStoragePage 真机跑后已回退):
- localStorage:两个不同 file:// 路径(lsA/lsB)+setPathAllowingUniversalAccess 跨页共享 ✓(lsB 读到 lsA 写的值)
- cookie:file:// 不支持 WebView cookie;原 Android cookie 全在 native HTTP 层(Volley),WebView 未开 file-scheme cookie,
H5 不用 WebView cookie → 非缺口;http(s) cookie 由 WebCookieManager 应用级全局共享
- 结论:采用 file:// + setPathAllowingUniversalAccess + WebCookieManager(全局),无需自定义协议
文档:
- 框架新增 §7.5 双 Web 大厅/子游戏架构定稿(结构隔离/激活协议四联动/onInactive 不停JS的平台限制与 appservice 正解/存储验证结论/状态机/改造清单)
- 01_WBS:M5 标记"设计就绪",记存储验证通过
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 23:23:10 +08:00
lanterngamescn
d196b13e39
设计:确认 M5 大厅/子游戏双 Web 激活模型(用户约束)
...
用户明确:大厅 Web 常驻、子游戏 Web 进入创建/返回销毁(不保活);同时只一个激活(联网+收发包+界面更新),
非激活端 onInactive 彻底停网络+渲染;仅 大厅↔子游戏、无子游戏→子游戏;两 Web 各自独立桥+能力。
- 框架 §7.1:子游戏切换加"双 Web 激活模型"铁律块;M2/M4 单 WebView loadUrl 标为过渡实现
- 框架 §9:Web 保活/预热行改为双 Web 槽 + onActive/onInactive 模型
- 01_WBS:T-M5-01/02 重写为双 Web 槽(大厅常驻保活 + 子游戏临时 + 仅一个激活 + 各自独立桥),估时上调
- 记入项目记忆 m5-dual-web-activation-model
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 21:49:45 +08:00
lanterngamescn
6bec98d584
review: M3+M4 成果审查后的质量加固
...
八角度审查 15 Provider+微信/七牛+双容器+导航。桥核心/契约骨架基本无误;修确凿问题:
正确性/健壮性
- ShakeProvider:stop()/onDestroy 取消未决 shakeEnd 计时并复位 pending(修停止后仍触发出站、重启后首摇被吞、计时器泄漏)
- VibrateProvider:startRepeat 先 stopRepeat(修重复 repeatvibrator('1') 叠加出无法取消的孤儿计时链)
- PhotoProvider:JSON.parse 后 Array.isArray 守卫(修 H5 传非数组致 .map 抛错、出站永不下发使 H5 挂死);去不可达 .catch
- GenericWebContainer:getWebdata 直调改用 JSON.stringify 生成 JS 字符串实参(修 data 含换行/行分隔符断行致注入语法错误)
- LocationProvider:单次请求前先停连续监听(修连续后切单次仍持续推送);去 push() 中 !continuousOn→stopContinuous 死代码
加固/清理
- BridgeGameContainer:抽 firstReadyPush() 幂等助手(appservice/setPostUrl/pendingWebdata);保持 100% 触发时序
(注明为何用 100% 而非更早 onPageEnd:确保 H5 已注册 handler);aboutToDisappear 置空 hostCtx/config/resource
研判驳回(与原 Android 一致/契约默认/自愈):getphonestate CallState 值映射、通用容器 orientation 默认横屏、setMuted prepared 自愈、exitDialog backgameData() 无参通知。
延期(随微信集成):WeChatApi 单例陈旧回调/instanceof(容器重建后回调打旧 bridge;微信运行期本就待开放平台注册)。
记录待重构:AbstractProvider 基类 + parseJson 助手(去 15 Provider 重复 bridge/ctx/解析样板)、AVPlayer 复用、openBrowser/orientation 抽公共。
devecocli build 通过;单测通过;模拟器复测桥往返/appservice/setPostUrl 无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 21:30:06 +08:00
lanterngamescn
6bd0cf7488
计划进度:M4 完成、NavProvider(T-M3-06)完成
...
- 01_任务分解WBS:M4 标记完成;T-M3-06 随 M4 完成;M3 进度 16/17(余 T-M3-17 真机回归、录音待服务端)
- 真机冒烟:16 能力含 nav 全注册、桥 appservice/getTime/nativeEcho 往返无回归(无 registration failed/RenderExited)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 21:00:56 +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
lanterngamescn
ef04f4e9e1
计划进度:M3 批5(音频播放+七牛上传器,15/17)
...
01_任务分解WBS:T-M3-10 音频播放完成、录音分档(QiniuUploader 就绪);M3 进度 15/17;
余 T-M3-06 NavProvider(并入 M4)、T-M3-17 真机回归
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 20:14:29 +08:00
lanterngamescn
4a8524bcbe
M3(批5): AudioProvider 播放 + 七牛上传器(@qiniu/upload)
...
依赖:ohpm i @qiniu/upload@1.0.2(platform)
platform QiniuUploader:UploadFile.fromPath + key + createMultipartUploadV2Task(context,file,{tokenProvider})。
🔴 token 走 tokenProvider(服务端用 AK/SK 生成 uploadToken(bucket)),AK/SK 不入端——纠正原 Android 硬编码 AK/SK
T-M3-10 AudioProvider(@kit.MediaKit AVPlayer):
- mediaTypeAudio:播放语音 url → gameui_play_voice/gameui_stop_voice(user 透传)
- srcIsloop:播放本地 wav(<gameDir>/assets/wav/<src>,isloop 0一次/>0循环/<0停止)
- voicePlaying:静音总开关 setVolume
- prepareaudio:录音分档(QiniuUploader 链路就绪;按住说话手势+麦克风+七牛服务端 token 三依赖未就绪前安全空实现)
bucket/域名/key 规则对齐原工程(bucket gameauio、回放 http://gameaudio.daoqi88.cn/ <key>,由服务端 token 与 AudioProvider 接入时落地)
devecocli build 通过(CompileArkTS 编译七牛/音频无误)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 20:14:02 +08:00
lanterngamescn
829f267966
计划进度:M3 批4 完成(14/17,图片/摇/扫码/相机/定位)+ 真机回归冒烟
...
- 01_任务分解WBS:T-M3-07/08/09/11/12 标记完成;M3 进度 14/17;
余 T-M3-10 AudioProvider(录音上传需服务端,待单独推进)、T-M3-06 NavProvider(并入 M4)、T-M3-17 真机回归
- 真机冒烟:15 个能力全部注册成功、桥 appservice/setPostUrl/getTime/nativeEcho 往返无回归(无崩溃/RenderExited)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 20:02:54 +08:00
lanterngamescn
9dc3e2ddf7
M3(批4): 图片/摇一摇/扫码/相机/定位 Provider
...
T-M3-07 PhotoProvider:getphoto 批量下载到资源根 photos/(file:// 白名单内) → 出站 getphoto[{pid,photourl}],复用 Downloader 并行
T-M3-08 ShakeProvider:startshake/SwitchShake/stopshake,@ohos.sensor 加速度合力阈值检测+节流,~1s 后出站 shakeEnd(空串),反馈震动
T-M3-11 ScanProvider:opensaoma → @kit.ScanKit 默认界面扫码(免权限) → 出站 getsaomaData(originalValue)
T-M3-12 CameraProvider:opencamera → @kit.CameraKit cameraPicker.pick(免权限) → 出站 getcameraaAddress(resultUri)
T-M3-09 LocationProvider:startlocation(连续/单次,用时申请权限)/getlocationinfo(同步) → geoLocationManager 定位+逆地理编码 →
出站 getlocationinfo(MaplocationInfo;错误码 0/-1未就绪/-2权限拒绝)
module.json5 增 ACCELEROMETER/LOCATION/APPROXIMATELY_LOCATION;组装根装配 5 者
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 19:59:04 +08:00
lanterngamescn
841a964693
计划进度:M3 批3 完成(10/17,微信分享+登录)
...
01_任务分解WBS:T-M3-13/14 标记完成;M3 进度更新为 10/17
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 19:43:40 +08:00
lanterngamescn
b1e3ce7433
M3(批3): 微信分享 + 登录(@tencent/wechat_open_sdk)
...
依赖:ohpm i @tencent/wechat_open_sdk@1.0.19(feature_capabilities)
T-M3-13 ShareProvider:friendsSharetypeUrlToptitleDescript → SendMessageToWXReq(scene 会话/朋友圈)
+ WXWebpageObject → 回传 sharesuccess{success(2成功/3取消),type(1好友/2朋友圈)}。
type 2截图/3图片/4视频暂回退网页分享(TODO);微信未安装回 cancel 不卡死
T-M3-14 LoginProvider:accreditlogin("1"=QQ空实现/其他=微信) → SendAuthReq(scope snsapi_userinfo) → 取 code。
🔴 AppSecret 不入端:code 换 profile 必须服务端,无端点时记录 code+TODO,不推不完整 sharelogin(红线)
WeChatApi 单例:createWXAPI(AppID wxd2bd650e06bdfe58 公开标识) + sendReq + handleWant 路由 onResp
EntryAbility.onCreate/onNewWant → WeChatApi.handleWant(接收微信回调)
module.json5:querySchemes ["weixin"](isWXAppInstalled)
运行期成功前提(已注释说明):微信开放平台注册本 HarmonyOS 应用(bundleName+指纹绑 AppID)、登录 profile 需服务端 code 换取端点。
devecocli build 通过(CompileArkTS 编译微信代码无误)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 19:43:11 +08:00
lanterngamescn
89af002e95
计划进度:M3 进行中(批1+批2 完成,8/17)
...
01_任务分解WBS:M3 标记进行中,新增 M3 任务明细块(已完成 6 Provider+2 桩,余 摇/定位/音频/扫码/相机/图片/分享/登录/导航/回归)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 19:20:46 +08:00
lanterngamescn
7af1d7e834
M3(批2): DeviceProvider + NetworkProvider
...
T-M3-02 DeviceProvider:getTime/getphonestate(call.getCallState)/getmarketname/getothername(按名查本地配置)/
getOther/getcompareCode(暂返 '0' 待接版本决策) 同步返回;getbattery→getBattery(batteryInfo.batterySOC/100)、
getwifiLevel→getwifiLevel(wifiManager 信号 0~4)、getphoneInfo→getphoneinfo(deviceInfo;IMEI/IMSI/MAC 鸿蒙受限留空) 出站推送。
裸串 vs JSON、出站命名陷阱(getphoneinfo 小写/getBattery 大写)逐字对齐
T-M3-03 NetworkProvider:getnetwork 同步返回 1无网/2WiFi/3移动(connection.getDefaultNet+bearerTypes);
connection 订阅 netAvailable/netLost/netCapabilitiesChange 变化时出站广播 getnetwork;onDestroy 注销
module.json5 增 GET_NETWORK_INFO/GET_WIFI_INFO;组装根装配二者
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 19:19:54 +08:00
lanterngamescn
59b000ce7a
M3(批1): 占位桩 + 震动 + 剪贴板 + 系统能力 Provider
...
T-M3-15 RoomStubProvider/PayStubProvider:createRoom/exitRoom/getVideoinfo/DragViewvideoIsshow、
paybrowser/getGameplay 全 void 空实现+日志,绝不触发出站(§6.5 安全网)
T-M3-04 VibrateProvider:vibrator/repeatvibrator/canclevibrator(@ohos.vibrator,重复用递归 setTimeout)
T-M3-05 ClipboardProvider:gameCopytext/gamepastetext(@ohos.pasteboard,读取经 responseCallback 回执)
T-M3-01 AppSystemProvider:orientation(window.setPreferredOrientation 横/竖)、browser(隐式 want)、
finsh(terminateSelf)、openApplyDownloadpath(按包名启动失败回退浏览器)、notification(空)
组装根 buildCapabilities 装配上述 + 桩;module.json5 增 VIBRATE 权限
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 19:15:21 +08:00
lanterngamescn
4590d5bf70
review: M2 成果审查后的质量加固
...
三路+对照审查 M2 全部成果。桥核心(M1,本期未改)与契约骨架零问题;发现集中在新的资源/启动/容器代码,已修:
高危
- ResourceManager.updateGame 原子化:下载→解压暂存→校验 <gamestart>/index.html→才删旧并 rename 换入。
修复"先删旧 gamehall 再解压,失败即把可用资源砖掉"且 catch『keep local』失效的数据丢失风险
- BridgeGameContainer.setupBridge:先建桥并赋值 this.bridge,能力注册/配置加载整体兜底 try/catch。
修复"config/registration 抛错→bridge 永远 undefined→H5 所有 callHandler 静默"违反 H5 零改动铁律
中危
- VersionResolver:空 gameid 守卫(大厅不参与 game 树匹配,避免误命中 gamelist 空 id 节点);
两树 version 平手时取"有下载地址"的一棵(避免选中只有版本号无下载地址的层)。新增 2 单测,覆盖率 83.7%
- Downloader:dataReceive 写盘失败标记并于请求结束后抛出(避免磁盘满致截断文件被当作下载成功)
- FileSystem:rmrf 的 statSync 纳入 try(兑现"不存在/竞态则忽略"承诺);copyRawFileTo 按
byteOffset/byteLength 切片写入(避免 Uint8Array 为大池子视图时写入多余字节致 zip 损坏);新增 rename
- ConfigManager.fetchSecondary:二级节点本层版本字段也并入(此前只换 channellist/agentlist 会丢节点自身版本/下载地址)
清理/抗回归
- 跨域白名单路径改用 ResourceManager.resourceRoot()(单一来源,避免与领域层路径定义漂移致 V2 回归)
- 前后台订阅移到 setupBridge(桥就位后),避免冷启动 FOREGROUND 早于桥到达被丢
- prepareBuiltin 单次读取内置包(去掉"先整包读探测、再整包读拷贝"双读)
- LocalUploadServer 删死码 isRunning/running
- 文档化延期项:weburl 分支不注入 app_data(同 Android,远程大厅自带)、app_gamename 待 M3 扩展 VersionXml、
子游戏切换 firstProgressDone 复位 TODO(M3 T-M3-06)
devecocli build 通过;单测全通过;模拟器复测 app_data/V2 fetch/桥双向/特殊字符往返均无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 19:05:46 +08:00
lanterngamescn
40b8c2e91c
计划进度:M2 完成、R-02(V2 file:// 跨域)关闭
...
- 01_任务分解WBS:M2 标记完成(13 任务),新增 M2 任务明细块与决策/偏差记录
- 03_风险登记册:R-02 关闭(setPathAllowingUniversalAccess 方案 + 真机复测 OK)
- 框架 §7.3:file:// 跨域改为已验证的具体方案(setPathAllowingUniversalAccess),保留 onInterceptRequest 回退
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 18:43:18 +08:00
lanterngamescn and Claude Opus 4.8
2100faaef7
M2(V2 阻塞性验证通过): setPathAllowingUniversalAccess 解决 file:// 跨域
...
T-M2-08 V2:真机验证 file:// 加载下 H5 fetch/XHR 取本地资源——首测被 CORS 拦截
(origin 'null',file 协议不在允许跨域 scheme 列表,正是框架 §7.3 预判风险)。
启用官方方案 WebviewController.setPathAllowingUniversalAccess([filesDir/tsgames]),
对 H5 完全透明(仍 file:// 加载)。复测:V2 fetch/XHR OK。
真机端到端链路全通(Pura 90 模拟器):启动编排→远程失败降级本地→解压内置包→
注入 app_data.js→file:// 加载大厅→跨域 fetch OK→桥握手→getTime 回执→nativeEcho
特殊字符往返一致。app_data 全局变量、Launchtype=0、appservice/setPostUrl 下发均正确。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 18:41:42 +08:00
lanterngamescn
2b0bd1f392
M2(容器+能力骨架+启动接线): CapabilityProvider/Registrar/AppModule + BridgeGameContainer 完整化 + Splash 接编排
...
T-M2-13 能力插件框架骨架:CapabilityProvider/CapabilityContext 接口、CapabilityRegistrar(批量注册+生命周期转发)、
组装根 AppModule.buildCapabilities()(唯一知道全部能力处)、EchoSampleProvider 样板
T-M2-10 BridgeGameContainer 完整化:经 Registrar 注册能力(替换内联 handler)、首次进度 100% 推 appservice/setPostUrl、
加载 params.entryUrl(回退 test_echo)、前后台 EventBus 联动、aboutToDisappear 全量清理;getContext→getHostContext 去弃用
SplashPage:进入即跑 StartupOrchestrator,完成 replace 进大厅、showmessage 阻断弹公告、进度条
内置测试大厅 rawfile/gamehall_builtin.zip(gamehall/index.html+data/test.json+version.xml,正斜杠标准 zip),
作 M2 端到端 + V2(file:// XHR) 离线验证页;真实大厅由远程 zip 在生产下发
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 18:36:59 +08:00
lanterngamescn
d2da223c8d
M2(领域层): ConfigManager/VersionResolver/ResourceManager/AppDataInjector/StartupOrchestrator
...
T-M2-05 ConfigManager:本地 rawfile/app_config.json(§4.2 实测值)、远程 URL 拼装('-'→'/'+.txt+?a=ts 禁缓存)、
长度<30 走 showmessage 阻断、二级 url 二次请求(语义待真机校验)、产出版本决策
T-M2-06 VersionResolver:纯函数,agentlist/gamelist 两棵树 + agent→channel→market→game 后层覆盖 +
两树取更高 version(§4.4)。单测 8 用例全通过,覆盖率 81.8%(≥80%)
T-M2-07 ResourceManager:沙箱路径规范、内置包拷贝解压、version.xml 解析(@ohos.xml)、远程 zip 下载/删旧/解压、版本比较
T-M2-09 AppDataInjector:加载前写 <gameDir>/app_data.js(§6 全局变量同名同义,JSON.stringify 安全字面量)
T-M2-11 StartupOrchestrator:INIT→…→ENTER_HALL 状态机,远程失败降级本地、showmessage 阻断、weburl 空/非空入口规则
配套:module.json5 声明 ohos.permission.INTERNET + reason_internet 字符串
devecocli build 通过;scripts/test.sh 单测全通过(修复 PermissionRequestResult 顶层导入)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 18:29:45 +08:00
lanterngamescn
ecb0e4642a
M2(平台层): KvStore/FileSystem/HttpClient/Downloader/Unzipper/PermissionGuard/LocalUploadServer
...
T-M2-01 存储/文件:KvStore(preferences 持久化 urlpath/upurlpath)、FileSystem(fileIo 建删读写/列目录/拷贝内置 rawfile)
T-M2-02 网络/下载:HttpClient(GET 禁缓存,契约 §4.3)、Downloader(http 流式写盘+进度,原生异步不阻塞 UI)
T-M2-03 解压:Unzipper(zlib.decompressFile,原生异步)。偏差:下载/解压用原生异步 API 即满足"UI 不阻塞",
独立 TaskScheduler(TaskPool) 推迟到 M5 真有 CPU 密集任务(MD5)时再加,避免投机性死代码。
T-M2-04 权限/上传:PermissionGuard(用时申请,沙箱文件免存储权限)、LocalUploadServer(骨架,本机端口服务 M3 落地)
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 18:14:41 +08:00