精简远程日志: 每次事件一条汇总, 细节只留本地
- MiliLog 新增只写本地通道 local/localWarn/localError
(队列改为 Entry(local, remote), remote 为 null 即只写本地、跳过 HTTP)
- 本地日志文件改为纯文本 yyyy-MM-dd HH:mm:ss.SSS LEVEL text, 单行上限 4000
(远程仍按 900 截断) —— 本地是"详细记录", 要人能直接读
- 逐源/逐次日志全部改本地:
· SongUrlResolver: i.php/do.php 异常、token 失败、do.php code、HTTP 4xx/5xx、
响应非 JSON、冷却跳过、403 提示、广告示例 URL
· KtvJsBridge: JS 控制台转发(量最大)、单次 HTTP-<status>、NET-ERR
- 结果: 每次取址远程恰好一条
成功 NATIVE-SONG 取址成功… / 失败 NATIVE-SONG 全部源失败… / 全广告 SOURCE-BLOCKED…
(改前 9 个源逐个上报, 一次取址 9+ 条)
- 保留: JS-BRIDGE…(状态变化)、点歌失败…(每首一行)、SONG-AD…(广告拦截) 仍上报远程
- AGENTS: 写日志约定新增第 5 条(远程=结论、本地=过程), JS 日志规则改为只进本地
版本号按规则 3: 1.5.7(39) → 1.5.8(40); 按要求未打包
验证: compileReleaseKotlin + 单元测试(9 例全过)
This commit is contained in:
@@ -195,8 +195,8 @@ $BT/apksigner verify 目标名.apk
|
||||
|
||||
### 版本号
|
||||
|
||||
- `app/build.gradle`:`versionName "1.5.7"` / `versionCode 39`
|
||||
(`1.5.5`/`37` 已发布;`1.5.6` = 更新源加 Gitee、`1.5.7` = 删除「歌曲源临时受限」弹窗,均尚未发布。18~21 曾被本机临时诊断包占用)
|
||||
- `app/build.gradle`:`versionName "1.5.8"` / `versionCode 40`
|
||||
(`1.5.5`/`37` 已发布;`1.5.6` = 更新源加 Gitee、`1.5.7` = 删除「歌曲源临时受限」弹窗、`1.5.8` = 精简远程日志,均尚未发布。18~21 曾被本机临时诊断包占用)
|
||||
- App 内显示统一用纯版本号(不加 `(versionCode)` 括号)
|
||||
- ⚠️ **发布构建已开启 NewApi 闸门**(`lint { checkReleaseBuilds true; fatal += ['NewApi'] }`):
|
||||
任何「调用了高于 `minSdk 21` 且未做版本守卫的 API」都会让 `assembleRelease` 直接失败。
|
||||
@@ -287,11 +287,11 @@ $BT/apksigner verify 目标名.apk
|
||||
`JS_REQUEST_TIMEOUT_MS`(180s) 预算,表现为**「无法生成下载地址」且日志里什么都没有**。
|
||||
正确写法:`Socket().connect(InetSocketAddress(host, port), connectTimeout)`;
|
||||
3. **失败必须上报**:裸通道失败打 `RAW-ERR`、HttpURLConnection 回退失败打 `NET-ERR` 到远程日志。
|
||||
- **JS 侧日志必须能进远程日志**:`ktv_api.js` 的 `_log()` 走 `console.log`(桥以 `debug:true` 实例化),
|
||||
默认只进 WebView 控制台、现场无法取证。`KtvJsBridge.wrapHtml()` 已注入 console 桥把
|
||||
`console.log` 转发到 `android.log` → `MiliLog.info("JS ...")`。
|
||||
点歌失败时先搜远程日志里的 **`JS `** 与 **`点歌失败`** 两行:前者给
|
||||
「Try source / Token OK/FAIL / do.php code=」的逐步过程,后者给 JS 汇总的失败原因。
|
||||
- **JS 侧日志默认只进本地(2026-10 精简)**:`ktv_api.js` 的 `_log()` 走 `console.log`
|
||||
(桥以 `debug:true` 实例化),`KtvJsBridge.wrapHtml()` 注入 console 桥把它转发到
|
||||
`android.log` → **`MiliLog.local("JS …")`(只写本地文件,不上报远程)**。
|
||||
逐步过程(Try source / Token OK/FAIL / do.php code=)在本地 `logs/ktv.log` 里看;
|
||||
远程日志只看一行汇总 **`点歌失败 编号=… 请求源=… 详情=…`**。
|
||||
- **歌曲源**:`app/src/main/assets/mobile/ktv_api.js` 的 `CONFIG.HOSTS`(多源自动排序,失败源沉底)
|
||||
- ⚠️ **`gz.ac16.vip` 是"源站入口"而不是"广告主机"的典型例子(2026-10 实测)**:
|
||||
该域名对任何 `/<编号>.ts` 都返回**同一段广告视频**,因此它留在 `AdVideoFilter.AD_HOSTS`
|
||||
@@ -414,14 +414,26 @@ $BT/apksigner verify 目标名.apk
|
||||
4. **日志要能自我定位**:失败行写清"哪一步/哪个源/耗时/原因",例如
|
||||
`NATIVE-SONG 全部源失败 编号=... 详情=token-fail|no-url|demo-or-mismatch 用时=...ms`;
|
||||
桥侧由 `JS-BRIDGE ...` 说明 WebView 到底卡在哪一步(初始化失败/KtvApi 未导出/20s 超时)。
|
||||
5. **状态样本 + 事件**缺一不可:事件(点歌/失败)说明"发生了什么",但排查"随时间变化"的
|
||||
5. **⚠️ 远程日志只留"每次事件一条"的汇总,细节走本地(2026-10 精简)**:
|
||||
`MiliLog.local(msg)` / `localWarn` / `localError` **只写本地文件、不上报远程**。
|
||||
判定标准——**逐源 / 逐次重试 / 单次 HTTP 错误 / JS 控制台输出**一律用 `local*`;
|
||||
远程只保留"这件事的结论":
|
||||
- 取址:成功一条 `NATIVE-SONG 取址成功 编号=… 源=… urlHost=… 用时=…ms`,
|
||||
失败一条 `NATIVE-SONG 全部源失败 编号=… 详情=… 用时=…ms`,
|
||||
全部只发广告一条 `SOURCE-BLOCKED 全部 N 个源只返回广告/测试资源…`
|
||||
→ **每次取址远程恰好一条**(改前是每个源一条,9 个源就是 9+ 条);
|
||||
- `JS …`(ktv_api.js 的 console 转发)**只进本地**,不再进远程;
|
||||
JS 路径失败仍由远程的 `点歌失败 编号=… 请求源=… 详情=…` 一行说明原因。
|
||||
⚠️ 新加日志时先问自己:"这条是'结论'还是'过程'?" —— 过程写本地。
|
||||
6. **状态样本 + 事件**缺一不可:事件(点歌/失败)说明"发生了什么",但排查"随时间变化"的
|
||||
问题(空间变少、曲库丢失、长期离线)需要状态样本 —— 现由 6 小时一条 `HEALTH ...`
|
||||
(版本/在线/可用空间/曲库大小/根目录)提供。
|
||||
- ⚠️ **远程日志绝不能静默失效**(2026-10 现场反馈"手动更新曲库后远程日志失效了"):
|
||||
1. `MiliLog.init()` **可以重复调用并会自动重启发送线程**(旧实现是
|
||||
`if (started.getAndSet(true)) return`,一旦线程退出就永久不再发送,且无从察觉);
|
||||
2. `sendLoop` 整体包了 `catch (Throwable)` 兜底 —— 任何异常都不允许让发送线程退出;
|
||||
3. **本地留档**:每行同时写入 `<存储根>/logs/ktv.log`(超 1MB 滚动为 `.prev`)。
|
||||
3. **本地留档(纯文本)**:每行同时写入 `<存储根>/logs/ktv.log`
|
||||
(格式 `yyyy-MM-dd HH:mm:ss.SSS LEVEL text`,单行上限 4000 字,超 1MB 滚动为 `.prev`)。
|
||||
远程日志不可用时,让现场直接把该文件发出来即可取证;启动时会打一行
|
||||
`APP-INIT ... logFile=<路径>` 指明位置;
|
||||
4. `MiliLog.init` 已提到 **`KtvApplication.onCreate`**(早于 `MainActivity`),
|
||||
|
||||
Reference in New Issue
Block a user