Pixel 3(自编译 AOSP)Magisk Root 全过程记录
设备:Pixel 3(blueline),序列号 <序列号>
日期:2026-10-31
最终结果:Magisk 27.0 root 成功(su可用);Zygisk 经 27.0 实测可用(hook 已生效);LSPosed 1.9.2 (7024) - Zygisk 已激活(sepolicy 规则加载成功),本机可用 Xposed
备份文件:<下载目录>\pixel3-boot-backup\boot_a.img/boot_b.img(原版 boot 后悔药)
0. 设备初始状态
| 项目 | 值 | 来源 |
|---|---|---|
| 型号 | AOSP on blueline(自编译 AOSP,非零售系统) | getprop ro.product.model |
| 系统 | Android 12,构建 ID SP1A.210812.016.C2 | getprop ro.build.fingerprint |
| 构建类型 | user(生产构建)+ release-keys | getprop ro.build.type/ro.build.tags |
| 可调试 | ro.debuggable=0→adb root不可用 | getprop ro.debuggable |
| Bootloader | 已解锁(flash.locked=0),OEM 解锁允许 | fastboot 界面 / getprop |
| 槽位 | 激活槽 _a,双槽 A/B(boot_a / boot_b) | getprop ro.boot.slot_suffix |
| 系统来源 | 编译者 “vm”,增量版本号 eng.vm.20251126.083311 | 指纹字段 |
1. 时间线总览(问题 → 尝试 → 结果)
| # | 遇到的问题 | 尝试 | 结果 |
|---|---|---|---|
| 1 | adb root报 “cannot run as root in production builds” | 误判为 eng 构建可 root | 指纹字段读错位,实为 user 构建,此路不通 |
| 2 | fastboot 不识别设备 | Windows 自动搜索驱动 | 失败;改手动装 Google USB 驱动解决 |
| 3 | 需要本机原版 boot.img 兜底 | fastboot boot临时启动 TWRP 3.7.1 dump | dump 成功(64MB×2),但 TWRP 3.7.1 卡 logo |
| 4 | cmd 中MSYS_NO_PATHCONV=1报 not recognized | 照搬 git-bash 命令 | cmd 不需要该前缀,去掉即可 |
| 5 | 重启误进 “No command”(原版 recovery) | 电源+音量上组合键 | 出菜单选 Reboot system now 回系统 |
| 6 | Magisk 31.1 刷入成功但suPermission denied 且不弹窗 | 查设置/超级用户页/logcat | su 全拒;当时归因 Zygisk 注入失败,后被 27.0 实测推翻(见 2.4 / 2.7) |
| 7 | 降级 27.0 后 App 一点就消失 | 卸载重装 27.0 | 31.1 守护进程实时用 stub 顶掉旧 App,App 修补路走不通 |
| 8 | 需要绕开 App 安装 27.0 | TWRP 3.6.2 临时启动 +adb sideloadMagisk 27.0 | 成功,boot 直接被打补丁 |
| 9 | LSPosed 1.9.2 装后「部分激活 / SEPolicy 未被正确加载」 | 追查 preinit 链路 | 根因:sideload 安装跳过了 preinit 设备检测,boot 配置无 PREINITDEVICE(见 2.8) |
| 10 | 重打补丁后模块安装器仍报 “Unable to find preinit dir” | 查 magiskd 挂载命名空间 | magiskd 在独立 mnt namespace 挂载成功,安装器看不到属正常现象;手动放规则等效 |
| 11 | 修复 sepolicy 加载 | BOOTMODE 重打补丁 + 手动放 sepolicy.rule 到 /metadata | 成功,管理器状态卡变「已激活」,警告卡消失 |
2. 详细过程与问题排查
2.1 指纹误读:把增量版本号当成了构建类型
指纹原文:
Android/aosp_blueline/blueline:12/SP1A.210812.016.C2/eng.vm.20251126.083311:user/release-keys格式为品牌/产品/设备:版本/构建ID/增量版本号:构建类型/签名标签。
误判:把「增量版本号」字段里的eng当成了构建类型,以为adb root可用。
真相:真正的构建类型是最后的user(生产构建),ro.build.type=user、ro.debuggable=0,adb root报错是对的。
教训:指纹里「增量版本号」字段可以随便写字符串,构建类型字段才决定 adb root 能力。做 PIF 指纹伪装时同理。
2.2 fastboot 驱动
Windows 自动搜索驱动失败是正常的。解决:下载 Google USB Driver
(https://dl.google.com/android/repository/usb_driver_r13-windows.zip),
设备管理器 → 更新驱动 → 浏览我的电脑 → 选解压目录(含android_winusb.inf)。
找不到就点「从计算机上的可用驱动程序列表中选取」→ 取消勾选显示兼容硬件 → Google, Inc. → Android Bootloader Interface。
2.3 原版 boot 兜底备份(TWRP 临时启动)
- 用
fastboot boot twrp-xxx.img只进内存不刷入,重启即消失,设备零改动 - 在 TWRP 的 root shell 里
dd两个槽的 boot 分区,拉回电脑存档 - TWRP 3.7.1 在此机卡 logo(Pixel 3 + Android 12 已知兼容问题);3.6.2_9-0 可用
- 备份文件各 67,108,864 字节(64MB),大小不对即 dump 失败
2.4 Magisk 31.1 su 被拒(排查记录,结论后被 2.7 修正)
现象:su -c id→ Permission denied;无弹窗;「超级用户」页签空;su -v却正常返回31.1:MAGISKSU。
logcat 证据:
I Magisk : Magisk 31.1(31100) daemon started ← 守护进程正常 W nativebridge: Unsupported native bridge API in libzygisk.so (is version 2 not compatible with 3) ← Zygisk 注入失败 W Magisk : su: request rejected (2000) ← su 请求被拒(2000=shell)因果链(31.1 当时):
- Magisk 靠
libzygisk.so以 native bridge 方式注入 zygote - 日志出现 native bridge API 版本警告(要 v3,lib 报 v2),当时据此判定「注入失败」
- Magisk 28 起,MagiskSU 被移进 Zygisk 内部——su 请求全部被守护进程拒绝(rejected 2000)
- 第 2 步的判定后来被推翻:27.0 实测同样的警告存在而 hook 正常生效(见 2.7)。31.1 失败的具体断点当时未抓 hook 日志,标注未证实
2.5 降级 27.0 时 App “一点就消失”
- Magisk27.0 是最后一个 su 不依赖 Zygisk 的版本(su 跑在守护进程)
- 但在 31.1 的 boot 上装 27.0 App:31.1 守护进程是活着的,App 一启动握手发现版本不符,立刻把内置的 31.1 stub 重装上去顶掉 27.0——不用等重启,点击即替换
- 结论:boot 是 31.1 时,"用 27.0 App 修补"这条路被堵死,必须绕开 App
2.6 最终方案:TWRP sideload 直装
TWRP 的 ADB Sideload 直接把 Magisk 安装包喂给 recovery 安装器(检测到 recovery 环境会直接修补 boot 分区),完全不需要 Magisk App 参与,绕开了 App 与守护进程的版本对抗。
2.7 反转:27.0 上 Zygisk 实际可用(hook 已生效)
root 成功后复查 Zygisk 状态(四层证据):
- logcat 仍有
nativebridge: Unsupported native bridge API ... version 2 not compatible with 3(27.0,Zygisk 开关已开) su -c "grep -c zygisk /proc/<zygote64 pid>/maps"→ 3- maps 明细:
/system/lib64/libzygisk.so以三段映射进入 zygote64(r-xp 代码段 / r–p 只读段 / rw-p 数据段)→ 库已加载 - logcat 决定性证据:
(zygisk32 同样三条)→ Zygisk 核心 hook 已装上Magisk : zygisk64: replace nativeForkAndSpecialize Magisk : zygisk64: replace nativeSpecializeAppProcess Magisk : zygisk64: replace nativeForkSystemServer
结论修正:native bridge 版本警告 ≠ Zygisk 失效。art 的版本校验发生在 dlopen 之后,而 libzygisk 的构造函数在 dlopen 瞬间已执行完 hook,且库带 nodelete 标志卸不掉——警告只是登记记录,活已经干完。
「Zygisk 在此机永久不可用」的判断作废。功能级验证:安装 LSPosed 1.9.2(Zygisk 版)实测模块加载(结果见 2.8)。
2.8 LSPosed 1.9.2 从「部分激活」到「已激活」(preinit/sepolicy 修复)
第一轮:安装即「部分激活」
- 装 LSPosed-v1.9.2-7024-zygisk-release.zip + manager.apk,框架注入本身成功:logcat 有
LSPosedService starting、bridge binder received、ZygiskCompanion welcome,对真实 App 的注入决策正常 - 但管理器状态卡显示「部分激活 / SEPolicy 未被正确加载」——框架活着,sepolicy 规则没加载
根因定位:recovery 安装跳过 preinit 检测
- 模块的 sepolicy.rule 需要 magiskinit 在早期启动从 preinit 分区加载(
/data/.magisk/preinit/<模块>/sepolicy.rule) - preinit 设备检测在
boot_patch.sh的$BOOTMODE && ... PREINITDEVICE=$(./magisk64 --preinit-device)一行——TWRP sideload 安装时 BOOTMODE=false,这步被跳过,config 里没有 PREINITDEVICE,magiskinit 不挂 preinit 分区 - 这是「此机 LSPosed 部分激活」的直接原因
修复步骤
- 用原版 boot_a.img 在正常系统里重跑 boot_patch.sh(输出确认
Pre-init storage partition: metadata),fastboot 刷入 - 模块安装器仍报 “Unable to find preinit dir”:排查发现 magiskd 在独立挂载命名空间(mnt namespace 与 shell/init 不同)里挂载 preinit 镜像成功(
/proc/<magiskd>/mountinfo可见259:4 /magisk /debug_ramdisk/.magisk/preinit),安装器跑在调用者命名空间看不到挂载点——正常现象,不影响修复 - 手动把规则放进
/metadata/magisk/zygisk_lsposed/sepolicy.rule(49 字节:allow dex2oat dex2oat_exec file execute_no_trans),与 magiskinit 早期启动读 /metadata 的路径等效 - 重启 → 状态卡变「已激活 1.9.2 (7024) - Zygisk」,SEPolicy 警告卡消失,API 版本 100,Xposed API 调用保护启用
结论:本机可用 Xposed。截图证据:<下载目录>\lsposed-check.png(部分激活)/lsposed-check2.png(已激活)。
教训:recovery 环境装 Magisk(sideload)会跳过 preinit 检测,导致依赖 sepolicy.rule 的模块(LSPosed 等)部分失效。装完模块若见「SEPolicy 未被正确加载」,先查 boot config 有无 PREINITDEVICE,缺则 BOOTMODE 重打补丁。
2.9 功能级验证:Hide My Applist 实测通过(2026-10-31 晚)
装 HMA(注意版本:最新 v3.8.3 要 libxposed API 101,本机 LSPosed 1.9.2 是 API 100,必须用 V3.6.1,GitHub Dr-TSNG/Hide-My-Applist)→ LSPosed 管理器启用、作用域只勾「系统框架」→ 重启。
验证证据(双重):
- HMA 首页:「模块已激活 [3.6.1-462]」「系统服务运行中 [99]」(截图
<下载目录>\hma-check.png) - logcat:
LSPosed-Bridge: Loading legacy module com.tsng.hidemyapplist(注入 system_server)→XposedEntry Hook entry→Got pms: PackageManagerService@...→HMA service initialized
至此三步走完:部分激活 → 已激活 → 真模块 hook 生效。手机 Xposed 完全可用。日常伪装用法:HMA「模板管理」建黑名单(勾 Magisk/LSPosed/HMA 自身)→「应用管理」套到目标 App;配套 Magisk DenyList + Shamiko 组成完整过检栈。
3. 最终实现方案(完整命令)
备料
:: Magisk-v27.0.apk(GitHub releases,走本地代理下载) :: TWRP 3.6.2_9-0:https://dl.twrp.me/blueline/ :: apk 复制一份改名 zip copy <下载目录>\Magisk-v27.0.apk <下载目录>\Magisk-v27.0.zip兜底备份(一次性,先做)
adb reboot bootloader fastboot boot twrp-3.6.2_9-0-blueline.img :: TWRP 起来后: adb shell "dd if=/dev/block/by-name/boot_a of=/tmp/boot_a.img" adb shell "dd if=/dev/block/by-name/boot_b of=/tmp/boot_b.img" adb shell "ls -l /tmp/boot_a.img /tmp/boot_b.img" :: 应为 67108864 adb pull /tmp/boot_a.img <下载目录>\pixel3-boot-backup\ adb pull /tmp/boot_b.img <下载目录>\pixel3-boot-backup\安装 Magisk 27.0
adb reboot bootloader fastboot boot twrp-3.6.2_9-0-blueline.img :: TWRP: Advanced → ADB Sideload → Swipe to Start Sideload adb sideload <下载目录>\Magisk-v27.0.zip :: TWRP: Reboot → System adb install <下载目录>\Magisk-v27.0.apk验证
adb shell su -c id :: 成功输出:uid=0(root) gid=0(root) groups=0(root) context=u:r:magisk:s04. 知识沉淀
4.1 Magisk 版本代际(决定路线选择)
| 版本 | su 实现位置 | 含义 |
|---|---|---|
| ≤ 27.x | 守护进程(daemon) | 不需要 Zygisk,兼容性最好 |
| ≥ 28.x | Zygisk 内部 | Zygisk 注入失败 = su 完全不可用 |
4.2 Zygisk 注入机制
- Magisk 把
libzygisk.so以 native bridge 方式挂进 zygote 进程 - zygote 会校验 native bridge 的 API 版本,不匹配会在日志打警告(
Unsupported native bridge API ... version X not compatible with Y),但警告不致命:hook 由库构造函数在 dlopen 瞬间完成,早于版本校验,且库带 nodelete 卸不掉 - 判定 Zygisk 是否真生效只看两处:
/proc/<zygote64 pid>/maps里 libzygisk.so 的映射 + logcat 里replace nativeForkAndSpecialize / nativeSpecializeAppProcess / nativeForkSystemServer三行 - 版本警告出现只说明 art 与 lib 版本不匹配,不说明 hook 没装上(本机 27.0 实测:警告与 hook 并存)
4.3 App 与 boot 版本必须成对
- boot 里的守护进程版本 ≠ App 版本时,新版守护进程会实时用自带 stub 替换旧 App(现象:安装完一点就消失)
- 规避:boot 和 App 同时升/同时降;或绕开 App(TWRP sideload)
- 事后注意:App 内提示更新时先别点,只升 App 会再次版本打架
4.4 终端差异
| 场景 | git-bash | cmd |
|---|---|---|
/dev等设备路径 | 需MSYS_NO_PATHCONV=1前缀 | 不需要(加了反而报 not recognized) |
| 列目录 | ls -l | dir |
| 路径写法 | /d/Downloads/... | <下载目录>\... |
4.5 误入 “No command”(原版 recovery)
按住电源键不放 + 短按一次音量上 → 出菜单 → 音量键选 Reboot system now → 电源键确认。
4.6 兜底思维
刷机前三件事:确认 bootloader 解锁状态 → 备份原版 boot(双槽都备)→ 记录恢复命令。
恢复命令只有一条:fastboot flash boot 原版boot.img。
4.7 preinit 分区与模块 sepolicy.rule
- 模块的
sepolicy.rule需要 magiskinit 在早期启动加载(/data/.magisk/preinit/<模块>/sepolicy.rule);依赖它的典型模块:LSPosed(dex2oat 规则) - preinit 设备检测只在BOOTMODE 下跑 boot_patch.sh时发生(
./magisk64 --preinit-device,优先级 /persist → /metadata → /cache → /data);TWRP sideload 安装跳过此步→ config 缺 PREINITDEVICE → 规则永不加载 - 症状判定:LSPosed「部分激活 + SEPolicy 未被正确加载」即此病;修复:BOOTMODE 重打补丁,或手动放规则到
<preinit分区>/magisk/<模块>/sepolicy.rule - magiskd 在独立 mnt namespace 挂 preinit 镜像,shell 和模块安装器(跑在调用者命名空间)看不到挂载点——“Unable to find preinit dir” 与修复无关,勿被误导
5. 遗留问题与后续
| 事项 | 状态 | 建议 |
|---|---|---|
| Zygisk / LSPosed / 模块 | 已全部验证可用:Zygisk hook 生效、LSPosed 1.9.2 已激活 | 可正常装 Xposed 模块;勿单独升级 Magisk App |
| Magisk 版本 | 27.0(boot 与 App 成对) | 保持 27.0,别单独升级 App |
| root 持久性 | 重启不影响(root 在 boot 分区,开机自动接管) | 已授权的 Shell 记录存于 magisk.db,重启保留 |
| 原版 boot 备份 | <下载目录>\pixel3-boot-backup\ | 永久保留,是唯一的后悔药 |
| 官方 C2 工厂镜像 | 已下载过(构建 ID 与本机一致) | 可与备份互相印证;flash-all 脚本切勿执行 |
附录:关键日志证据
10-31 14:50:05 I Magisk : Magisk 31.1(31100) daemon started 10-31 14:50:05 I Magisk : * Device API level: 31 10-31 14:50:06 W nativebridge: Unsupported native bridge API in libzygisk.so (is version 2 not compatible with 3) 10-31 14:52:06 W Magisk : su: request rejected (2000)27.0 Zygisk 生效证据(2026-10-31 15:26)
10-31 15:26:30 W nativebridge: Unsupported native bridge API in libzygisk.so (is version 2 not compatible with 3) 10-31 15:26:31 I Magisk : zygisk64: replace nativeForkAndSpecialize 10-31 15:26:31 I Magisk : zygisk64: replace nativeSpecializeAppProcess 10-31 15:26:31 I Magisk : zygisk64: replace nativeForkSystemServermaps(zygote64 pid=1044):grep -c zygisk= 3,/system/lib64/libzygisk.so三段映射(r-xp / r–p / rw-p)
LSPosed 激活证据(2026-10-31 晚)
- 管理器状态卡:「已激活 1.9.2 (7024) - Zygisk」,API 版本 100,Xposed API 调用保护已启用
- 「SEPolicy 未被正确加载」警告卡消失(只剩「需要更新」常规通知)
- 截图:
<下载目录>\lsposed-check2.png - 重打补丁输出关键行:
- Pre-init storage partition: metadata - 规则落点:
/metadata/magisk/zygisk_lsposed/sepolicy.rule(49 字节)