Skip to content

OpenRC2 1.46.44

Choose a tag to compare

@456erddgr 456erddgr released this 03 Nov 14:36
· 11 commits to main since this release

先说清楚:这一版没在真机上验过

开发到一半遥控器 USB 掉线了,无线 adb 也连不上(把本机所在的 192.168.3.0/24 扫了一遍,5555 端口一个都没响应)。
所以下面是"改了什么",不是"修好了什么"。等机器回来我会补验证记录。


模型管理页一开就闪退

崩在这里:

signal 11 addr 0x10 pc off 0x43d4b8   →  std::set<unsigned int>::insert

addr 0x10 意思是在一个空的 std::set 上做插入。两件事叠在一起:

  1. 启动大约 70 ms 后,modelslist 所在的一整段 1888 字节 BSS 被外部清零
    (加了 clear() 钩子,确认不是 ModelsList::clear() 干的)。
  2. setSelected(getLabels().size() - 1) 在空标签表上无符号下溢成 0xFFFFFFFF,然后在空 set 上插入,崩。

改了:进页前若模型库为空先重建;标签表为空就直接短路返回;另加运行时探针,检测到"库空但 SD 有模型"会自动重建(2 秒节流)。

没改:那个 1888 字节到底是谁 memset 的,还没揪出来。现在只有检测 + 自愈。


RC Pro 六轴全 −100%,怎么动都不动

根因是一个判活判据把整条链子判死了:stickSourceAlive() 用 duml.connected,
而 RC Pro 的 40007 是"连一次收一帧就 EOF",这个标志几乎恒 false,于是
不喂混控 → 走合成假值(正好每轴 −100%)→ 旁键那段代码也不执行。

  • 判活改成"最近一帧有多新"(单调时钟,400 ms 窗口)
  • DumlStick 快照模式重连间隔:注释写 10 ms,代码是 5000 ms,改成 10 ms(连续失败 200 次熔断回 5 s)
  • RcProStick.raw 初值 0 → 1024,因为 (0-1024)/660 正好等于 −100%,是个完美的骗局

旁键 / 拨轮(RC Plus 2)

加了两条通路,和 RC2 原来那条并列:

  • binder 06/174 帧轮询,250 ms 一次
  • 无障碍服务:物理键在内核里是普通输入设备事件,binder 拿不到,只有 AccessibilityService.onKeyEvent 能收

铁律:KeysService 必须和 libetx 同进程,绝不能加 android:process。
核心状态是进程内的,换进程等于加载一份空核心,按了没人看见。


顺手修的

  • Radio.lastBinderMs 时钟混用:elapsedRealtime() 减 currentTimeMillis(),恒为 true,每 20 ms 空转一次
  • 构建脚本:重链完忘同步 so 会静默用旧内核出包,而版本号让 sha 看起来变了。现在 out/ 比 keep/ 新就直接 [FATAL]

包

大小 13855339 B
sha256 ca0fb6f7f567649bddc3f80658744ec77526796135f77c044d9271a185e79b5a

1.46.41 ~ 1.46.44 这四版的 libetx.so 逐字节相同,APK 大小也全一样。
想确认补丁进没进包,只能看 sha256 —— 看大小、看版本号都会认错。


详细记录:docs/20-本轮修复总记录-20261103.md