`
yanx730
  • 浏览: 28787 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[转]Android Recovery模式

阅读更多

http://blogold.chinaunix.net/u/14459/showart_1911144.html

 

(muddogxp 原创,转载请注明)

Recovery简介

Android利用Recovery模式,进行恢复出厂设置,OTA升级,patch升级及firmware升级。

升级一般通过运行升级包中的META-INF/com/google/android/update-script脚本来执行自定义升级,脚本中是一组recovery系统能识别的UI控制,文件系统操作命令,例如write_raw_image(写FLASH分区),copy_dir(复制目录)。该包一般被下载至SDCARDCACHE分区下。如果对该包内容感兴趣,可以从http://forum.xda-developers.com/showthread.php?t=442480下载JF升级包来看看。

升级中还涉及到包的数字签名,签名方式和普通JAR文件签名差不错。公钥会被硬编译入recovery,编译时生成在:out/target/product/XX/obj/PACKAGING/ota_keys_inc_intermediates/keys.inc

G1中的三种启动模式

MAGIC KEY:

  • camera + powerbootloader模式,ADP里则可以使用fastboot模式

  • home + powerrecovery模式

  • 正常启动

Bootloader正常启动,又有三种方式,按照BCBBootloader Control Block, 下节介绍)中的command分类:

  • command == 'boot-recovery' → 启动recovery.imgrecovery模式

  • command == 'update-radio/hboot' → 更新firmwarebootloader)

  • 其他 → 启动boot.img

Recovery涉及到的其他系统及文件

  • CACHE分区文件

  •  
    • /cache/recovery/command: recovery命令,由主系统写入。所有命令如下:

      • --send_intent=anystring - write the text out to recovery.intent

      • --update_package=root:path - verify install an OTA package file

      • --wipe_data - erase user data (and cache), then reboot

      • --wipe_cache - wipe cache (but not user data), then reboot

    • /cache/recovery/logrecovery过程日志,由主系统读出

    • /cache/recovery/intentrecovery输出的intent

  • Recovery 工具通过NAND cache分区上的三个文件和主系统打交道。主系统(包括恢复出厂设置和OTA升级)可以写入recovery所需的命令,读出recovery过程中的LOGintent

  • MISC分区内容

    Bootloader Control Block (BCB) 存放recovery bootloader message。结构如下:

    struct bootloader_message {

      char command[32];

      char status[32]; // 未知用途

      char recovery[1024];

    };

    • command可以有以下两个值

      boot-recovery”:标示recovery正在进行,或指示bootloader应该进入recovery mode

      update-hboot/radio”:指示bootloader更新firmware

    • recovery内容

      recovery\n

      <recovery command>\n

      <recovery command>

      其中recovery commandCACHE:/recovery/command命令


两种Recovery Case

  • FACTORY RESET(恢复出厂设置)

  1. 用户选择“恢复出厂设置”

  2. 设置系统将"--wipe_data"命令写入/cache/recovery/command

  3. 系统重启,并进入recover模式(/sbin/recovery

  4. get_args() 将 "boot-recovery""--wipe_data"写入BCB

  5. erase_root() 格式化(擦除)DATA分区

  6. erase_root() 格式化(擦除)CACHE分区

  7. finish_recovery() 擦除BCB

  8. 重启系统

 

  • OTA INSTALLOTA升级)

  1. 升级系统下载 OTA包到/cache/some-filename.zip

  2. 升级系统写入recovery命令"--update_package=CACHE:some-filename.zip"

  3. 重启,并进入recovery模式

  4. get_args() "boot-recovery" 和 "--update_package=..." 写入BCB

  5. install_package() 作升级

  6. finish_recovery() 擦除 BCB

  7. ** 如果安装包失败 ** prompt_and_wait() 等待用户操作,选择ALT+SALT+W 升级或恢复出厂设置

  8. main() 调用 maybe_install_firmware_update()

    1. 如果包里有hboot/radiofirmware则继续,否则返回

    2. 将 "boot-recovery" 和 "--wipe_cache" 写入BCB

    3. 将 firmware image写入cache分区

    4. 将 "update-radio/hboot" 和 "--wipe_cache" 写入BCB

    5. 重启系统

    6. bootloader自身更新firmware

    7. bootloader 将 "boot-recovery" 写入BCB

    8. erase_root() 擦除CACHE分区

    9. 清除 BCB

  9. main() 调用 reboot() 重启系统


Recovery模式流程


/init  init.rc  /sbin/recovery 

main():recovery.c


  • ui_init():ui.c UI initialize

    • gr_init():minui/graphics.c set tty0 to graphic mode, open fb0]

    • ev_init():minui/events.c [open /dev/input/event*]

    • res_create_surface:minui/resource.c [create surfaces for all bitmaps used later, include icons, bmps]

    • create 2 threads: progress/input_thread [create progress show and input event handler thread]

  • get_args():recovery.c

    • get_bootloader_message():bootloader.c [read mtdblock0(misc partition) 2nd page for commandline]

    • check if nand misc partition has boot message. If yes, fill argc/argv.

    • If no, get arguments from /cache/recovery/command, and fill argc/argv.

    • set_bootloader_message():bootloader.c [set bootloader message back to mtdblock0]

  • Parser argv[] filled above

  • register_update_commands():commands.c [ register all commands with name and hook function ]

    • registerCommand():commands.c

      • Register command with name, hook, type, cookie.

      • Commands, e.g: assert, delete, copy_dir, symlink, write_raw_image.

    • registerFunction():commands.c

      • Register function with name, hook, cookie.

      • Function, e.g: get_mark, matches, getprop, file_contains

  • install_package():

    • translate_root_path():roots.c [ "SYSTEM:lib" and turns it into a string like "/system/lib", translate the updater.zip path ]

    • mzOpenZipArchive():zip.c [ open updater.zip file (uncompass) ]

    • handle_update_package():install.c

      • verify_jar_signature():verifier.c [ verify signature with keys.inc key; verify manifest and zip package archive ]

        • verifySignature() [ verify the signature file: CERT.sf/rsa. ]

          • digestEntry():verifier.c [ get SHA-1 digest of CERT.sf file ]

          • RSA_verify(public key:keys.inc, signature:CERT.rsa, CERT.sf's digest):libc/rsa.c [ Verify a 2048 bit RSA PKCS1.5 signature against an expected SHA-1 hash. Use public key to decrypt the CERT.rsa to get original SHA digest, then compare to digest of CERT.sf ]

        • verifyManifest() [ Get manifest SHA1-Digest from CERT.sf. Then do digest to MANIFEST.MF. Compare them ]

        • verifyArchive() [ verify all the files in update.zip with digest listed in MANIFEST.MF ]

      • find_update_script():install.c [ find META-INF/com/google/android/update-script updater script ]

      • handle_update_script():install.c [ read cmds from script file, and do parser, exec ]

        • parseAmendScript():amend.c [ call yyparse() to parse to command ]

        • exeCommandList():install.c

          • exeCommand():execute.c [ call command hook function ]

  • erase DATA/CACHE partition

  • prompt_and_wait():recovery.c [ wait for user input: 1) reboot 2) update.zip 3) wipe data ]

    • ui_key_xxx get ALT+x keys

    • 1) do nothing

    • 2) install_package('SDCARD:update.zip')

    • 3) erase_root()  format_root_device() DATA/CACHE

  • may_install_firmware_update():firmware.c [ remember_firmware_update() is called by write_hboot/radio_image command, it stores the bootloader image to CACHE partition, and write update-hboot/radio command to MISC partition for bootloader message to let bootloader update itself after reboot ]

    • set_bootloader_message()

    • write_update_for_bootloader():bootloader.c [ write firmware image into CACHE partition with update_header, busyimage and failimage ]

  • finish_recovery():recovery.c [ clear the recovery command and prepare to boot a (hopefully working) system, copy our log file to cache as well (for the system to read), and record any intent we were asked to communicate back to the system. ]

  • reboot()


Recovery模式流程图

以下流程图绘制了系统从启动加载bootloader后的行为流程。

没有床,见blog吧~

 

实际使用的例子:

adb shell "echo \"send_intent=xxx\" > /cache/recovery/command"

adb shell "echo \"--update_package=SDCARD:update.zip\" >> /cache/recovery/command"

adb shell sync

adb reboot recovery

 

分享到:
评论

相关推荐

    android recovery模式下可用的较大的字体

    android recovery模式下可用的较大的字体,直接将此头文件放到bootable\recovery\minui目录下,修改graphics.cpp中对原字体头文件的引用为本文件即可。

    Android系统Recovery模式的工作原理

    Android系统Recovery模式是Android设备的一种特殊运行状态,它允许用户执行系统恢复、备份、刷机等高级操作,而不影响正常的系统运行。Recovery模式在Android设备的维护和升级过程中起着至关重要的作用。 首先,...

    Android下按键进入recovery模式

    在Android系统中,Recovery模式是一种特殊的系统状态,允许用户执行一些高级操作,如系统更新、备份、恢复出厂设置等,而无需启动完整的操作系统。本文将深入探讨如何通过按键操作让Android设备进入Recovery模式,...

    android recovery原理讲解

    Android Recovery模式是Android操作系统的一个重要组成部分,主要用于设备的维护、升级以及恢复。此模式允许用户执行一系列高级任务,比如恢复出厂设置、执行OTA(Over-the-Air)升级、Patch升级以及固件升级等。 #...

    Android Recovery介绍

    Android Recovery 模式详解 Android Recovery 模式是 Android 系统中的一种特殊模式,用于进行恢复出厂设置、OTA 升级、patch 升级及 firmware 升级。下面是对 Android Recovery 模式的详细介绍。 Recovery 模式...

    Recovery模式详解

    Recovery 模式是 Android 系统中的一种特殊模式,它允许用户对设备进行恢复出厂设置、OTA 升级、patch 升级和 firmware 升级等操作。Recovery 模式是通过 recovery 系统来实现的,recovery 系统是一个独立的系统,它...

    Android手机Recovery模式取证方法研究.pdf

    Android手机Recovery模式取证方法研究 Android手机Recovery模式取证方法研究是指通过使用Android手机的Recovery模式来对手机进行取证,并将其应用于电子数据取证工作中。该方法可以解决当前电子数据取证工作中...

    android recovery升级教程

    打开终端模拟器,输入`su`获取root权限,然后输入与方法一相同的Recovery刷写命令,最后同样使用`reboot recovery`命令重启进入Recovery模式。 **方法三:使用hboot模式(推荐)** 这种方法通常更直接且易于操作。...

    Android11 修复user版本,按电源键+音量减键进入recovery模式会进入no command 界面问题.patch

    Android11 修复user版本,按电源键+音量减键进入recovery模式会进入no command 界面问题.patch

    Android recovery资料大全---网上找了很久

    在Recovery模式下刷固件,通常是通过将新的固件映像文件(如ZIP格式)安装到设备上完成的。这个过程涉及以下几个步骤: 1. **解锁Bootloader**:Bootloader是设备启动时首先运行的程序,它负责加载操作系统。为了...

    Android Recovery模式下选择关机,实际是重启,修改为关机

    Android Recovery模式下选择关机,实际是重启,修改为关机

    android_recovery_介绍,just mark

    4. **手动操作**:用户可以通过进入Recovery模式手动执行一些高级操作,如清除缓存分区、检查磁盘错误等,这些操作有助于解决系统性能下降或者卡顿的问题。 Android Recovery的实现基于Linux内核,它的运行通常依赖...

    【转】Android OTA 升级之三:生成recovery.img.doc

    当Android设备进入recovery模式时,这个镜像会被加载,从而允许用户进行系统备份、恢复或升级等操作。具体来说,`recovery.img`主要包括以下部分: - **标准内核**:与`boot.img`中的内核相同,负责启动过程的核心...

    android-recovery移植汉化

    Android Recovery 是 Android 设备上的一个特殊模式,用户可以在该模式下执行系统级别的操作,如备份、恢复、更新系统等。对于开发者而言,Recovery 的移植与汉化是一项重要的技能,能够帮助用户更好地理解和操作...

    刷机原理04 Android系统Recovery模式的工作原理.wps

    Android系统Recovery模式的工作原理 在使用update.zip包升级时怎样从主系统(main system)重启进入Recovery模式,进入Recovery模式后怎样判断做何种操作,以及怎样获得主系统发送给Recovery服务的命令,这一系列...

    Android recovery v162 resource

    2. **文件系统管理**:Recovery模式涉及与Android设备的文件系统的交互,包括挂载和卸载分区。分析源代码可以揭示如何安全地操作这些分区,这对于系统升级和故障排除是很有用的。 3. **Bootloader交互**:Recovery...

    安卓_Recovery_恢复模式

    在安卓系统中,Recovery模式是一个非常重要的工具,它允许用户执行系统级别的操作,如备份、恢复、安装更新以及修复手机。这篇详细的文章将深入探讨Recovery模式的概念、功能、如何进入以及如何利用它来优化你的安卓...

    Android系统Recovery工作原理之使用update.zip升级过程分析

    `Android系统Recovery模式的工作原理`涉及几个关键点。Recovery会检查`update.zip`的完整性,然后执行`install_package`函数,这是Recovery服务的核心。这个函数负责解压更新包,验证签名,然后将新系统映像写入到...

    android recovery运行流程(基于MTK 8217平台)

    Recovery模式允许用户对设备进行重置、更新固件或安装刷机包等操作,它是Android系统不可或缺的部分。 首先,在MTK 8217平台上,Recovery的运行流程从board.c开始,进而调用start_armboot(),进入check_recovery_...

Global site tag (gtag.js) - Google Analytics