Android Root 完全指南
从 Bootloader 到 Magisk,彻底搞懂手机 Root
December 17, 2024·7 min read·Yimin
#Android#Root#Magisk#自动化
本文带你彻底搞懂 Android Root 的原理,以及为什么某些自动化场景需要 Root 权限。
🎯 为什么需要 Root?
真实场景
使用 AI 自动化工具操控手机时,某些 APP 会检测到"模拟点击"并拒绝响应:
⚠️ 检测到疑似使用模拟点击
请关闭相关软件后重试
为什么会被检测到?
ADB 点击的两种方式
┌────────────────────────────────────────┐
│ 点击方式对比 │
├────────────────────────────────────────┤
│ │
│ 方式1: input tap (无需 Root) │
│ ┌──────────────────────────────────┐ │
│ │ adb shell input tap 500 800 │ │
│ │ ↓ │ │
│ │ Android InputManager 服务 │ │
│ │ ↓ │ │
│ │ 应用收到点击 ❌ 可被检测 │ │
│ └──────────────────────────────────┘ │
│ │
│ 方式2: sendevent (需要 Root) │
│ ┌──────────────────────────────────┐ │
│ │ sendevent /dev/input/event4 ... │ │
│ │ ↓ │ │
│ │ 直接写入触摸屏设备 │ │
│ │ ↓ │ │
│ │ 应用收到点击 ✅ 像真人触摸 │ │
│ └──────────────────────────────────┘ │
│ │
└────────────────────────────────────────┘
关键区别:
input tap:通过系统服务转发,会被标记为"非真实触摸"sendevent:直接写入触摸屏设备,和手指触摸一模一样
但是,sendevent 需要写入 /dev/input/eventX,这需要 Root 权限。
🔐 什么是 Root?
Root 是 Android(Linux)系统的最高权限用户:
| 用户 | 权限 | 能做什么 |
|---|---|---|
| 普通用户 | 受限 | 只能操作自己的文件 |
| Shell 用户 | 有限 | ADB 默认权限 |
| Root | 无限 | 可以做任何事 |
# 普通 ADB Shell
$ adb shell id
uid=2000(shell) ← 不是 root
# 有 Root 权限后
$ adb shell su -c id
uid=0(root) ← 最高权限!
Root 能做什么?
| 能力 | 示例 |
|---|---|
| 访问系统文件 | 修改 /system 分区 |
| 控制硬件 | 直接写入触摸屏设备 |
| 修改系统设置 | 更改隐藏的系统配置 |
| 安装系统级模块 | Xposed、LSPosed 等 |
🚪 什么是 Bootloader?
手机的"门卫"
Bootloader 是手机开机时最先运行的程序,它决定加载什么系统。
┌────────────────────────────────────────┐
│ 手机启动流程 │
├────────────────────────────────────────┤
│ │
│ ① 按电源键 │
│ ↓ │
│ ② Bootloader 启动 │
│ "检查要启动什么..." │
│ ↓ │
│ ③ 验证系统签名 │
│ "系统是官方的吗?" │
│ ↓ │
│ ④ 启动 Android │
│ │
└────────────────────────────────────────┘
为什么要解锁?
| 状态 | 限制 |
|---|---|
| 🔒 锁定 | 只能启动官方签名的系统 |
| 🔓 解锁 | 可以刷入任何系统/镜像 |
类比:
- 锁定 = 只能用官方钥匙开门
- 解锁 = 可以配自己的钥匙
如何检查解锁状态?
# 重启到 Fastboot 模式
adb reboot bootloader
# 检查解锁状态
fastboot getvar unlocked
# unlocked: yes ← 已解锁
# unlocked: no ← 未解锁
如何解锁?
不同品牌方法不同:
| 品牌 | 解锁方式 |
|---|---|
| 小米 | 官网申请,7天等待期 |
| 一加 | 开发者选项直接解锁 |
| Google Pixel | Fastboot 命令解锁 |
| 其他 | 可能需要第三方工具 |
🎭 Magisk 是什么?
现代 Root 方案
Magisk 是目前最流行的 Root 工具,由 topjohnwu 开发。
┌────────────────────────────────────────┐
│ Magisk 的工作原理 │
├────────────────────────────────────────┤
│ │
│ 传统 Root (不推荐) │
│ ┌──────────────────────────────────┐ │
│ │ 直接修改 /system 分区 │ │
│ │ ↓ │ │
│ │ 系统检测到被篡改 ❌ │ │
│ │ 某些APP拒绝运行 ❌ │ │
│ └──────────────────────────────────┘ │
│ │
│ Magisk (推荐) ✅ │
│ ┌──────────────────────────────────┐ │
│ │ 只修改 boot/init_boot 分区 │ │
│ │ ↓ │ │
│ │ /system 保持不变 │ │
│ │ ↓ │ │
│ │ 启动时"临时"挂载 Root │ │
│ │ ↓ │ │
│ │ 可以隐藏 Root 状态 │ │
│ └──────────────────────────────────┘ │
│ │
└────────────────────────────────────────┘
Magisk 的优势
| 特性 | 说明 |
|---|---|
| 🔓 Root 管理 | 提供 su 命令 |
| 🙈 隐藏 Root | 敏感APP正常使用 |
| 📦 模块系统 | 扩展系统功能 |
| ✅ 不改 /system | 不触发检测 |
| 🔄 OTA 友好 | 系统更新后可恢复 |
📦 boot.img vs init_boot.img
Android 版本差异
不同 Android 版本,Root 需要修补的文件不同:
| Android 版本 | 需要修补的文件 |
|---|---|
| Android 12 及以下 | boot.img |
| Android 13+ | init_boot.img |
为什么 Android 13 变了?
Google 把启动相关的 ramdisk 从 boot.img 移到了单独的 init_boot.img:
┌────────────────────────────────────────┐
│ Android 12 vs Android 13+ │
├────────────────────────────────────────┤
│ │
│ Android 12: │
│ ┌────────────────┐ │
│ │ boot.img │ ← Magisk 修补这个 │
│ │ • kernel │ │
│ │ • ramdisk │ │
│ └────────────────┘ │
│ │
│ Android 13+: │
│ ┌────────────────┐ ┌──────────────┐ │
│ │ boot.img │ │ init_boot.img│ │
│ │ • kernel │ │ • ramdisk │ │
│ └────────────────┘ └──────────────┘ │
│ ↑ │
│ Magisk 修补这个 │
│ │
└────────────────────────────────────────┘
如何判断?
# 检查 Android 版本
adb shell getprop ro.build.version.release
# 输出: 15 ← Android 15
# 检查是否有 init_boot 分区
adb shell ls /dev/block/by-name/ | grep init_boot
# init_boot_a ← 存在,用 init_boot.img
# init_boot_b
🛠️ 完整 Root 流程
准备工作
- ✅ 官方刷机包(包含
boot.img或init_boot.img) - ✅ 手机已解锁 Bootloader
- ✅ 电脑安装 ADB 和 Fastboot
步骤详解
┌────────────────────────────────────────┐
│ Root 完整流程 │
├────────────────────────────────────────┤
│ │
│ ① 获取原版镜像 │
│ 从刷机包提取 init_boot.img │
│ ↓ │
│ ② 传输到手机 │
│ adb push init_boot.img /sdcard/ │
│ ↓ │
│ ③ 安装 Magisk APP │
│ adb install Magisk.apk │
│ ↓ │
│ ④ 修补镜像 │
│ 在 Magisk 中选择修补文件 │
│ ↓ │
│ ⑤ 取回修补后的文件 │
│ adb pull /sdcard/Download/ │
│ magisk_patched_xxx.img │
│ ↓ │
│ ⑥ 刷入修补后的镜像 │
│ fastboot flash init_boot_a xxx.img │
│ ↓ │
│ ⑦ 重启并授权 │
│ 打开 Magisk 授权 Shell │
│ ↓ │
│ ✅ Root 成功! │
│ │
└────────────────────────────────────────┘
验证 Root
# 测试 su 命令
adb shell su -c id
# 成功输出:
uid=0(root) gid=0(root) context=u:r:magisk:s0
🎮 实战:使用 sendevent 模拟真实触摸
有了 Root,就可以用 sendevent 模拟真实触摸:
# 获取触摸屏设备
adb shell getevent -pl | grep -A5 "event"
# /dev/input/event4 ← 触摸屏
# 用 sendevent 发送点击事件
adb shell su -c "
sendevent /dev/input/event4 3 57 0 &&
sendevent /dev/input/event4 3 53 500 &&
sendevent /dev/input/event4 3 54 800 &&
sendevent /dev/input/event4 1 330 1 &&
sendevent /dev/input/event4 0 0 0 &&
sendevent /dev/input/event4 3 57 -1 &&
sendevent /dev/input/event4 1 330 0 &&
sendevent /dev/input/event4 0 0 0
"
sendevent 参数说明
| 参数 | 含义 |
|---|---|
| 3 57 0 | 设置触摸 ID |
| 3 53 500 | X 坐标 = 500 |
| 3 54 800 | Y 坐标 = 800 |
| 1 330 1 | 触摸按下 |
| 0 0 0 | 同步事件 |
| 3 57 -1 | 释放触摸 ID |
| 1 330 0 | 触摸抬起 |
⚠️ 注意事项
解锁 Bootloader 的风险
| 风险 | 说明 |
|---|---|
| 📱 数据清除 | 解锁会清空所有数据 |
| 🔓 安全性降低 | 手机丢失后更容易被破解 |
| 📵 可能失去保修 | 部分厂商会失去保修 |
Root 的风险
| 风险 | 说明 |
|---|---|
| 🦠 恶意软件 | Root 后恶意软件危害更大 |
| 💥 变砖 | 操作不当可能无法开机 |
| 🏦 部分APP | 某些APP检测Root后拒绝运行 |
📊 总结
┌────────────────────────────────────────┐
│ 核心概念总结 │
├────────────────────────────────────────┤
│ │
│ Root │
│ └─ Android 最高权限 │
│ └─ 可以访问系统任何文件 │
│ └─ 可以执行任何命令 │
│ │
│ Bootloader │
│ └─ 手机启动时的"门卫" │
│ └─ 决定能不能刷入非官方系统 │
│ └─ 必须先解锁才能刷 Magisk │
│ │
│ Magisk │
│ └─ 现代 Root 方案 │
│ └─ 不修改 /system,更安全 │
│ └─ 可以隐藏 Root 状态 │
│ │
│ init_boot.img │
│ └─ Android 13+ 的新分区 │
│ └─ Magisk 需要修补这个文件 │
│ │
└────────────────────────────────────────┘
📚 扩展阅读
本文基于 Android 15 + Magisk v28.1 实践