实操手册 · 一步一步跟着做
每一步都标清楚了是在手机上操作还是在电脑上操作。手机端配的是本机真机截图,照着点就行;电脑端给的是实际命令和真实输出,直接复制粘贴。
整个活儿分两条线:电脑负责刷机和传文件,手机负责点按和授权。两边交替进行,顺序不能乱。
一、解锁会清空手机全部数据。照片、微信聊天记录、应用数据全没。做之前先备份,微信单独用「聊天记录迁移」搬到另一台设备或电脑。
二、解锁要等 168 小时。小米账号和设备绑定满 7 天才能解锁,这是小米的限制,绕不过去。所以流程第一步就去绑账号、关查找手机,然后等,等待期间把后面的准备都做完。
下面从第一步开始。如果手机已经 root 好了、只想看 AdAway 部分,直接跳到第 14 步。
去 Google 官方页面下载 SDK Platform-Tools,解压到一个路径里没有中文、没有空格的目录,比如 D:\adb。解压完应该是这样:
D:\adb\platform-tools\
adb.exe
fastboot.exe
AdbWinApi.dll
AdbWinUsbApi.dll
验证一下能不能用:在 platform-tools 文件夹的地址栏里输入 cmd 回车,会直接在这个目录打开命令行,然后敲:
C:\> adb version
Android Debug Bridge version 1.0.41
Version 37.0.1-15733141
Running on Windows 10.0.19044
做完你会看到:能打印出版本号就说明工具正常。如果提示「不是内部或外部命令」,说明你不在这个目录里,或者路径写错了。
用数据线把手机连电脑。线要选能传数据的,很多充电线只有电源针脚,插上去电脑一点反应都没有。插好后手机通知栏会冒出一条「已连接到 USB 调试」。
电脑上敲:
C:\> adb devices
List of devices attached
lj6lbus8sorscazx device
第一次连会弹一个手机上的对话框「是否允许 USB 调试」,勾上「一律允许使用这台计算机进行调试」,再点「允许」。不点的话电脑这边会一直显示 unauthorized。
做完你会看到:设备后面跟的是 device 就对了。如果是 unauthorized,去手机上把那个授权弹窗点掉;如果列表是空的,换根线、换个 USB 口(优先插主板后面的口)。
手机这边:关掉「查找手机」。路径是 设置 → 点最上面的小米账号 → 云服务 → 查找手机 → 关闭。不关这个,解锁工具会直接拒绝,提示设备被锁定。
手机这边:登录小米账号,然后把设备绑上去。解锁工具要求手机和电脑登录同一个账号,而且这个账号在这台设备上要登录满 168 小时(7 天)。所以这一步越早做越好,做完就开始等。
电脑这边:下载小米官方解锁工具 MiFlashUnlock。解压后运行 miflash_unlock.exe,登录同一个小米账号,手机进 fastboot 再插上,工具里点「解锁」。
# 方法一:命令行 C:\> adb reboot bootloader # 方法二:手机关机后,同时按住「音量减 + 电源」直到出现兔子修安卓的图 # 确认进了 fastboot C:\> fastboot devices lj6lbus8sorscazx fastboot
解锁会清空全部数据,而且开机第一屏会多一行「unlocked」小字,属于正常现象,去不掉。解锁完成后手机自动重启并恢复出厂状态,此时 root 还没到手,只是 BL 开了。
做完你会看到:开机时屏幕顶部出现解锁标志,或者 adb shell getprop ro.boot.verifiedbootstate 返回 orange。
原理一句话:Magisk 不替换系统文件,它把原版 boot 分区镜像改一点点,让你刷回去。所以顺序必须是「取原厂 boot → Magisk 改 → 刷回去」。改过的那份叫 patched boot。
关键是版本必须和手机当前系统完全一致。手机上 设置 → 我的设备 → 全部参数与信息,记下「OS 版本」那串,本机是 OS2.0.20.0.UMOCNXM,代号 ruby。版本对不上,刷完会卡开机。
下载同版本官方固件(线刷包 tgz),解压后有两种情况:
ruby_images_OS2.0.20.0.UMOCNXM_2025xxxx.tgz
└─ ruby_images_.../
images/
boot.img ← 就是这个
recovery.img
...
# 装 payload_dumper(Python 工具),然后把 payload.bin 放同一目录 C:\> python payload_dumper.py payload.bin --out output Processing boot partition... Done. Extracted: boot.img
做完你会看到:手上有一个几十 MB 的 boot.img。先把它复制一份留底,命名为 boot_原版_备份.img,以后救砖、还原系统都靠它。
手机正常开机、连着电脑的情况下:
C:\> adb push boot.img /sdcard/Download/
boot.img: 1 file pushed, 0 skipped. 30.2 MB/s (100663296 bytes in 3.185s)
做完你会看到:手机的「文件管理 → 手机存储 → Download」里能看到 boot.img。
手机上装好 Magisk App(官方 GitHub 下 apk,直接点安装即可)。打开后主页最上面的 Magisk 卡片右边有个「安装」按钮,点它。

弹出的菜单里选「选择并修补一个文件」,然后到 Download 目录里选刚才推进来的 boot.img,点「开始」。
跑完最后一行会显示输出路径,长这样:
Output file: /sdcard/Download/magisk_patched-30700_ab12c.img
别选错:第二个选项「直接安装(推荐)」是把 Magisk 直接刷进当前 boot 分区,看着省事,但一旦失败手机就开不了机,而且你没有原版镜像能救。老老实实用「选择并修补一个文件」。
做完你会看到:Download 目录里多出一个 magisk_patched-30700_xxxxx.img。
C:\> adb pull /sdcard/Download/magisk_patched-30700_ab12c.img .
/sdcard/Download/magisk_patched-30700_ab12c.img: 1 file pulled, 0 skipped.
文件名按你手机上实际显示的那个填,中间的随机串每个人都不一样。
手机进 fastboot(关机后按住音量减 + 电源,或者命令行 adb reboot bootloader),然后依次执行:
C:\> fastboot devices lj6lbus8sorscazx fastboot C:\> fastboot flash boot_a magisk_patched-30700_ab12c.img Sending 'boot_a' (98304 KB) OKAY [ 2.271s] Writing 'boot_a' OKAY [ 0.152s] Finished. Total time: 2.436s C:\> fastboot reboot
注意刷的是 boot_a 不是 boot。这台机器是 A/B 分区,当前活动槽位是 a,刷错槽位等于没刷。
如果卡在开机动画超过 5 分钟,长按电源键强制关机,重新进 fastboot,刷回 boot_原版_备份.img,手机就能正常开机,然后回头检查是不是 boot.img 版本和系统不一致。
做完你会看到:手机正常开机进桌面。
Magisk 主页右上角齿轮进设置,往下翻到 Magisk 这个分组,四行要按下面这样设:
| 项目 | 设成 | 为什么 |
|---|---|---|
| Systemless hosts | 开 | AdAway 靠它写 hosts,装上 Systemless Hosts 模块后它会自动变成开 |
| Zygisk | 开 | Shamiko 和 PIF 都要靠它,关了这两个模块就废了 |
| 遵守排除列表 | 关 | 装了 Shamiko 就必须关,让 Shamiko 接管屏蔽逻辑 |
| 配置排除列表 | 点进去勾应用 | 把要瞒过 root 检测的 App 勾上 |

点「配置排除列表」,在列表里找到下面这些应用,每一个都点一下勾上(应用名右边出现勾选就对了):
做完你会看到:配置排除列表顶部出现一个数量(本机是 10 个)。之后这些 App 就能正常打开,不会再因为 root 闪退了。
这里最容易搞反:「遵守排除列表」到底是开还是关,取决于你装没装 Shamiko。装了 → 关;没装 → 开。两个都开着,Shamiko 不生效;两个都关着,什么都不会被隐藏。
Magisk 底部点「模块」,右上「从本地安装」,把这三个 zip 依次装上(装完一个会自动提示重启,全部装完再统一重启):

做完你会看到:模块列表里三个名字都在,每个下面写着版本号和作者。Zygisk 没开的话 Shamiko 会标红提示「未启用」。
两条路,任选一条。
手机直接装:浏览器打开 AdAway 官方站或 F-Droid,下载 6.x 的 apk,点开安装,允许「安装未知应用」。
电脑推着装:apk 放到电脑上,然后:
C:\> adb install -r AdAway-6.1.4.apk
Performing Streamed Install
Success
如果提示 INSTALL_FAILED_USER_RESTRICTED,是小米的安装拦截。去开发者选项里确认「USB 安装」是开的,或者改用手机直接装。
做完你会看到:桌面上出现 AdAway 图标(白鸽子)。
第一次打开 AdAway 会弹 root 授权,点「允许」(勾上「记住选择」,以后不再问)。

然后点主页左下角那三条横杠,底部会弹出菜单,只有两项,选「首选项」:
在「广告屏蔽」分组里,点「基于 root 的广告拦截器」,按提示允许 root。这一项决定 AdAway 用哪种方式拦广告:
做完你会看到:返回主页,最下面那个红色圆形按钮是两条竖线(暂停图标),说明屏蔽正在跑。它要是显示三角形播放图标,说明被暂停了,点一下恢复。
回主页,点右边那个向下箭头(「更新 hosts」)。第一次要跑一两分钟,屏幕别关,等它跑完。

数字到七万多、状态行显示「暂无更新」,就说明 hosts 真的写进系统了。点那张来源卡,能看到具体用了哪几个规则源:

这三个默认源都是国外的,覆盖的是国际广告联盟。国内的联盟得自己加,见下一步。
电脑端可以验证 hosts 是不是真的落到系统里了:
C:\> adb shell su -c "wc -l /data/adb/modules/hosts/system/etc/hosts" 143027 /data/adb/modules/hosts/system/etc/hosts # 随便查一个被拦的域名,返回 0.0.0.0 就对了 C:\> adb shell ping -c 1 doubleclick.net PING doubleclick.net (0.0.0.0) 56(84) bytes of data.
做完你会看到:行数是六位数(本机 14 万行左右)。如果只有几十行,说明模块没挂上,回第 13 步检查 Systemless Hosts。
国内 App 里的信息流原生广告,走的是穿山甲、优量汇、快手联盟、百度的广告 SDK。这些域名国外的规则源不会收录,得手动加。
入口:主页点左边那个大数字(就是「74497 阻止」),进入「用户列表」,再点右下角「添加 host」。
一条一条加下面这 13 个(只填域名,前面不要加 http://,也不要加 0.0.0.0):
gromore.pangolin-sdk-toutiao.com api-access.pangolin-sdk-toutiao.com gromore.pangolin-sdk-toutiao-b.com gdt.qq.com api.e.qq.com win.gdt.qq.com pgdt.gtimg.cn kuaishouzt.com open.kuaishouzt.com mobads.baidu.com cbjs.baidu.com tanx.com atanx.alicdn.com
加完回主页,再点一次「更新 hosts」,让新加的域名真正写进文件。
三种千万别加:kwaicdn.com(快手视频 CDN,加了快手就刷不出视频)、alimama.com(淘宝商家后台,加了千牛打不开)、还有各种 *.pangolin-sdk-toutiao.com 的其它子域——大部分本来就返回 NXDOMAIN,加了白占位置。
做完你会看到:用户列表里多出这 13 条,主页拦截数字会涨一点。
hosts 拦得住域名,但拦不住 App 直连 IP 的请求,所以再配一个会过滤广告的 DNS,两层一起上。
路径:设置 → 更多连接 → 专用DNS。
三种选项怎么选,一句话说清:
| 选项 | 什么时候用 |
|---|---|
| 已关闭 | 不用,等于放弃这一层 |
| 自动 | 推荐。能用加密 DNS 就用,被打断时自动回退普通 DNS,不会让整机断网 |
| 专用 DNS 提供商主机名 | 想强制走指定服务器时用,但一旦 VPN 抢占或服务器超时,整机 DNS 会全挂,上网全断 |
这是本机踩过的坑:之前把主机名填成 dot.pub 选了严格模式,结果一开 VPN(E路通),853 端口被抢,整机 DNS 直接失效,什么网都上不了。改成「自动」后就正常了。
做完你会看到:「自动」后面出现勾。用 ping 随便测个域名能通,就说明 DNS 没坏。
AdAway 主页那个向下箭头,每周点一次。规则源每天都在加新域名,不更新就会漏。
首选项里的「自动更新」可以打开,它会自己定时拉规则,但小米的后台管理经常把它的定时任务掐掉,所以还是手动点比较靠谱。
做完你会看到:主页状态变成「已成功更新 hosts 文件」,日期是最新的。
九成是把它的域名误拦了。判断和修法:
做完你会看到:App 恢复正常,同时其它广告照样被拦。
直接 OTA 升级 → root 会丢。升级会覆盖 boot 分区,Magisk 就没了。而且升级后系统版本变了,旧的 patched boot 不能再用。
正确顺序:
升级后 hosts 会失效,因为 Systemless Hosts 模块跟着 boot 一起没了。重新装一次模块再更新 hosts 就行。
| 要干什么 | 命令 |
|---|---|
| 看手机连上没 | adb devices |
| 看 fastboot 连上没 | fastboot devices |
| 进 fastboot | adb reboot bootloader |
| 推文件到手机 | adb push 文件名 /sdcard/Download/ |
| 从手机取文件 | adb pull /sdcard/Download/文件名 . |
| 刷 boot | fastboot flash boot_a magisk_patched.img |
| 验证 root | adb shell su -c id |
| 看 hosts 行数 | adb shell su -c "wc -l /data/adb/modules/hosts/system/etc/hosts" |
| 看排除列表内容 | adb shell su -c "magisk --denylist ls" |
| 往排除列表加 App | adb shell su -c "magisk --denylist add 包名" |
| 设备掉线重连 | adb kill-server 然后 adb devices |
| 现象 | 原因 | 怎么修 |
|---|---|---|
设备一直 unauthorized | 手机没点授权弹窗 | 拔线重插,手机下拉通知栏点「USB 调试已连接」,勾「一律允许」 |
devices 列表空的 | 线是纯充电线 / 口坏了 | 换线,换主板后面的 USB 口 |
| 刷完卡开机动画 | boot.img 和系统版本不匹配 | 进 fastboot 刷回原版备份 |
| Magisk 里 Zygisk 是「否」 | 没开 Zygisk 或没重启 | 设置里打开 Zygisk,重启手机 |
| Shamiko 显示未启用 | Zygisk 没开 | 开 Zygisk 重启,再进模块页看 |
| 赣政通/银行 App 闪退 | 没用排除列表藏 root | 配置排除列表里勾上这个 App,重启 |
| AdAway 数字不动 | root 模式没勾 / hosts 没写入 | 首选项勾 root 模式,重新更新 hosts |
| 开 VPN 后全网断 | 私人 DNS 设了严格主机名 | 改成「自动」 |
站内已有一篇 《GKD:写几条规则,让安卓自己跳过开屏广告》,讲的是界面层的办法:靠无障碍服务模拟点击,把开屏广告的「跳过」替你按掉,不需要 root。本篇走的是系统层:改 hosts 让广告域名解析到 0.0.0.0,从请求这一端掐断,能管到信息流里的原生广告,但代价是要解锁 BL、刷 Magisk,而且解锁会清空数据。两者不冲突,可以先看那篇判断要不要折腾 root。
本文档基于真机操作整理:Redmi Note 12 Pro(ruby / 22101316C),澎湃OS 2.0.20.0.UMOCNXM,Android 14,Magisk 30.7 (30700),AdAway 6.1.4。
手机端截图全部来自本机实拍;电脑端为便于复制,用命令行卡片呈现实际执行的命令与输出。