Skip to content

NetPilot 1.5.4 — 锁屏不再定时唤醒 + 制式写入系统回读确认 + Shizuku 孤儿清扫补一手

Choose a tag to compare

@katiusu katiusu released this 07 Oct 04:13
· 1 commit to main since this release

1.5.4(2026100700)

一句话:锁屏期间不再定时唤醒 CPU;制式写入新增系统回读确认(如实告知,判定语义未改);Shizuku 孤儿用户服务清扫再补一手。


一、深睡眠:有影响,已改

实测(本机,设备侧只读)

  • dumpsys power → Wake Locks: size=2,两条都属于 DSHA 自身 ⇒ NetPilot 从不持 wake lock;
  • deviceidle.xml 白名单(34 条)含 com.katiusu.netpilot ⇒ 已过 Doze 白名单,系统不替我们压它的闹钟;
  • 空闲采样(20 次 × 30 s,/proc/<pid>/stat):0.5 秒 CPU / 12 分钟(≈0.07%),cutime/cstime 恒 0,RSS 62–67 MB。

问题:保活心跳是 setInexactRepeating(ELAPSED_REALTIME_WAKEUP, 15 min),被清理后的「尽快拉回」是 setAndAllowWhileIdle(ELAPSED_REALTIME_WAKEUP, …) —— 锁屏期间会把 CPU 拉起来。

改法(按「锁屏时才停止定时唤醒」)

  • 新增 core/keepalive/ScreenStateGate.kt:动态注册 SCREEN_ON / SCREEN_OFF,屏幕状态变化时重排闹钟;
  • KeepAliveScheduler.schedule():亮屏 ELAPSED_REALTIME_WAKEUP(原行为),锁屏 ELAPSED_REALTIME(不唤醒 CPU),亮屏瞬间自动切回;
  • KeepAliveScheduler.scheduleRestartSoon():锁屏用 set(ELAPSED_REALTIME, …),亮屏仍 setAndAllowWhileIdle。

触发与投递逻辑、退避算法(10 s → … → 15 分钟上限)、ensureMonitorRunning 三步闸门、「服务站稳 2 分钟」判据一行未动,只换闹钟类型。

二、制式写入:加回读确认,判定语义不变

用户实测另一台 OriginOS 设备上出现「日志说已切换为仅 4G、实际制式没变」。本版不把「modem 返回 false」改成失败(明确要求),只做如实告知:

  • 写入成功后回读真值 ControlManager.getMode(subId, useMemo = false)(绕过 5 分钟读记忆、且不回写记忆 —— 回写会让防重复写闸门每轮重试,那就是行为变更);
  • 比对按位掩码而不是数值:位掩码表非单射,枚举值 3 与 0 标签、位掩码完全相同,系统回读只会给 0 —— 按数值比会把「3G/2G 自动」误报成「未生效」;
  • 未生效时日志打 WARN、Toast 提示「已请求切换,系统未确认生效(详见日志页)」。

回读读的是 ITelephony getAllowedNetworkTypesForReason(真值),不是 settings 里那个写完必然一致的遗留字段。

三、孤儿 :np_service 清扫:第二手 + 窗口拉长

  • 启动清扫重试 4 次 → 7 次(0 / 30 s / 2 min / 5 min / 15 min / 30 min / 60 min);
  • 在首次选用 Shizuku 之前(本进程尚无任何活着的用户服务,唯一不会误杀的时间窗)补清一次;标志位沿用「成功才置位」,Shizuku 没起来的那次失败尝试不会烧掉机会;
  • 真清到进程时用 WriteDiag.always 记一行,简要模式也可见。

诚实边界:Shizuku 公共 API 不提供用户服务 pid / 进程列表,「只杀确实没用的那个」做不到;本方案仍是「在用户服务进程里清掉所有同类(跳过自己)」。


产物校验

项 值
文件 NetPilot-1.5.4-2026100700-release.apk
大小 4 170 771 B
MD5 493ca05d49a7b4f93bd451ba9a2f3ce3
SHA-256 622cf8cf70ae00adcf7b5ea0484bbf0fa41d5384d7eb195ff7fa4308021eaa6d
versionCode / versionName 2026100700 / 1.5.4
minSdk / targetSdk / compileSdk 34 / 36 / 37
dex 1 个 classes.dex,3 154 340 B(1.5.3 为 3 151 324 B,+3 016 B)
keep 目标 PrivilegedCli / ShizukuControllerService / IShizukuController$Stub / …$Stub$Proxy 均在 dex(release 已开 R8)
签名证书 SHA-256 34100875b45d7c4dc9928030b3329b5490869a236155f9ce08b1dc70c7434c4c
对齐 zipalign -c 4 通过

自测清单

  1. 锁屏不唤醒:开监控 → 锁屏 30 分钟以上 → 电池统计里 NetPilot 的「保持唤醒」计数应明显下降;亮屏后监控恢复正常刷新。
  2. 正常机型:切制式仍是一行 INFO「卡 N 制式已切换为 X」。
  3. 同义模式不误报:点「3G/2G 自动」(枚举值 3)不应出现「未真正生效」。
  4. OriginOS 那台:若系统收下但没生效,应看到 WARN「卡 N 制式未真正生效:已请求 …,系统回读是 …」+ 对应 Toast。
  5. 孤儿进程:ps -A | grep np_service 记个数 → 打开一次应用、等 1 分钟 → 旧孤儿消失(或只剩当前在用的 1 个);日志页可见「…已清掉 N 个残留用户服务进程」。
  6. 不回归:dumpsys power 里仍只有 DSHA 自身的 wake lock;自动降级/恢复行为与 1.5.3 一致。

诚实说明

  • 本版未经真机安装验证(按约定由用户自测),深睡眠结论来自 dumpsys / deviceidle.xml / /proc 采样,不是功耗仪数据;
  • 回读确认依赖 setAllowedNetworkTypesForReason 可读;读不到时提示「未确认」而非断言失败。

文档:docs/POWER_REPORT.md §13(含构建复现备注 §13.6)、docs/TESTING.md §24。