10、Fastboot高级技巧:刷写Bootloader分区、修改内核启动参数、使用fastboot boot测试内核
好,咱们进入Fastboot的高级部分。前面几章讲的是刷系统、刷镜像,说白了都是常规操作。这一章我要带你玩点真正有技术含量的——直接操作Bootloader分区、改内核启动参数、还有我最喜欢的fastboot boot命令。
这三个技能,是Android底层开发者的看家本领。我自己刚入行时,就因为不懂这些,踩过不少坑。嗯,咱们一个一个来。
核心要点:本章三个技能,分别对应三个不同场景——刷Bootloader分区是“修砖”必备,改内核参数是调试利器,fastboot boot则是“试水”神器。
10.1 刷写Bootloader分区——别手抖,这是硬核操作
Bootloader分区,说白了就是手机开机时第一个跑起来的程序。它负责初始化硬件、加载内核。如果你把这个分区刷坏了,手机就变砖了——不是那种能救的软砖,是真砖。
我个人习惯,刷Bootloader之前,一定会先备份。你想想看,万一新版本有问题,至少还能刷回去。
备份Bootloader
# 备份当前Bootloader到电脑
fastboot getvar all # 先查看分区信息
fastboot flash:raw bootloader bootloader.img # 这是刷写,不是备份
# 正确的备份方式(需要root或已解锁BL)
adb shell
su
dd if=/dev/block/bootdevice/by-name/aboot of=/sdcard/aboot_backup.img
exit
adb pull /sdcard/aboot_backup.img .
提示:不同厂商的Bootloader分区名不一样。高通平台叫aboot,MTK平台叫lk,华为叫fastboot。刷之前一定先确认。
刷写Bootloader
# 进入Fastboot模式
adb reboot bootloader
# 刷写Bootloader(以高通为例)
fastboot flash aboot new_bootloader.img
# 刷完后重启
fastboot reboot
警告:刷Bootloader前必须确认以下三点:
- Bootloader已解锁(
fastboot oem unlock) - 镜像文件与设备型号完全匹配
- 电量在50%以上,刷写过程中不要断电
我曾经有一次刷错了版本,结果设备卡在开机logo,最后只能拆机用SP Flash Tool救砖。嗯,那次之后我再也不敢马虎了。
10.2 修改内核启动参数——给内核传个纸条
内核启动参数,就是Linux内核启动时接收的一串配置信息。你可以通过它告诉内核:用多少内存、开启哪些调试功能、指定console输出等。
在Android上,这些参数通常写在Boot镜像的头部,或者由Bootloader动态生成。修改它们,最常见的方式是重新打包Boot镜像。
查看当前内核参数
# 在设备上查看当前内核cmdline
adb shell
cat /proc/cmdline
# 输出示例
# console=ttyMSM0,115200n8 androidboot.hardware=qcom androidboot.console=ttyMSM0 ...
修改内核参数并重新打包
# 1. 解包Boot镜像
abootimg -x boot.img
# 2. 修改bootimg.cfg中的cmdline
# 比如添加:androidboot.selinux=permissive 开启SELinux宽容模式
# 3. 重新打包
abootimg --create new_boot.img -f bootimg.cfg -k zImage -r initrd.img
# 4. 刷入
fastboot flash boot new_boot.img
常用调试参数:
| 参数 | 作用 | 使用场景 |
|---|---|---|
androidboot.selinux=permissive |
关闭SELinux强制模式 | 调试权限问题 |
console=ttyMSM0,115200 |
开启串口日志输出 | 内核调试 |
androidboot.debuggable=1 |
开启adb root权限 | 开发调试 |
androidboot.verifiedbootstate=orange |
绕过启动验证 | 刷第三方系统 |
个人经验:我调试内核时,最常用的就是androidboot.selinux=permissive。很多第三方ROM的权限问题,都是SELinux策略没写对。先开permissive模式跑一遍,确认功能正常,再慢慢收紧策略。省时省力。
10.3 fastboot boot——不刷写,先试水
这个命令是我最爱的,没有之一。fastboot boot可以直接从电脑加载一个内核镜像到内存中启动,而不写入任何分区。说白了就是“试穿衣服,不买”。
你想想看,如果你每次调试内核都要刷写分区,万一刷坏了还得救砖。用fastboot boot,重启一下就恢复原样,多安全。
基本用法
# 从电脑启动一个自定义内核
fastboot boot my_test_kernel.img
# 设备会临时使用这个内核启动
# 重启后恢复为原来的内核
实际调试场景
我在项目中经常这样用:
- 编译一个新内核,生成
Image.gz-dtb - 用
mkbootimg打包成boot.img - 执行
fastboot boot boot.img测试 - 如果内核崩溃,设备会自动重启回原来的系统
- 如果正常,再决定是否刷入
# 完整示例:编译并测试内核
# 假设你已经编译好了内核
mkbootimg --kernel arch/arm64/boot/Image.gz-dtb \
--ramdisk ramdisk.img \
--cmdline "console=ttyMSM0,115200n8 androidboot.selinux=permissive" \
--base 0x80000000 \
--pagesize 4096 \
-o test_boot.img
# 临时启动测试
fastboot boot test_boot.img
关键区别:
| 命令 | 作用 | 是否写入分区 | 重启后是否保留 |
|---|---|---|---|
fastboot flash boot |
刷写Boot分区 | 是 | 是 |
fastboot boot |
临时启动内核 | 否 | 否 |
注意事项:
fastboot boot要求Bootloader已解锁- 某些厂商(如华为、小米部分机型)会限制此功能
- 内核必须与当前设备硬件兼容,否则可能无法启动
- 如果内核panic,设备会自动重启,不会变砖
10.4 组合技:实战调试流程
最后,我分享一个实际项目中常用的调试流程。把三个技巧串起来用:
# 1. 备份当前Bootloader
adb shell "dd if=/dev/block/bootdevice/by-name/aboot of=/sdcard/aboot_stock.img"
adb pull /sdcard/aboot_stock.img .
# 2. 修改内核参数,开启调试
mkbootimg --kernel my_kernel \
--ramdisk my_ramdisk \
--cmdline "console=ttyMSM0,115200 androidboot.selinux=permissive" \
-o debug_boot.img
# 3. 临时启动测试(不刷写)
fastboot boot debug_boot.img
# 4. 如果测试通过,再刷入Bootloader
fastboot flash aboot new_aboot.img
# 5. 最后刷入正式内核
fastboot flash boot debug_boot.img
这个流程我用了好几年,从来没翻过车。先试水,再刷写,稳得很。
避坑指南:我曾经有一次直接刷了Bootloader,结果新版本有bug,设备无法进入Fastboot模式。后来只能拆机用短接点进入EDL模式救砖。从那以后,我坚持先用fastboot boot测试内核,确认没问题再刷Bootloader。你记住,Bootloader是最后一道防线,别轻易动它。
好了,这一章的内容就到这里。三个技巧——刷Bootloader、改内核参数、fastboot boot测试——都是Android底层开发的硬核技能。多练练,你也能成为救砖高手。