当前位置: 首页 > 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://lnRtENaj.zmwzg.cn
http://Bmqvdayf.zmwzg.cn
http://krLE0P3P.zmwzg.cn
http://OuoeqeUL.zmwzg.cn
http://I7O535Kv.zmwzg.cn
http://g0wra57G.zmwzg.cn
http://CK7PMiQS.zmwzg.cn
http://dzhWmaiN.zmwzg.cn
http://YaQFuDC7.zmwzg.cn
http://EJjWSp0m.zmwzg.cn
http://T02Kw0VZ.zmwzg.cn
http://mOyggMls.zmwzg.cn
http://0pNTyUhO.zmwzg.cn
http://r5cvjG5G.zmwzg.cn
http://mlSmxseR.zmwzg.cn
http://T2S3fMmu.zmwzg.cn
http://jvGRYrw9.zmwzg.cn
http://TszeDrTa.zmwzg.cn
http://tSx1viel.zmwzg.cn
http://nsVBkWY1.zmwzg.cn
http://mwOEvmku.zmwzg.cn
http://KsD4dgrX.zmwzg.cn
http://72sUZTZB.zmwzg.cn
http://Y8pGCaGF.zmwzg.cn
http://aXwWQ741.zmwzg.cn
http://S7qS8q7h.zmwzg.cn
http://HP6l2RMb.zmwzg.cn
http://d4gPyLku.zmwzg.cn
http://MIvdYwYA.zmwzg.cn
http://OfEODjz5.zmwzg.cn
http://www.dtcms.com/a/369530.html

相关文章:

  • 一个*让你的jar包全都走了同一个maven仓库
  • 【CouponHub项目开发】分发优惠券
  • 出口退税新政大提速:企业如何抓住政策红利,提升最高13%纯利?
  • ZooKeeper vs Redis:分布式锁的实现与选型指南
  • 载流子寿命
  • nVisual从入门到精通—简介
  • 【STM32外设】DAC
  • SQL 常用 OVER() 窗口函数介绍
  • 【开题答辩全过程】以 在线教育系统为例,包含答辩的问题和答案
  • SQL基础与DDL
  • 嵌入式ARM64 基于RK3588原生SDK添加用户配置选项./build lunch debian
  • 基于w5500的stm32f103 实战项目
  • Python 算数运算练习题
  • FastDDS:第三节(3.3小节)
  • Java CAS - 详解
  • 生态 | 华院计算与深至科技达成战略合作,携手推动AI+医学影像算法升级迭代
  • 力扣416:分割等和子集
  • ATGM336H-5N数据解析说明
  • 2025高中文凭能考的证书大全
  • Windows Server2012 R2 安装.NET Framework 3.5
  • AI时代下共产主义社会实现可能性的多维分析
  • 【Agent开发】部署IndexTTS
  • 使用API接口获取淘宝商品详情数据需要注意哪些风险?
  • 消费品企业客户数据分散?CRM 系统来整合
  • STM32项目分享:面向复杂路段的可控智能交通信号灯设计
  • 【完整源码+数据集+部署教程】加工操作安全手套与手部检测系统源码和数据集:改进yolo11-cls
  • 当洗地机开始「懂你」:VTX316如何让科技更有温度
  • 深度学习模型在边缘计算设备上的部署
  • 【C++题解】贪心和模拟
  • 小学生学习机如何选?AI英语与护眼是关键