Repository navigation
Releases: CaiGit1/RootBatteryMonitor
Releases · CaiGit1/RootBatteryMonitor
Release list
Root Battery Monitor v1.4.0
v1.4.0
不再强制要求 root。
新增
- 免 root 模式 — 没有 root(或 ROM 拦截 sysfs)时自动改用系统公开 API,
仍能显示电量、温度、电压、电流、功率、充电状态、充电类型与循环次数 - 顶部状态行直接标明当前走哪条路:
Root 直读/免 root 模式 - 关于页与设置页的说明随模式变化
修正
- 实况通知的状态栏胶囊不显示文本 — 胶囊的字符数是硬上限,实测 9 个字符能显示、
10 个就一个字都不渲染。改为固定短格式-1.3W·33° - 只开「实况通知」时后台服务不启动,该开关形同虚设
- 读不到数据时通知走的是普通路径,状态栏反而最安静;现在也走实况通知
说明
免 root 模式下这些指标拿不到,需要 root:充电协议、满电/设计容量(健康度)、
原始 uevent、供电侧节点。
上一个版本 v1.3.0
加入了实况通知与小米超级岛。
Root Battery Monitor v1.3.0
v1.3.0
电池状态现在会出现在状态栏和锁屏上。
[🔋] +2438 mW 40.8°C
新增
- 实况通知 — 支持 Android 16 的 Live Updates
- 小米超级岛 — HyperOS 上显示为超级岛,左区功率、右区温度
- 呈现方式可切换 — 设置里可选自动 / 小米超级岛 / 类原生 AOSP
- 设备检测 — 自动识别 ROM 与系统能力,设置页显示当前实际使用哪种方案
- 状态栏图标改为电池轮廓
说明
实况通知与超级岛在 HyperOS 上是两套互斥的机制,同时使用会让系统忽略岛参数,所以只能选一条。默认的「自动」按设备判断;设备不支持原生岛时自动退回实况通知。
岛的宽度由系统决定,应用侧调整不了。
需要 root,Android 8.0+。
上一个版本 v1.2.0 加入了悬浮窗、四页界面与深色模式。
Root Battery Monitor v1.2.0
v1.2.0
- 悬浮窗 — 在其他应用上层显示自选指标,可拖动;背景取 Material You 壁纸色,可选主色 / 次色 / 第三色 / 中性灰,不透明度 20%–100%
- 刷新间隔滑块 — 0.2s – 5.0s,步进 0.1s;高频档位复用常驻
su进程 - 界面重构 — 概览 / 详情 / 曲线 / 设置 四页,卡片可展开,带过渡动画
- 曲线页 — 温度 / 电压 / 电流 / 功率 四张折线图,带单位与极值统计
- 深色模式 — 可独立于系统设置;Android 12+ 跟随壁纸取色
- 数据修正 — 充电协议解析取当前生效项;功率改由「电压 × 电流」计算
- 新增应用图标与关于页
需要 root,Android 8.0+。
Root Battery Monitor v1.1.0
Root Battery Monitor v1.1.0
适配 Android 14/15(
targetSdk 35)· 仅支持已 root 设备 ·minSdk 26
🔧 修复(均由真机实测暴露)
| 问题 | 根因 |
|---|---|
一直显示「未找到电池 uevent 路径」、指标全为 -- |
readBatteryUevent() 先用 File.exists()(App 自身 UID)做拦截。Android 10+ 起 /sys 受 SELinux 限制,普通 App 连 stat 都被拒,root 明明能读却被判成「文件不存在」 |
| 环境自检自相矛盾:「路径存在=失败」但「可读=通过」 | 存在性检查用 App 权限、可读性检查用 su,两项出自不同权限环境,结论必然冲突 |
| 点「环境自检 / 立即刷新」偶发闪退 | runCommand 超时后仍调用 process.exitValue(),进程未退出时抛 IllegalThreadStateException(su 首次授权弹窗超过 4 秒即触发) |
| 点「前台服务」开关直接闪退 | AndroidManifest.xml 声明了 foregroundServiceType="dataSync",却缺 FOREGROUND_SERVICE_DATA_SYNC 权限。Android 14+ 下 startForeground() 抛 SecurityException |
| 部分 ROM 完全读不到数据 | 电池节点路径被硬编码为 /sys/class/power_supply/battery/uevent |
✨ 新增
字段扩展(原实现仅解析 6 项,实机可达 26 项)
- 电压:
VOLTAGE_OCV(开路电压)、VOLTAGE_MAX - 功率:
POWER_NOW、POWER_AVG - 容量与寿命:
CHARGE_FULL、CHARGE_FULL_DESIGN、CHARGE_COUNTER、CYCLE_COUNT - 充电:
CHARGE_TYPE、CONSTANT_CHARGE_CURRENT、CHARGE_CONTROL_LIMIT(_MAX) - 身份:
NAME、TYPE、PRESENT、TECHNOLOGY、MODEL_NAME - 时间:
TIME_TO_FULL_NOW/_AVG、TIME_TO_EMPTY_NOW/_AVG
派生指标
- 电池健康度 = 满电容量 ÷ 设计容量(最能反映损耗,原实现完全没有)
- 计算功率 V×I —— 与内核
POWER_NOW并列显示,用于交叉校验
供电侧节点读取
除 battery 外,新增读取 usb / wireless / ucsi 节点(输入电压/电流、USB_TYPE、电流上限、输入限流、充电器温度),并按信息量择优选取,而非取「第一个 online 的」。
其他
- 电池节点改为遍历
/sys/class/power_supply自动探测(兼容battery/bms/BAT0/maxfg等命名) - 原始 uevent 全量展开视图,26 项一个不藏,便于排障
- 运行时申请
POST_NOTIFICATIONS(Android 13+) - 自检新增「供电节点」一项
⚠️ 数据口径说明(不替内核"修数")
CHARGE_COUNTER各 ROM 单位不统一。实测原值3220,若按 µAh→mAh 换算会得到误导性的「3 mAh」,故按原值展示POWER_NOW实测与V×I相差百倍(10 W vs 0.87 W),故并列显示两者而非二选一CURRENT_NOW充电时为负值(内核符号约定),保留原始符号并加注说明- 内核用
-1/0xFFFF(65535)表示「未知」,已统一显示为--(否则会误显示成 18 小时)
📦 构建信息
versionCode1 → 2,versionName1.0.0 → 1.1.0- AGP 8.6.0 / Kotlin 2.0.21 / Gradle 8.7 /
compileSdk 35/ JDK 17 - 已接入 release 签名,签名配置从
keystore.properties读取(该文件与密钥库不入库);文件缺失时自动退化为不签名,CI 不受影响
仓库:https://github.com/CaiGit1/RootBatteryMonitor
版本:首个独立版本,tag v1.1.0 → commit db72b2b
APK SHA-256:16A813D9BE6F01C0021633257DB32AA92F0B0FBE7A0A81BBAA160CDFE3387EB3