Skip to main content

OnePlus 7 Pro 被我玩到电池爆炸后选用直供电的心路历程

OnePlus 7 Pro 被我玩到电池爆炸后选用直供电的心路历程

OnePlus 7 Pro 被我玩到电池爆炸后选用直供电的心路历程

#android,#无电池,#直供电,#adb,#fastboot,#magisk-module,#magisk,

我的一加7pro手机被我玩的电池爆炸了,就是发光冒烟别眨眼的那种啪,然后我就不想换电池了想改直供电,于是在淘宝上购买了oppo通用直供电电线
0
1
2
3

但直供电会有问题,这个编译可以低成本解决吗?

  • 充电宝供电需要重启两次才能开机
  • 手机熄屏会关机
  • 手机系统会模拟掉电
  • 关机状态连接电源和数据线会反复重启
  • 进入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 数据线,在直供电状态下会循环重启,这个没法解决
    真是太好了🥹,电量不掉了,无线也可以调试了,真是太好了🥹

4

参考

magisk module引导

Comments

Popular posts from this blog

python学习之路☞9.Comment, Primitive Data Types and Branch Conditional Structure if ... else ...

python学习之路☞9.Comment, Primitive Data Types and Branch / Conditional Structure if … else … #python,#Comment,#data type,#branch/conditional structure,#input(),#int,#float,#complex,#boolean,#if … else …, 注释(Comment) 内置函数input()(input() Function) 基本数据类型整数(Primitive Data Types int) 基本数据类型小数(Primitive Data Types float) 基本数据类型复数(Primitive Data Types complex) 基本数据类型布尔(Primitive Data Types boolean) 分支结构if … else …(Branch / Conditional Structure if … else …) 参考 Comment ''' 注释: 给人看的说明文字,Python 解释器完全忽略 要点 # 让该行 # 之后的内容全部失效,解释器跳过。 行尾注释与代码在同一行,通常用于简短说明。 docstring(三引号字符串)放在函数/类/模块第一行时,可被 help() 和文档工具读取,有特殊意义。 好的注释解释"为什么",而不是"做了什么"(代码本身已经说明了做了什么): # ✗ i = i + 1 # i 加 1 # ✓ i += 1 # 跳过表头行 ''' # 这是单行注释,# 号后面全部忽略 x = 10 # 行尾注释,代码照常执行 # 多行注释:每行都加 # # 第一行说明 # 第二行说明 # 第三行说明 """ 这是多行字符串(docstring) 虽然常被当注释用, 但本质是字符串字面量,不是注释。 通常用于函数/类的文档说明。 """ def add ( a , b ) : """返回 a 与 b 的和。"...

OnePlus 7 Pro LineageOS 23.2 Android 16 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南

OnePlus 7 Pro LineageOS 23.2 Android 16 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南 OnePlus 7 Pro LineageOS 23.2 Android 16 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南 #docker,#linux,#termux,#android,#kernel,#lineageos,#oneplus,#git,#android16, gmkm6 x86_64 主机配置环境 安装配置 docker 防止污染环境 更新 docker 插件 compose 更新 docker 插件 buildx 创建编译容器 容器内编译镜像刷机 安装magisk,termux获取root termux检测内核docker缺失功能 根据内核docker缺失功能编译boot.img并获取root 开启全部必要扩展功能 下面的步骤是开启大部分非必要扩展功能 修补内核代码方案 下面的步骤是开启剩余部分非必要扩展功能 修补内核 安装测试运行 termux docker 其它关于termux的docker-compose和docker-buildx更新 安装用于校验的工具 开机自启动和容器化部署使用例子 Android16尝试开启KVM失败的例子(不用试了,唉) 内核修补 参考&感谢 gmkm6 x86_64 主机配置环境 注意,获取自己的手机型号代号,这一点很重要在后续的命令中都要用到 比如我的手机 oneplus7pro 是 guacamole 也可以尝试通过命令获取获取,但是我不知道是不是所有设备都是这样获取的 adb shell getprop ro.boot.project_codename 最重要的是,一定要找好固件包,免得变成砖头,有线刷包就可以怎么折腾都不怕 听我说,编译内核是一件很枯燥的核对过程,这个过程需要考虑到各项之间的互相依赖和冲突并以此作出取舍 这不是个简单的过程,这里只展示具有逻辑的依赖项,需要耐心和不断的试错总结 不得不说设计的内核是一件件精美的艺术品,从某种意义上来讲,万事万物皆为艺术,而探索艺术本身是...

OnePlus 7 Pro LineageOS 19.1 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南

OnePlus 7 Pro LineageOS 19.1 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南 OnePlus 7 Pro LineageOS 19.1 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南 #docker,#linux,#termux,#android,#kernel,#lineageos,#oneplus,#git, gmkm6 x86_64 主机配置环境 安装配置 docker 防止污染环境 更新 docker 插件 compose 更新 docker 插件 buildx 创建编译容器 容器内编译镜像刷机 安装magisk,termux获取root termux检测内核docker缺失功能 根据内核docker缺失功能编译boot.img并获取root 安装测试运行 termux docker 其它关于termux的docker-compose和docker-buildx更新 参考&感谢 注意,获取自己的手机型号代号,这一点很重要在后续的命令中都要用到 比如我的手机 oneplus7pro 是 guacamole 也可以尝试通过命令获取获取,但是我不知道是不是所有设备都是这样获取的 adb shell getprop ro.boot.project_codename 最重要的是,一定要找好固件包,免得变成砖头,有线刷包就可以怎么折腾都不怕 最近 OP7P 设备型号是 guacamole 手机刷了 GM1910_11_H.40 即 android 12 https://gauss-componentotacostmanual-sg.allawnofs.com/remove-d74c973c240292cb011317bb07f424a2/component-ota/23/03/28/6d4604798d27450e8de05671d5effbae.zip 内核版本 4.14.180-perf+ 发现 github.com/OnePlusOSS 官方有相关的开放残缺的内核源码,但缺失了很多代码配置 https://github.com/OnePlusOSS/android_kernel_o...