Repository navigation
NetPilot 1.5.4 — 锁屏不再定时唤醒 + 制式写入系统回读确认 + Shizuku 孤儿清扫补一手
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 通过 |
自测清单
- 锁屏不唤醒:开监控 → 锁屏 30 分钟以上 → 电池统计里 NetPilot 的「保持唤醒」计数应明显下降;亮屏后监控恢复正常刷新。
- 正常机型:切制式仍是一行 INFO「卡 N 制式已切换为 X」。
- 同义模式不误报:点「3G/2G 自动」(枚举值 3)不应出现「未真正生效」。
- OriginOS 那台:若系统收下但没生效,应看到 WARN「卡 N 制式未真正生效:已请求 …,系统回读是 …」+ 对应 Toast。
- 孤儿进程:
ps -A | grep np_service记个数 → 打开一次应用、等 1 分钟 → 旧孤儿消失(或只剩当前在用的 1 个);日志页可见「…已清掉 N 个残留用户服务进程」。 - 不回归:
dumpsys power里仍只有 DSHA 自身的 wake lock;自动降级/恢复行为与 1.5.3 一致。
诚实说明
- 本版未经真机安装验证(按约定由用户自测),深睡眠结论来自
dumpsys/deviceidle.xml//proc采样,不是功耗仪数据; - 回读确认依赖
setAllowedNetworkTypesForReason可读;读不到时提示「未确认」而非断言失败。
文档:docs/POWER_REPORT.md §13(含构建复现备注 §13.6)、docs/TESTING.md §24。