降低Android设备的充电电压

这又是什么需求

众所周知,锂电池在长时间保持高电量的情况下容易鼓包。我本以为一代更比一代强的电源管理系统会解决这个问题,但是并不一定可靠。我放在房间里挂机的小米6就这么鼓包了,虽然也可能和温度有点关系。于是我决定换块电池,并且降低充电截至电压以避免电量过高,从而延长寿命。反正电池对长期插电的手机来说不过是个UPS罢了。

操作方法

大致上有两种思路供您选择:
复杂优雅
简单粗暴

方法一 修改电池配置文件 复杂优雅

情况一

如果你的手机有单独的dtbo分区,那你可以对这个分区中的内容进行修改以达到目的。
首先你需要一个Linux环境,并获得mkdtimg和dtc这两个可执行文件。这两个是Android工具链中的文件,可以通用的,网上能找到编译好的(试了下挺难找的,我放个在这里吧,适用于Linux_X86,下载)。

从 dtbo.img 中解出 dtb :
mkdtimg dump dtbo.img -b <filename>
把 dtb 文件转成 dts :
dtc -I dtb -O dts <dtb_filename> -o <dts_filename>

以上是抄来的命令,原文在这个链接
因为里面可能有很多个dts文件,对应很多个设备,你可以写个循环执行的bash脚本来执行命令。

在里面找到对应你的设备的dts文件(找不到的话可以试试全改了),在其中找到
对应电池型号的电压一行,进行修改(16进制数值),注意检查数值噢,要是改炸了(物理)可不能怪我。
修改完成后,

把 dts 文件转成 dtb :
dtc -O dtb -o <dtb_filename> <dts_filename>

把 dtb 合成 dtbo.img :
mkdtimg create new-dtbo.img --page_size=4096 dtb.0 dtb.1 dtb.2 ...
此处要把所有dtb文件都填进去

情况二

如果你的手机没单独的dtbo分区

尝试解压boot.img(可以试试用这个工具),看看里面有无dtbo/dtb文件,然后按 情况一 修改。

如果解压不出dtbo或其类似物(比如小米6),则需要修改源码并从源码编译内核(或者你可以试试继续解包内核的zImage,反正这我不会了)。
修改的位置很容易找到,比如小米6的电池配置在内核源码的arch/arm/boot/dts/qcom/xiaomi/batterydata-sagit-atl-3350mAh.dtsi。
然后编译内核并刷入,是不是很简单(并不),太麻烦了这里就不展示了,之前在一台旧手机上实践过,电池再也没鼓包。

方法二 向内核节点传递数据 简单粗暴

每次开机后使用超级用户权限执行命令

1
2
chmod 777 /sys/class/power_supply/*/*
echo '4280000' > /sys/class/power_supply/battery/voltage_max

以上数值4280000代表4.28V,不同手机可能单位不一样,文件位置也不一样,需要先读取原有数值后参考修改
可用cat /sys/class/power_supply/battery/voltage_max指令读取原有数值
建议在执行前sleep个60秒,防止系统启动过程中被覆盖。
我做了个Magisk模块来实现它。传送门
小米6亲测有效,电压被有效限制。

小米6上测试

Q&A

Q:什么不用scene4中的充电限制功能
A:scene4中的充电限制是充电到一定程度后断开电源,由电池供电,电量下降到一定程度后再充电。而我不希望电池频繁充放电。

注意事项

以上操作具有一定风险,请确认完全理解以上操作后在进行实践,若出现任何问题本人概不负责!祝您的手机健康长寿!


降低Android设备的充电电压
https://zhouym.tech/2022/Protect-battery-on-Android/
作者
zhouym
发布于
2022年2月11日
许可协议