Repository navigation
wb2api 1.6.9
wb2api 1.6.9(versionCode 48)
悬浮窗这次是真的能拖出屏幕了,另外修掉一个「每天必然发生」的常驻能力缺陷。
1. 悬浮窗:修 1.6.8 的错
1.6.8 改了夹取逻辑但实测拖不出去 —— 限制不在我们的 clampX,而在系统窗口层:
WindowManager 会把 x/y 夹回显示区域,除非窗口带 FLAG_LAYOUT_NO_LIMITS
(官方文档原话 allow window to extend outside of the screen)。
- ✅ 补上
FLAG_LAYOUT_NO_LIMITS - ✅ 屏幕尺寸基准改为
currentWindowMetrics.bounds(整屏):加了 NO_LIMITS 后坐标系原点在
屏幕左上角、不受系统栏约束,继续用displayMetrics(应用可用区域)会少算一条导航栏 - ✅ 夹取结果写回持久化,换分辨率/横屏后不再每次重新夹
结果:可把浮窗拖出屏幕三分之二(左右),屏内始终留三分之一可见、够抓回来;垂直仍整颗在屏内。
2. 常驻服务不再被 6 小时上限杀死 ⚠️
官方「Foreground service timeouts」:targetSdk 35+ 时 dataSync 前台服务在 24 小时内
累计只能跑 6 小时,到点回调 onTimeout,几秒内不停就抛 RemoteServiceException。
本项目 targetSdk 37 且一直是 dataSync —— 意味着每天跑满 6 小时必被系统停掉。
本版改用 specialUse(API 34+,不受该配额约束):manifest 双类型声明 +
PROPERTY_SPECIAL_USE_FGS_SUBTYPE 用途说明 + FOREGROUND_SERVICE_SPECIAL_USE 权限,
运行时按版本分支(API 32/33 仍用 dataSync,那两个版本本身没有 6h 限制)。
3. 底层优化:已核实「本来就在享受」与「评估后不做」
| 已默认生效(AGP 9.4.1) | 结论 |
|---|---|
| 优化型资源缩减 / R8 类重打包 / Kotlin 空检查优化 / R8 full mode | 无需配置 |
| 16KB 页对齐、依赖 baseline profile 合并 | 无 native 库 / 已随 AAR 合并 |
| Application.onCreate 极简、reportFullyDrawn、onTrimMemory、profileable | 早已落地 |
不做:Startup Profile(需真机 Macrobenchmark 才能生成有效规则,手写无法验证)、迁移到
AGP 9.3 新 optimization {} DSL(行为等效、keep 规则搬迁有剪错风险)、收紧 R8 keep
(序列化/Miuix 反射依赖字段名)。理由都写进 README,避免以后重复研究。
4. 审计修复
| 级别 | 问题 |
|---|---|
| P0 | 服务已跑时再点启动会把 boundPort 改成配置端口 → 公布没人监听的地址 |
| P0 | WAF 闸门按「次数」而非「不同账号」判定 → 单账号重试两次就把整个 realm 停 60s |
| P1 | 首帧即失败时未回填真实错误 → 轮转耗尽后把配额/渠道校验说成「号都挂了」 |
| P1 | clearModelBlock 裸读改写与并发 onError 抢同一台账 |
| P1 | loadAuths 先清空再回填,会吞掉并发写入的新 token(下一次白撞 401) |
| P1 | 定时任务幂等键清理判据 endsWith(日期) 恒 false → 触发时清空当天标记、任务重复跑 |
| P1 | bind 失败不关 ServerSocket(连点启动 = 漏 fd) |
| P1 | Responses 非流式截断判据漏 [DONE] → 半截 tool arguments 下发导致客户端解析卡死 |
| P2 | "500ms" 被解析成 0 秒(= 无冷却)、query 畸形转义掐断连接、crash.log 无界、 |
解禁残留 cool_kind、acquire 假判据、若干注释与 KDoc 错位 |
覆盖安装:签名与 1.6.3–1.6.8 一致(SHA-256
32a556af…6c5c17),账号与配置保留。