Skip to content

NetPilot 1.5.3 — 后台耗电优化 + 制式选择器各代际适配运营商 + Shizuku 孤儿进程清扫修复 + 假 WARN 修复

Choose a tag to compare

@katiusu katiusu released this 06 Oct 04:01
· 2 commits to main since this release

本版 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,775 B / SHA-256 45f1fac6a6914acf8f335467030d509fc26d7a82138e6772325cb081abc36b5b(MD5 37752ed35a2fa02ddf5d955e7d3f915a)
  • 构建:compileDebugKotlin 22 s;assembleRelease(R8,isMinifyEnabled = true + proguard-android-optimize.txt + app/proguard-rules.pro 5 条 keep)11 m 42 s;dex 1 个 / 3,151,324 B(上一包 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-256 34100875b45d7c4dc9928030b3329b5490869a236155f9ce08b1dc70c7434c4c(与 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.py 7 对文件全 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(本版唯一产物)