Repository navigation
NetPilot 1.5.3 — 后台耗电优化 + 制式选择器各代际适配运营商 + Shizuku 孤儿进程清扫修复 + 假 WARN 修复
本版 versionName = "1.5.3"、versionCode = 2026100601;只提供 release 包(本版不产出 debug 包)。判定语义(何时判假满格 / 何时降级 / 何时回滚)、默认值、写入顺序(ITelephony → 权威存储 → settings)与写后回读校验一律未变。
版本号按要求与首个 1.5.3 包相同(
2026100601),本包是它的追加构建,会覆盖同名文件:同一签名、同一versionCode,可直接覆盖安装。
这一版改了什么
一、后台耗电(四条路径,全部「少做无意义的活」,不改任何判定)
- 息屏后暂停 HTTP 探测:降级判定里「跳探」本来就已经实现(
fakeFullBarOnNrOnly = true且当前不在 NR 时,跳探不可能改变判定),但 1.5.2 只在强信号时才真的跳;现在息屏且最近 5 分钟已探过时也跳,并记一条「屏幕关闭,本轮暂停 HTTP 探测(降级判定不受影响)」。判定语义不变的论证写在docs/POWER_REPORT.md§11.2。 - 制式回读不再每轮 fork 特权进程:
readModeOrMinusOne()原来每个 tick 都会起一次su/app_process(实测一个 root 子进程 RSS ≈132 MB、最长十几秒),即使随后因为「值没变」而放弃写入;现在该读经过ControlManager.getMode()的 5 分钟记忆,值变化或写成功时才失效。注意:这只会让「每轮白读」变成「偶发读」,实际写入与校验一次都没少。 - 落盘脏检查 + 分级节流:日志落盘原来任何等级(含 DEBUG)都会把整份 JSON
commit()一次(降级冷却期每 30 秒一次);现在 WARN/ERROR 仍走 30 秒窗口,纯 DEBUG 放宽到 5 分钟,且内容与上次相同则直接跳过。 - 关于页背景动效真的会停:背景透明度归零后(
BgEffectModifier)取消帧循环,不再空转绘制。
二、制式选择器:合并 + 每个代际都能「自动适配运营商」
- 合并三类冗余:每代际组顶部各一行合成项(按当前默认数据卡的 MCC/MNC 解析成对应制式);组内同名项去重(3→0 都是「3G/2G 自动」,22→10 都是「4G/3G/2G 自动 (全制式)」);按你的选择不隐藏任何条目,34 项仍全在列表里 —— 所以当前值恰好等于本卡默认档时,合成项与那一行会同时打勾,这是刻意保留的可见冗余。
- 代际解析表(推导规则 = 把该运营商 5G 默认模式的位掩码逐级去掉更高代际):
| 代际 | 移动 | 联通 | 电信 | 广电 | 认不出 |
|---|---|---|---|---|---|
| 5G | 32 | 26 | 27 | 33 | 26 |
| 4G | 20 | 9 | 10 | 22 | 9 |
| 3G | 18 | 0 | 21 | 21 | 0 |
| 2G | 1 | 1 | 4 | 1 | 1 |
- 项之间加了 6 dp 间距,分组标题与组内列表结构不变。
三、修掉 Shizuku 孤儿进程清扫永久失效(本版最大的内存项)
实测本机有一个 com.katiusu.netpilot:np_service(Shizuku 用户服务)PPID=1、已存活 6 小时以上、RSS ≈59 MB,而主进程只有 ≈62 MB。侦查结论:清扫本身没坏,是它根本没被执行——
pruneOrphanedServices()的compareAndSet抢在shizukuAlive()/ensureServiceBinding()之前:开机那一刻 Shizuku 还没起来,那次调用把本进程内唯一一次机会烧掉了;- 而
MonitorService是START_STICKY+ 15 分钟心跳,进程长期活着 ⇒ 再也没有第二次onCreate; - 另一条路径(
probe()成功后清扫)在 root 可用时是死代码(通道优先选 Root); - 清扫结果只写在
detail级(简要模式不输出)⇒ 现象完全不可见。
修法:门控前移,只有清扫命令真的成功执行过才置位;返回值区分「没执行 / 执行了清了 N 个」;启动清扫改为4 次有界重试(0 s / 30 s / 2 min / 5 min);真回收时用 WriteDiag.always 在日志页留一行「shizuku 启动清扫:回收 N 个残留用户服务进程」。另加防误杀:缓存里握着活的 Shizuku 通道时跳过清扫(清它会杀掉自己正在用的服务)。局限性照实说:Shizuku 公开 API 不提供用户服务 pid 列表,无法只杀「确实没用的那个」,所以靠「在用户服务进程内清同类、跳过自己」+ 上面那条跳过条件。
四、修掉被误报成「binder 调用失败」的假 WARN
日志里那两条 shizuku getDefaultSlot:binder 调用抛异常 a80 / b80: rememberCoroutineScope left the composition 是同一个类,R8 反查(mapping + apkanalyzer dex code 对比两个 APK)确认:a80 来自 1.5.2 构建、b80 来自 1.5.3 构建,实为 androidx.compose.runtime.ForgottenCoroutineScopeException。链路是首页 rememberCoroutineScope() 在页面整体离开组合(滑离两页以上 / Activity 重建 / 对话框关闭)时被取消,而 ShizukuController.call() 的 catch (e: Throwable) 把协程取消当故障记了下来(每条还会触发一次落盘)。修法:在它前面补 catch (e: CancellationException) { throw e }(call() 与 ensureServiceBinding() 两处);超时 / 未绑定 / 真异常的降级判定完全不变——真失败仍照旧记 WARN。
需要你留意
- 孤儿进程修复只能靠装后验证:本包没有真机安装验证(打包侧不自行安装)。装好后打开一次应用、等 1 分钟,
ps -A | grep np_service看旧孤儿是否消失、日志页是否出现「回收 N 个」那一行。 - 制式读取的记忆是 5 分钟:如果你用别的方式(系统设置、
*#*#4636#*#*、运营商配置)改了制式,界面上的「当前值」最多滞后 5 分钟;点按写入会立刻刷新记忆。 - 可直接覆盖安装 1.5.2 或上一个 1.5.3 包(同一把 release key)。
- 本轮没有真机 profiler 数据:代码级成本、进程实测与体积是硬测量;「体感是否更省电 / 内存是否下降」需要你按验收清单自测。
验证
- release
4,153,775B / SHA-25645f1fac6a6914acf8f335467030d509fc26d7a82138e6772325cb081abc36b5b(MD537752ed35a2fa02ddf5d955e7d3f915a) - 构建:
compileDebugKotlin22 s;assembleRelease(R8,isMinifyEnabled = true+proguard-android-optimize.txt+app/proguard-rules.pro5 条 keep)11 m 42 s;dex 1 个 /3,151,324B(上一包 3,149,832 B,+1,492 B) aapt2 dump badging:versionCode='2026100601' versionName='1.5.3'、minSdkVersion 34/targetSdkVersion 36/compileSdkVersion 37;apksigner verify通过,证书 SHA-25634100875b45d7c4dc9928030b3329b5490869a236155f9ce08b1dc70c7434c4c(与 1.3.0 以来同一把 key)- 解包核对:APK 150 个条目、
AndroidManifest.xml(16,620 B)与resources.arsc(813,588 B)完好(android.enableResourceOptimizations=false沿用,避开 build-tools 36 的 aapt2 空resources-release-optimize.ap_坑);PrivilegedCli/ShizukuControllerService/IShizukuController与其$Stub/$Stub$Proxy等 11 个 keep 目标均在成品 dex 中;zipalign -c 4通过 - 架构自检:无循环依赖、无扇入/扇出热点(5 个超大模块均为既有)
- 自查:
tools/check_provenance.py7 对文件全 OK(最坏重复率 15.2%)
自测清单
- 后台耗电 / 制式读取记忆 / 落盘 / 动效:
docs/TESTING.md§22 - 各代际自动适配运营商 / 孤儿进程 / 假 WARN:
docs/TESTING.md§23 - 机制分析、侦查证据(含 R8 反查表)与改动清单:
docs/POWER_REPORT.md§11(耗电)与 §12(本轮三项)
下载
NetPilot-1.5.3-2026100601-release.apk(本版唯一产物)