Android 救砖指南:set_policy_failed:/data/adb 开机循环修复

本文章由 AI 生成

本文章由 AI 生成

故障现象

不小心把 /data/adb 删了之后,通常会按这个顺序出问题:

  1. 进 recovery 提示无法加载 Android 系统,或问要不要擦除数据,recovery 日志里会出现:
text
recovery: Boot command: boot-recovery
recovery: --prompt_and_wipe_data
recovery: --reason=set_policy_failed:/data/adb
  1. 不同意擦机就会反复重启,后来直接变成无限重启进 fastboot,连 recovery 都进不去了
  2. 刷 TWRP 到 recovery 分区后,fastboot reboot recovery 还是会掉回 fastboot
  3. 用 fastboot boot twrp.img 临时引导会报 Failed to load/authenticate boot image: Load Error

故障原理

init 的加密策略检查

Android FBE 下,init 会在 post-fs-data 阶段校验 /data/adb 的 fscrypt 加密策略。如果 ROM 用的是 encryption=Require,策略设置不对就会直接要求擦机。

关键点:init 只校验策略,不会重新给目录授权。目录状态不一样,结果也就不一样:

目录状态检查结果
存在且带正确加密策略正常开机
存在但无加密策略(被管理器重建过)失败,要求擦机
不存在失败,要求擦机(init 不会自动重建)
存在且为空,权限属主正确成功设置策略,正常开机

为何删了又会复现

删掉 /data/adb 后,KernelSU、Magisk 这类 root 管理器会立刻用普通 mkdir 把目录重建出来,但不带加密策略。下次开机 init 检测到目录存在但没策略,校验就会失败。

为何会变成 fastboot 死循环

A/B 分区设备每次启动失败都会扣减 slot-retry-count。两个 slot 的重试次数都耗尽且都被标记 unbootable 时,bootloader 就会直接进 fastboot 等待救援,连 recovery 都不再试了。

修复方法

1. 确认 fastboot 状态

powershell
fastboot devices
fastboot getvar all

重点看这些:

text
slot-unbootable:a: yes
slot-unbootable:b: yes
slot-retry-count:a: 0
unlocked: yes
current-slot: a

2. 重置 slot 并清除 BCB

powershell
fastboot set_active a
fastboot getvar slot-unbootable:a  # 应显示 no

做个全零 misc 镜像刷进去,把残留的启动命令清掉:

powershell
fsutil file createnew misc_zero.img 1048576
fastboot flash misc misc_zero.img

3. 刷入 TWRP

部分机型不支持 fastboot boot,得刷进 recovery 分区:

powershell
fastboot flash recovery_a TWRP.img
fastboot flash recovery_b TWRP.img
fastboot reboot recovery

4. 在 TWRP 里重建空的 /data/adb

进 TWRP 后用 adb shell 操作:

bash
adb shell

# 建议先备份(如有需要)
adb pull /data/adb ./adb_backup

# 删掉有问题的目录并重建空目录
rm -rf /data/adb
mkdir /data/adb
chmod 0700 /data/adb
chown 0:0 /data/adb
chcon u:object_r:adb_data_file:s0 /data/adb

ls -laZd /data/adb

目录必须为空。init 只能在空目录上设置加密策略,非空目录会设置失败。开机后 root 管理器会自动把需要的文件重建回来。

5. 提交 f2fs 检查点并重启

TWRP 挂载 /data 时通常带 checkpoint=disable,直接重启的话改动会回滚:

bash
sync
mount -o remount,checkpoint=enable /data
sync
dd if=/dev/zero of=/dev/block/by-name/misc bs=2048 count=1
sync
adb reboot

验证

重启后应该能正常进系统。KernelSU 会自动重建 ksu/、ksud 这些文件夹,功能一切正常。

要是还没修好,可以看看 /sys/fs/pstore/ 里的上次内核日志,搜 set_policy_failed 找出是哪个目录出了问题,按同样的方法处理就行。

注意事项

  • 别直接删 /data/adb。要卸载 root 建议走管理器自带的卸载功能
  • 修改 /data 后务必提交 checkpoint。这是最容易踩的坑,直接 adb reboot 很可能导致回滚
  • fastboot 死循环不用线刷。先用 set_active 重置 slot 通常就能脱离
  • 建议备份 recovery。刷 TWRP 后原厂 recovery 会被覆盖,要还原得刷回对应版本
  • 常备工具。TWRP + platform-tools 是关键时刻最省事的救砖方案

参考

新故事即将发生
更新随机图API

评论区

评论加载中...