 lanterngamescnandClaude Opus 4.8
|
c39d8eb400
|
refactor(config): 七牛/微信密钥外置——AK/SK+微信AppID 入本地 app_config, domain/bucket 走远程配置
- app_config.json + AppConfig: qiniu_access_key/qiniu_secret_key/wechat_app_id/wechat_app_secret(扁平snake_case)
- RemoteConfig.VersionFields + audio_domain/audio_bucket(4层可携带), VersionDecision + audioDomain/audioBucket
- VersionResolver.resolve 复用 pickStr 解析 audioDomain/audioBucket(4层逐级回退)
- QiniuToken.uploadToken(accessKey,secretKey,bucket) 改传参,去掉硬编码常量
- AudioProvider.doUpload: AK/SK取本地配置, domain/bucket取远程配置(cfg.resolve), URL用远程domain
- WeChatApi.configure(appId) 注入AppID(去WX_APP_ID常量), EntryAbility.onCreate 从配置注入
- 更新 QiniuToken 单测传参
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 19:12:43 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
e5d8eeb3b1
|
refactor(config): VersionResolver 抽成统一取值函数接口(与字段解耦)
matchedLayers() 一次算命中层链(含根伪层) + pickStr()/pickVer() 对任意字段做
4 层逐级回退取值;resolve() 各字段一行 selector 复用同一取值逻辑,新增字段免改取值核心。
替换原逐字段硬编码的 Acc.merge。行为不变,12 单测通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 18:52:22 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
a6ef891507
|
fix(config): VersionResolver 改为 4 层逐级回退(agent/game/channel/market 每层 merge 全字段)
原实现资源字段 game_zip/game_version 只在 game/channel/market 三层覆盖、app 字段只在
market 层,漏了 agent 层。按 4 层模型:每个字段取最深命中层非空值、深层缺省逐级回退到根。
Acc 合并为单个 merge() 每层调用。新增 agent层回退/app上浮回退/四层全覆盖 3 个单测。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 18:49:05 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
d335a589b6
|
修正 app_data.js 三处字段与 Android 不一致(H5 零改动)
§4.2 配置项接口逻辑审计发现 app_data.js 注入有三处偏离原 Android
inith5data(weclomeactivity1/NewwebviewActivity 两处实测一致):
1. app_version:Android 硬编码 `var app_version=1;`(数字常量,"初始化框架
加载方式"标志,非资源版本);原实现误用 res.localVersion()(如 "261" 且成
字符串)。改为固定数字字面量 1。契约文档 §6 此处亦误录为"version.xml 的
version",一并纠正。
2. app_gamename:Android 取 getAllFilename("gamestart")(即 'gamehall');原
实现误用 version.xml 的 <game name>(如"友乐游戏")。改为 config.gamestart。
3. app_getwifisignalLevel:Android 硬编码 `=1`(数字);原实现为字符串 '0'。
改为固定数字字面量 1。
buildValues 签名随之简化为 (config, launchtype),去掉不再需要的 version/
gameName 入参;大厅(StartupOrchestrator '0')、子游戏(BridgeGameContainer '1')
两调用点同步更新。buildJs 对 app_version/app_getwifisignalLevel 输出数字字面量
(无引号),其余字符串字段保持引号,逐字对齐 Android。
其余审计结论一致:11 个本地配置键读取一致(servertype/gameserver 契约标
"无代码读取"已正确省略);桥 handler getmarketname→market、getOther→other、
getothername→按名取配置(lookupConfig 全键 + 未知返回'')均与 Android getAllFilename
对齐。真机回归:大厅 V1.261 正常加载渲染。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 09:31:22 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
600378f723
|
修复子游戏/大厅每次启动都重复下载:version.xml 改用正则解析
现象:子游戏 zip 已下载解压、version.xml 落盘正常,但再次进入仍重新下载;
远程版本与本地一致本应跳过下载。真机诊断([VERXML-DIAG]/[SUBGAME-DIAG]):
installed=true、version.xml 原文完整(<version value="155"/>)、gameId 正确解析为
a52y...,唯独 localVer 恒为 0 → 155<=0 判否 → 每次都判需更新而重下。大厅同理
(localVersion 恒 0,启动期每次重下整包)。
根因:VersionXml.parse 用 @kit.ArkTS xml.XmlPullParser,其
attributeValueCallbackFunction 对本文件 <version> 的 value 属性不稳定触发(同文件
<game> 的 id 却能取到),逻辑自相矛盾——value 无条件捕获却落空,说明该属性回调
未按预期触发。
修法:弃用 XmlPullParser,改确定性正则直接从原文抽 version/gameId/gameName,语义
等价 Android pullxml1,规避解析器回调时序/属性触发的不确定性。根 <game> 无属性
(紧跟 '>'),\s+ 自然跳过,只命中带属性的子 game。
验证:真机覆盖安装后再次进入三个老K,localVer=155、不再下载,直接进 H5。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 09:18:48 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
de5b950d9b
|
实现子游戏按需下载,修复点子游戏白屏(§11.1 路径A)
根因:整包 gamehall.zip 顶层只含 gamehall,子游戏需按需单独下载;原 switchGame
直接 loadUrl 不存在的目录 → ArkWeb invalidFileUrl → 白屏。
对齐 Android NewwebviewActivity 的 updategamezip:
- ConfigManager.resolveGame(remote, gameid):以 gamedownloadurl 为 gameid 经
agent→game→channel→market 分层解析子游戏 game_zip/game_version(复用 VersionResolver)。
- ResourceManager.updateSubgame:下载→暂存解压→校验 <dir>/index.html→原子换入 urlpath/<dir>。
另加 subgameInstalled/subgameLocalVersion/subgameLocalGameId。
- BridgeGameContainer.switchGame 改 async + prepareSubgame:目录缺失先下载、已装比对远程
版本更高才更新;下载期复用启动页同款金色进度条;远程配置 10 分钟缓存(对齐 gameconfigtime)。
- SwitchGamePayload 增 gameId(gamedownloadurl)。
真机验证:点三个老K → 下载 sangelaok.zip(9.4M) → 解压加载,子游戏正常渲染
(V1.155 与配置 game_version=155 一致);日志不再 invalidFileUrl。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 02:33:55 +08:00 |
|
 lanterngamescnandClaude 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 |
|
 lanterngamescnandClaude 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 |
|
 lanterngamescnandClaude 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
|
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
|
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
|
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
|
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 |
|
 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 |
|