Skip to content

About

no

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

40 Commits

Folders and files

Repository files navigation

battery-modify

Android (Magisk 模块) 电量接管守护进程:用电池电压模拟电量,融合内核 fuel gauge 的 RM/FCC, 经平滑限速后通过 dumpsys battery set level 下发,避免小板错误数据导致的电量跳变。

工作原理

  • 按 POLL_SECS(默认 10s)轮询读取 voltage_now / current_now / status / RM / FCC(节点按实机写死:/sys/class/power_supply/battery/ 下的 voltage_now/current_now/charge_counter/charge_full)
  • 放电时按内阻做负载补偿(v + |I|×R),查分段线性表得 voltage_percent,经中位数+EMA 降噪;电压读取失败时跳过校正和低压封顶,不把 0 当作低电量
  • kernel_percent = RM × 100 / FCC,带毛刺拒绝(单拍跳变 >8% 需下一拍确认)
  • 放电:连续可信的 ΔRM/FCC 推进估计,电压以长时常数校正,内核绝对电量以中时常数融合;拔线弛豫窗口内减弱电压校正
  • 内核缺失、卡死、毛刺未确认或与有效电压偏差 >25 个点时,暂停绝对值融合和 ΔRM 步进;旧读数只用于毛刺比较。恢复后先重建 RM 基准,FCC 变化、RM 反向增加及单拍跳变 >3 点也不直接步进或强制对齐
  • 充电:不接管——dumpsys battery reset 交还系统计电量,快充显示实时跟上;拔线后以系统当前显示值为起点重新接管,不跳变
  • 接管时显示与内部估计分别初始化:显示沿用系统值并按原有限速推进;内部估计优先从本拍通过健康检查的 RM/FCC 开始,没有可信内核时才退回显示值,避免系统显示偏差拖慢估计恢复
  • smooth_percent 按时间基限速逼近 target(各方向速率独立可配),每 30s 下发一次(与旧版频率一致)
  • 低电安全阀:有效裸端电压连续低于阈值才触发快速下探;触发后以 150mV 回差解除。无效或不再低于触发阈值的采样会打断触发前的连续计数
  • smooth 值持久化到 /data/adb/battery_smooth.state,daemon 重启续跑不跳变

config.conf

位于模块目录(默认 /data/adb/modules/battery_module/config.conf),缺失的键使用默认值。

键 默认 说明
ENABLE_MONITOR true 电量监控总开关
POLL_SECS 10 sysfs 轮询间隔(秒);电量下发固定 30s 一次,不受此值影响
ENABLE_TEMP_COMP true 禁用温度补偿
V_CURVE 见下 电压→电量分段表,格式 mV:百分比,mV:百分比,...
R_MOHM 40 电池内阻(mΩ),放电负载补偿用
MIN_PERCENT 1 显示电量下限
RELAX_AFTER_UNPLUG_SECS 300 拔线后弛豫窗口时长(秒)
KERNEL_STUCK_TIMEOUT_SECS 900 内核电量无变化超时(秒)
RATE_DISCHARGE_DOWN_SECS 60 放电下降速率 1%/N 秒
RATE_DISCHARGE_UP_SECS 180 放电回升速率 1%/N 秒
RATE_VALVE_SECS 10 安全阀下探速率 1%/N 秒
SHUTDOWN_VALVE_MV 3130 安全阀触发电压(裸端电压),按实测低端取真实 ~1% 处;实测裸电压最低 3122mV
VALVE_COMP_MV 3250 补偿后电压低于此值时 target 封顶
VALVE_CAP_PERCENT 5 上述封顶值
CURRENT_SIGN 0 电流符号:0=自动 1=正为充电 -1=正为放电
CALIB_LOG false 放电时每拍打点 v_comp/k,用于拟合 V_CURVE
TAU_ANCHOR_SECS 1200 电压校正时常数(秒),拔线弛豫期乘以 4
TAU_KERNEL_SECS 300 可信内核绝对电量的融合时常数(秒)

默认 V_CURVE 由五组实机放电日志记录拟合(2134 个打点,45 点稀疏化)。相对日志 RM/FCC 的样本内单点 RMSE≈0.97 个百分点,不代表独立验证的真实 SOC 精度;五组记录也不等于五轮完整放电。3140mV 起大部分区间有实测覆盖,仅 3140mV 以下短尾沿 3050:0 外推,4465mV 为满电锚点:

V_CURVE=3050:0,3160:2.1,3270:5.6,3460:11,3620:17.8,3630:19,3660:19.8,3690:22.4,3710:25.9,3720:29.4,3730:30.6,3740:31,3750:32.6,3800:37.7,3810:39.1,3830:40.5,3850:43,3870:44.5,3900:49.5,3910:52.2,3920:53,3930:55,3960:57.2,3970:59.3,4020:63.6,4070:66.3,4080:67.5,4090:67.6,4100:69.5,4130:71.9,4140:72.2,4150:74,4200:78,4210:79.4,4250:81.2,4260:82.7,4270:82.9,4280:84,4290:86,4310:88.4,4350:90.8,4370:94.1,4410:97.3,4460:97.9,4465:100

曲线校准:记录放电日志后,交给 analysis/fit_curve.py 拟合。同一时间戳优先使用 CALIB 中更精细的 k,合并 set level 的 RM/FCC 与标记,不重复计权;正电流(已充电但状态防抖尚未完成)、缺失或非有限 k 不参与拟合。只覆盖局部电量时输出 LOCAL_CURVE,不添加满/空锚点,不能替换全段默认曲线。只有同时采到 ≤5% 和 ≥95% 才允许输出带锚点的 V_CURVE;这只是最低覆盖检查,中间区间和独立验证仍需核实。默认 V_CURVE 未随本轮局部拟合替换。 每次下发电量的日志都会打印 rm/fcc 绝对值(mAh),小板谎报容量(如 6200mAh 被报成 4800mAh)可直接从日志看出来。

电压无效时日志记录 v=-1、补偿电压 0 和 [电压无效],并暂停内核融合和 ΔRM 步进,避免失去电压校验后误信内核;内核缺失或毛刺未确认时记录 k=-1,避免将保留的旧值当成新采样。当前对 ΔRM 的处理采用保守策略;是否允许绝对值异常但增量可信的读数参与,需要独立电流数据支持。

回归验证:Linux 上运行 cargo test --locked;拟合脚本运行 python3 -m unittest discover -s analysis -p 'test_*.py' -v。云构建会先执行这两组测试,再打包 Android 二进制。Windows 本机未配置 Rust 工具链时,只能直接运行 Python 测试,Rust 测试和 Android 构建结果以云构建为准。

局部日志诊断可运行 python -X utf8 analysis/analyze_capture.py battery_calibrate.log(需要已有 numpy 环境)。它针对带完整 CALIB、FCC 恒定且无低压/卡死事件的片段,比较电流积分、局部曲线和默认参数下的估计器回放,输出 analysis/capture_metrics.json。回放是离线模型,不替代 Rust 或设备测试。本次采集结论见 局部采集复核。

About

no

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages