Repository navigation
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