1. 小米9更换大容量电池后的系统适配改造
作为一名长期折腾安卓设备的玩家,我最近给自己的小米9换了块4000mAh的大容量电池。但换上后发现系统显示的电池容量仍然是原装的3300mAh,导致电量百分比计算不准确。经过一番研究,我发现需要通过修改dtbo分区中的电池配置信息来解决这个问题。下面就把完整的操作流程分享给大家。
小米9的电池信息存储在独立的dtbo分区中,具体来说是在某些DTB(Device Tree Blob)文件里。我们需要提取这个分区,找到包含电池信息的DTB文件,修改其中的容量数值,然后重新打包刷回。整个过程需要在Linux环境下完成,建议使用WSL(Windows Subsystem for Linux)来操作。
2. 准备工作与环境搭建
2.1 所需工具清单
在开始前,请确保准备好以下工具和环境:
- ADB和Fastboot工具:用于与手机通信和执行命令
- Magisk获取root权限:修改系统分区必须要有root权限
- WSL或Linux环境:用于运行mkdtimg和dtc工具
- Git:用于下载mkdtimg源码
- 编译工具链:包括make、gcc等,用于编译mkdtimg
重要提示:操作前请备份手机中的重要数据,修改系统分区存在风险,可能导致设备无法启动。
2.2 环境配置步骤
首先在Windows上启用WSL并安装Ubuntu发行版:
bash复制# 以管理员身份打开PowerShell
wsl --install -d Ubuntu
安装完成后,更新软件包并安装必要工具:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y git make gcc device-tree-compiler
接下来下载并编译mkdtimg工具:
bash复制git clone https://github.com/affggh/mkdtimg
cd mkdtimg
make mkdtimg
编译完成后,将生成的mkdtimg可执行文件复制到/usr/local/bin以便全局调用:
bash复制sudo cp mkdtimg /usr/local/bin/
3. 提取和分析dtbo分区
3.1 获取当前电池信息
首先我们需要确认手机当前使用的电池型号,这将帮助我们定位需要修改的DTB文件:
bash复制adb shell
su
cat /sys/class/power_supply/battery/battery_type
在我的设备上输出结果是"f1_atl",这就是我们需要在DTB文件中查找的关键词。
3.2 提取dtbo分区镜像
通过ADB提取dtbo分区镜像到手机存储:
bash复制adb shell
su
dd if=/dev/block/by-name/dtbo of=/sdcard/dtbo.img bs=1024
然后将镜像文件拉取到电脑:
bash复制adb pull /sdcard/dtbo.img
4. 解包和修改DTB文件
4.1 解包dtbo镜像
使用mkdtimg工具解包我们提取的dtbo.img:
bash复制mkdir dtb_files
cd dtb_files
mkdtimg dump ../dtbo.img -b dtb_cd
这会在当前目录下生成一系列dtb_cd.*文件,每个文件对应一个DTB。
4.2 定位包含电池信息的DTB
我们需要找到包含"f1_atl"电池信息的DTB文件:
bash复制for f in dtb_cd.*; do
dtc -I dtb -O dts "$f" 2>/dev/null | grep -q "f1_atl" && echo ">>> Found in $f";
done
在我的案例中,输出显示dtb_cd.11和dtb_cd.12两个文件包含电池信息。
4.3 反编译和修改容量值
现在我们来修改这两个文件中的电池容量值:
bash复制# 处理第一个文件
dtc -I dtb -O dts -o battery11.dts dtb_cd.11
sed -i 's/nom-batt-capacity-mah = <0xce4>/nom-batt-capacity-mah = <0xfa0>/' battery11.dts
dtc -I dts -O dtb -o dtb_cd.11 battery11.dts
# 处理第二个文件
dtc -I dtb -O dts -o battery12.dts dtb_cd.12
sed -i 's/nom-batt-capacity-mah = <0xce4>/nom-batt-capacity-mah = <0xfa0>/' battery12.dts
dtc -I dts -O dtb -o dtb_cd.12 battery12.dts
这里0xce4是原装3300mAh的十六进制表示(3300=0xCE4),0xfa0是我们新电池的4000mAh(4000=0xFA0)。如果你使用的是其他容量的电池,需要计算对应的十六进制值。
5. 重新打包和刷入dtbo镜像
5.1 重新打包dtbo镜像
将所有DTB文件按原始顺序重新打包:
bash复制mkdtimg create new_dtbo.img dtb_cd.0 dtb_cd.1 dtb_cd.2 dtb_cd.3 dtb_cd.4 \
dtb_cd.5 dtb_cd.6 dtb_cd.7 dtb_cd.8 dtb_cd.9 dtb_cd.10 dtb_cd.11 dtb_cd.12
5.2 刷入修改后的镜像
将手机重启到fastboot模式:
bash复制adb reboot bootloader
然后刷入新的dtbo镜像:
bash复制fastboot flash dtbo new_dtbo.img
fastboot reboot
6. 验证和问题排查
6.1 验证修改是否成功
重启后,可以通过以下命令检查电池容量是否已更新:
bash复制adb shell
su
cat /sys/class/power_supply/battery/charge_full_design
这个值应该显示为你设置的新容量(4000000,单位是微安时)。
6.2 常见问题及解决方案
-
刷入后无法启动:
- 尝试进入fastboot重新刷入原厂dtbo镜像
- 检查是否严格按照顺序打包了所有DTB文件
- 确认修改时没有破坏DTB文件结构
-
容量显示未改变:
- 确认修改了所有包含电池信息的DTB文件
- 检查系统是否有缓存,尝试清除电池统计数据
- 某些ROM可能需要额外修改其他位置的配置
-
电量百分比跳变:
- 新电池可能需要几次完整的充放电循环来校准
- 考虑使用电池校准工具重新校准
7. 进阶技巧与注意事项
-
不同ROM的适配:
- 不同定制ROM可能将电池信息存储在不同位置
- 除了dtbo分区,还需要检查vendor分区中的相关配置
- EvolutionX等AOSP类ROM通常只需要修改dtbo
-
电池健康监控:
- 修改容量后,系统仍会根据实际衰减情况计算健康度
- 可以通过
cat /sys/class/power_supply/battery/health查看电池健康状态
-
性能与发热考量:
- 大容量电池可能改变设备的充放电特性
- 建议适当调整充电电流参数以避免过热
- 修改
/sys/class/power_supply/battery/constant_charge_current_max可以限制充电电流
-
备份与恢复策略:
- 每次系统更新后可能需要重新修改dtbo
- 建议保存修改过的dts文件以便快速重新应用
- 可以制作Magisk模块来自动化这个过程
在实际操作中,我发现不同批次的电池可能需要微调参数才能获得最佳表现。建议在修改后观察几天电池的使用情况,必要时可以进一步调整。另外,有些第三方电池的保护板可能报告不准确的数据,这种情况下可能还需要修改电池驱动才能获得最佳体验。