当前位置: 首页 > news >正文

高通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.rcsystem/core/rootdir/init.rcbootable/recovery/etc/init.rc
默认进程system_serverrecovery
文件系统访问读写只读(除特定操作外)

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 高通特定调试技巧

  1. 串口日志:通过USB转TTL串口线获取完整启动日志

  2. EDL模式:使用QFIL工具救砖和烧写镜像

  3. Bootloader日志:通过fastboot命令获取ABL阶段日志

3.3 测试验证流程

  1. 编译修改后的Recovery镜像

  2. 刷入设备并重启到Recovery模式

  3. 验证是否自动执行恢复出厂设置

  4. 检查日志确认执行流程

  5. 验证数据是否正确清除

4. 注意事项与最佳实践

  1. 安全考虑

    • 确保只有授权方式可以触发自动清除

    • 添加适当的日志记录和安全验证

  2. 错误处理

    • 添加异常处理机制,防止清除过程中断

    • 确保在清除失败时有适当的恢复策略

  3. 性能优化

    • 考虑大容量存储设备的清除效率

    • 优化日志输出,避免影响清除过程

  4. 兼容性

    • 确保修改与现有OTA更新机制兼容

    • 验证与加密数据分区的兼容性

5. 总结

本文详细分析了高通AR1平台的Recovery架构,并提供了两种实现自动恢复出厂设置的方案。直接修改Recovery程序的方式简单直接,适合产品需求明确的场景;而通过BCB传递参数的方式更加灵活,适合需要区分不同启动场景的需求。

无论采用哪种方案,都需要充分测试验证,确保功能的稳定性和可靠性。同时,建议添加详细的日志记录,便于后续排查问题。在高通平台上,充分利用串口日志和EDL模式等调试手段,可以大大提高开发效率。

转载请注明出处高通AR1平台Recovery架构分析与自动恢复出厂设置实现-CSDN博客,谢谢!

http://www.xdnf.cn/news/1464769.html

相关文章:

  • 从 elecworks 到云端协同:SOLIDWORKS Electrical 发展历史 + 核心功能 + 采购指南
  • Linux 磁盘扩容及分区相关操作实践
  • 从Java全栈到云原生:一场技术深度对话
  • Golang语言设计理念
  • 【GEOS-Chem伴随模型第一期】GEOS-Chem Adjoint 模型详解
  • 常见Bash脚本漏洞分析与防御
  • 【Flutter】RefreshIndicator 无法下拉刷新问题
  • 【存储选型终极指南】RustFS vs MinIO:5大维度深度对决,95%技术团队的选择秘密!
  • LeetCode 131 分割回文串
  • 【LeetCode热题100道笔记】删除链表的倒数第 N 个结点
  • Kafka核心原理与常见面试问题解析
  • 《AI 问答系统:从开发到落地,关键技术与实践案例全解析》
  • 【技术教程】如何将文档编辑器集成至基于Java的Web应用程序
  • c++工程如何提供http服务接口
  • 基于 GEE 批量下载 Landsat8 地表温度(LST)数据
  • 【计算机科学与应用】砚文化虚拟博物馆的Unity3D设计
  • 理解损失函数:机器学习的指南针与裁判
  • 踩坑实录:Django继承AbstractUser时遇到的related_name冲突及解决方案
  • 【Flask】测试平台中,记一次在vue2中集成编辑器组件tinymce
  • XR数字融合工作站打造智能制造专业学习新范式
  • windows通过xrdp远程连接Ubuntu黑屏问题解决
  • FDTD_3 d mie_仿真
  • 计算机毕设选题:基于Python数据挖掘的高考志愿推荐系统
  • AI+消费,阿里的新故事很性感
  • 新后端漏洞(上)- Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)
  • sub3G、sub6G和LB、MB、HB、MHB、LMHB、UHB之间的区别和联系
  • STM32——WDG看门狗
  • Typer 命令行工具使用示例
  • SQL Server全链路安全防护
  • 【Python】QT(PySide2、PyQt5):点击不同按钮显示不同页面