OnePlus 7 Pro 被我玩到电池爆炸后选用直供电的心路历程
#android,#无电池,#直供电,#adb,#fastboot,#magisk-module,#magisk,
我的一加7pro手机被我玩的电池爆炸了,就是发光冒烟别眨眼的那种啪,然后我就不想换电池了想改直供电,于是在淘宝上购买了oppo通用直供电电线
但直供电会有问题,这个编译可以低成本解决吗?
- 充电宝供电需要重启两次才能开机
- 手机熄屏会关机
- 手机系统会模拟掉电
- 关机状态连接电源和数据线会反复重启
- 进入fastboot或者从fastboot重启时连接数据线会反复重启,需要拔掉数据线仅在直供电的情况下才能手动重启成功
遇到的问题解析:
| 问题 | 根本原因 | 能否低成本解决 |
|---|---|---|
| 1. 充电宝供电需重启两次才能开机 | 启动初期电压不稳定/电池状态不满足启动条件 | 不知道可能换个电流大的充电器可以?充电器是 5V,3A; 充电宝的话是5V,4.5A 可以正常开机 |
| 2. 熄屏会关机 | 电池状态为"无",触发低电量或电源中断保护 | 开发者模式开启屏幕常亮,锁屏设置永不熄屏? |
| 3. 系统模拟掉电(比如电量跳变、关机) | 电池电量逻辑或热管理导致异常掉电 | 可通过adb修改电池管理策略,还要解决重启自启动问题? |
| 4. 关机状态接电源会反复重启 | PMIC 电源循环 / 无电池电压反馈导致异常 | 多为硬件行为,不一定能完全解决 |
| 5. Fastboot 接线会循环重启 | bootloader 层电源检测失败 | 属于 bootloader 阶段,无法控制 |
大部分问题都无法解决,真是太好了🥹
我本以为要编译内核模拟假电池呢,那太累了,我也不懂电池检测逻辑啊,真是太好了🥹
就在我痛苦的浏览内核的时候,我突然想到 Magisk app 启动后会自动运行模块,太好了思路有了,真是太好了🥹
我立刻有了一个思路在本地创建了一个目录 batteryhack 里面两个文件,一个是自定义模块信息,另一个是执行的脚本,然后开机自启动,嘿嘿真是我都快疯了,真是太好了🥹
- 开启 Settings -> System -> Developer options -> USB debugging
- 连接电脑,看到手机有提示就直接 allow 允许授权
- adb shell 进入手机 shell ,编写脚本
adb shell
mkdir -pv /sdcard/batteryhack
# pushd /sdcard/batteryhack 2>/dev/null
cd /sdcard/batteryhack
创建 module.prop 文件
# 自定义模块信息
cat << '469138946ba5fa' | tee module.prop
id=batteryhack
name=Battery Hack
version=1.0
versionCode=1
author=469138946ba5fa
description=模拟充电 + 开机自动开无线 ADB@5555
469138946ba5fa
在 batteryhack 目录下新建 post-fs-data.sh 文件。它会在系统挂载 /data 后立即执行,非常适合改属性。
用于在系统挂载阶段尽早注入只读属性,确保底层提权彻底
cat << '469138946ba5fa' | tee post-fs-data.sh
#!/system/bin/sh
MODDIR=${0%/*}
# 1. 早期阶段注入核心调试属性
resetprop -n ro.debuggable 1
resetprop -n service.adb.root 1
resetprop -n persist.adb.tcp.port 5555
469138946ba5fa
创建 service.sh 文件
这里需要注意
ensure_adb_keys()函数是用来维持手机授权状态的
手机授权设备adb权限会写入特定公钥到/data/misc/adb/adb_keys文件路径
所以获取密钥的方法就是提前让手机授权设备
通过adb shell cat /data/misc/adb/adb_keys获取对应设备的公钥
最后将公钥替换到对应函数的位置即可
cat << '469138946ba5fa' | tee service.sh
#!/system/bin/sh
MODDIR=${0%/*}
# [可选]批量注入与守护 ADB 公钥的函数
# 将提取的公钥动态写入到文件维持授权状态
ensure_adb_keys() {
local adb_keys_file="/data/misc/adb/adb_keys"
# 确保文件存在,防止首次开机报错
touch "$adb_keys_file" 2>/dev/null
# 逐行读取以下的多行文本块并进行无重复注入
while read -r key_line; do
# 忽略空行
[ -z "$key_line" ] && continue
# 使用 -Fq 精确纯文本匹配,防止加号/等号引起正则报错
if ! grep -Fq "$key_line" "$adb_keys_file" 2>/dev/null; then
echo "$key_line" >> "$adb_keys_file"
fi
# 将提取的公钥替换到这里,可以写多行,顶格写
done << '469138946ba5fa_1'
QAAAAPXaan???? user1@localhost
QAAAAPXaan???? user2@localhost
469138946ba5fa_1
# 循环结束后,统一修正权限
chmod 644 "$adb_keys_file"
chown system:shell "$adb_keys_file"
restorecon "$adb_keys_file"
}
# 核心业务逻辑封装
run_hack() {
# 1. 等待系统完全启动完毕
while [ "$(getprop sys.boot_completed)" != "1" ]; do sleep 1; done
# 缓冲 5 秒,确保底层框架和各种 dumpsys 服务完全就绪
sleep 5
# [新增] 2. 首次注入电池伪装
# 声明电池存在
dumpsys battery set present 1
# 声明当前处于交流电(电源适配器)供电状态
dumpsys battery set ac 1
# 声明电池状态为“充满” (5代表Full,2代表Charging)
dumpsys battery set status 5
# 强制锁定电量显示为 100%
dumpsys battery set level 100
# 3. 设置常亮
settings put global stay_on_while_plugged_in 3
settings put system screen_off_timeout 2147483647
# 4. 首次执行批量注入公钥
ensure_adb_keys
# 5. 开启并重启无线 ADB
setprop service.adb.tcp.port 5555
stop adbd
start adbd
# 6. 守护进程 (每 600s 检查一次状态)
while true; do
sleep 600
# [新增] 巩固电池伪装,防止被底层 healthd 刷新掉
dumpsys battery set present 1
dumpsys battery set ac 1
dumpsys battery set status 5
dumpsys battery set level 100
ADB_STATE="$(getprop init.svc.adbd)"
ADB_ROOT="$(getprop service.adb.root)"
# 如果 ADB 服务挂了,或者 Root 权限掉了
if [ "$ADB_STATE" != "running" ] || [ "$ADB_ROOT" != "1" ]; then
# 再次调用函数,自动补齐可能被系统或插线操作刷掉的公钥
ensure_adb_keys
# 重新拉起 ADB 服务
resetprop -n service.adb.root 1
resetprop -n persist.adb.tcp.port 5555
setprop service.adb.tcp.port 5555
stop adbd
start adbd
fi
done
}
# 挂入后台运行,让脚本主线程立即退出,符合 Magisk 规范
run_hack &
exit 0
469138946ba5fa
返回目录 /sdcard/ 复制 batteryhack 到 /data/adb/modules
# 返回目录
# popd
cd /sdcard/
# 然后通过su权限将文件夹放到 magisk 模块目录 /data/adb/modules
su - root sh -c 'cp -frv /sdcard/batteryhack /data/adb/modules/'
su - root sh -c 'chmod 644 /data/adb/modules/batteryhack/module.prop'
su - root sh -c 'chmod 755 /data/adb/modules/batteryhack/post-fs-data.sh'
su - root sh -c 'chmod 755 /data/adb/modules/batteryhack/service.sh'
# 退出 adb shell
exit
很好接下来
- 开启 Settings -> System -> Developer options -> Stay awake
- 开启 Settings -> System -> Developer options -> Rooted debugging
- 开启 Settings -> System -> Developer options -> Disable adb authorization timeout
拔掉 typec 数据线重启手机测试看看,因为插上 typec 数据线,在直供电状态下会循环重启,这个没法解决
真是太好了🥹,电量不掉了,无线也可以调试了,真是太好了🥹
Comments
Post a Comment