高通AR1平台Recovery架构分析与自动恢复出厂设置实现
1. 高通AR1平台Recovery架构深度解析
1.1 启动链条与Recovery入口
在高通AR1平台上,Recovery的启动遵循UEFI架构,其完整启动流程如下:
cpp
// 启动流程伪代码 PBL (Primary Boot Loader) → XBL (eXtensible Boot Loader) → ABL (Applications Boot Loader) → Linux Kernel → init进程 → recovery服务 → /sbin/recovery二进制文件
关键节点说明:
-
ABL阶段:读取BCB (Boot Control Block) 决定启动模式
-
recovery服务:在
init.rc
中定义,启动Recovery主程序 -
/sbin/recovery:由
bootable/recovery/recovery.cpp
编译生成
1.2 Recovery镜像组成
Recovery分区是一个完整的RAMDisk镜像,包含:
-
内核:
Image.gz
-
根文件系统:包含
/sbin/recovery
、/sbin/adbd
、/system/bin/updater
等关键组件
1.3 与正常启动的差异
特性 | 正常启动 | Recovery模式 |
---|---|---|
根文件系统 | 挂载实际分区 | RAMDisk |
init.rc | system/core/rootdir/init.rc | bootable/recovery/etc/init.rc |
默认进程 | system_server | recovery |
文件系统访问 | 读写 | 只读(除特定操作外) |
2. 自动恢复出厂设置的实现方案
2.1 方案选择与架构考量
基于高通AR1平台特性,我们有两种实现方案:
方案一:直接修改Recovery程序(当前采用方案)
优点:实现简单直接,适合产品需求明确的情况
缺点:所有进入Recovery的场景都会触发清除,缺乏灵活性
方案二:通过BCB传递参数(推荐方案)
优点:通过启动参数区分场景,更加灵活
缺点:需要修改硬件按钮驱动和BCB处理逻辑
2.2 代码实现与详细修改
修改点一:跳过用户选择菜单
cpp
// 文件: bootable/recovery/recovery.cpp // 函数: PromptAndWait// 原代码: // size_t chosen_item = ui->ShowMenu( // headers, device->GetMenuItems(), 0, false, // std::bind(&Device::HandleMenuKey, device, std::placeholders::_1, std::placeholders::_2)); // if (chosen_item == static_cast<size_t>(RecoveryUI::KeyError::INTERRUPTED)) { // return Device::KEY_INTERRUPTED; // } // Device::BuiltinAction chosen_action = // (chosen_item == static_cast<size_t>(RecoveryUI::KeyError::TIMED_OUT)) // ? Device::REBOOT // : device->InvokeMenuItem(chosen_item);// 修改后: LOG(INFO) << "Auto-wipe data triggered by hardware button"; Device::BuiltinAction chosen_action = Device::WIPE_DATA;
修改点二:跳过确认提示
cpp
// 文件: bootable/recovery/recovery.cpp // 函数: PromptAndWait - case Device::WIPE_DATA// 原代码: // if (ui->IsTextVisible()) { // if (ask_to_wipe_data(device)) { // WipeData(device, false); // } // } else { // WipeData(device, false); // return Device::NO_ACTION; // }// 修改后: save_current_log = true; WipeData(device, false); return Device::NO_ACTION;
2.3 方案二实现参考(通过BCB传递参数)
如需实现更灵活的方案,可以考虑通过BCB传递参数:
cpp
// 硬件按钮驱动中写入BCB struct bootloader_message bcb; memset(&bcb, 0, sizeof(bcb)); strlcpy(bcb.command, "boot-recovery", sizeof(bcb.command)); strlcpy(bcb.recovery, "--wipe_data\n", sizeof(bcb.recovery)); write_bcb(&bcb);// 在start_recovery函数中解析参数 if (has_arg(args, "wipe_data")) {LOG(INFO) << "Auto-wipe data requested via BCB";WipeData(device, false);return Device::NO_ACTION; }
3. 调试与验证方法
3.1 日志获取与分析
bash
# 通过ADB获取Recovery日志 adb root adb shell tail -f /tmp/recovery.log# 编译和刷写Recovery镜像 source build/envsetup.sh lunch your_product-userdebug make recoveryimage fastboot flash recovery out/target/product/your_product/recovery.img
3.2 高通特定调试技巧
-
串口日志:通过USB转TTL串口线获取完整启动日志
-
EDL模式:使用QFIL工具救砖和烧写镜像
-
Bootloader日志:通过fastboot命令获取ABL阶段日志
3.3 测试验证流程
-
编译修改后的Recovery镜像
-
刷入设备并重启到Recovery模式
-
验证是否自动执行恢复出厂设置
-
检查日志确认执行流程
-
验证数据是否正确清除
4. 注意事项与最佳实践
-
安全考虑:
-
确保只有授权方式可以触发自动清除
-
添加适当的日志记录和安全验证
-
-
错误处理:
-
添加异常处理机制,防止清除过程中断
-
确保在清除失败时有适当的恢复策略
-
-
性能优化:
-
考虑大容量存储设备的清除效率
-
优化日志输出,避免影响清除过程
-
-
兼容性:
-
确保修改与现有OTA更新机制兼容
-
验证与加密数据分区的兼容性
-
5. 总结
本文详细分析了高通AR1平台的Recovery架构,并提供了两种实现自动恢复出厂设置的方案。直接修改Recovery程序的方式简单直接,适合产品需求明确的场景;而通过BCB传递参数的方式更加灵活,适合需要区分不同启动场景的需求。
无论采用哪种方案,都需要充分测试验证,确保功能的稳定性和可靠性。同时,建议添加详细的日志记录,便于后续排查问题。在高通平台上,充分利用串口日志和EDL模式等调试手段,可以大大提高开发效率。
转载请注明出处高通AR1平台Recovery架构分析与自动恢复出厂设置实现-CSDN博客,谢谢!