类型:源码相关大小:23.6M语言:中文 评分:9.1

标签:

立即下载

Recovery简介

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

升级一般通过运行升级包中的META-INF/com/google/android/update-script脚本来执行自定义升级,脚本中是一组recovery系统能识别的UI控制,文件系统操作命令,例如write_raw_image(写FLASH分区),copy_dir(复制目录)。该包一般被下载至SDCARD和CACHE分区下。如果对该包内容感兴趣,可以从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 +

power:bootloader模式,ADP里则可以使用fastboot模式

home + power:recovery模式

正常启动

Bootloader正常启动,又有三种方式,按照BCB(Bootloader

Control Block, 下节介绍)中的command分类:

command == 'boot-recovery'

→ 启动recovery.img。recovery模式

command ==

'update-radio/hboot' → 更新firmware(bootloader)

其他 → 启动boot.img

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

CACHE分区文件

Recovery

工具通过NAND

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

/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/log:recovery过程日志,由主系统读出

/cache/recovery/intent:recovery输出的intent

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

\n

其中recovery

command为CACHE:/recovery/command命令

两种Recovery

Case

FACTORY

RESET(恢复出厂设置)

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

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

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

get_args()

"boot-recovery"和"--wipe_data"写入BCB

erase_root()

格式化(擦除)DATA分区

erase_root()

格式化(擦除)CACHE分区

finish_recovery()

擦除BCB

重启系统

OTA

INSTALL(OTA升级)

升级系统下载

OTA包到/cache/some-filename.zip

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

重启,并进入recovery模式

get_args()

将"boot-recovery"

"--update_package=..."

写入BCB

install_package()

作升级

finish_recovery()

擦除 BCB

**

如果安装包失败 **

prompt_and_wait() 等待用户操作,选择ALT+S或ALT+W

升级或恢复出厂设置

main()

调用

maybe_install_firmware_update()

如果包里有hboot/radio的firmware则继续,否则返回

"boot-recovery"

和 "--wipe_cache"

写入BCB

firmware image写入cache分区

"update-radio/hboot"

和 "--wipe_cache"

写入BCB

重启系统

bootloader自身更新firmware

bootloader

将 "boot-recovery"

写入BCB

erase_root()

擦除CACHE分区

清除

BCB

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后的行为流程。

WIPE 清除手机的信息 就是格式化 然后你在刷你喜欢的ROM。

5、Wipe——清除

5-1、Wipe data/factory reset——清除内存数据和缓存数据

5-2、Wipe Dalvik-cache——清除缓存数据 + ext 分区内数据

5-3、Wipe SD:ext partition——只清除ext 分区内数据

5-4、Wipe battery stats——清除电池数据

5-5、Wipe rotate settings——清除传感器内设置的数据

分区

6、Partition sdcard——分区sd 卡

6-1、Partition SD——自动为sd 卡分区

6-2、Repair SD:ext——修复ext 分区

6-3、SD:ext2 to ext3——将ext2 分区转换为ext3 分区(推荐)

6-4、SD:ext3 to ext4——将ext3 分区转换为ext4 分区(C4 卡不推荐,C6 卡推荐)

想多了解 请看下面:

1、Reboot system now——重启

2、USB-MS toggle——在recovery 模式下直接连接USB,读取你的sd卡,这个非常方便。刷不成的话你还可以往sd卡拷贝别的ROM 进行补救,按小房子退出该模式。非常棒的功能,最近才发现的。2010.05.27.

3、Backup/Restore——备份和还原

3-1、Nand backup——Nand 备份

3-2、Nand + ext backup——Nand 备份(系统和ext 分区一同备份)

3-3、Nand restore——还原(就是还原3-1、3-2 的最后一次备份)

3-4、BART backup——BART 备份 (包括系统和ext 分区)

3-5、BART restore——还原最后一次的BART备份

Nand 备份类似于系统的备份 而BART 则像是PC 上ghost 的备份。

Nand 备份 它不会备份ext 分区(就是第二分区 没有分区的可以不管这个)

所以你的如果app2sd 了 那么装在第二分区的程序用Nand 恢复是办不到的

BAR T则可以备份到ext 分区 用BART 恢复则可以恢复整个系统 可以使它和你备份前一模一样,不会有一点文件信息的丢失(包括联系人、短信、图片、影音等,所以如果你装的东西比较多,那么备份和恢复会比较慢)

4、Flash zip from sdcard——从sd卡根目录的.zip ROM 刷机包刷机

5、Wipe——清除

5-1、Wipe data/factory reset——清除内存数据和缓存数据

5-2、Wipe Dalvik-cache——清除缓存数据 + ext 分区内数据

5-3、Wipe SD:ext partition——只清除ext 分区内数据

5-4、Wipe battery stats——清除电池数据

5-5、Wipe rotate settings——清除传感器内设置的数据

6、Partition sdcard——分区sd 卡

6-1、Partition SD——自动为sd 卡分区

6-2、Repair SD:ext——修复ext 分区

6-3、SD:ext2 to ext3——将ext2 分区转换为ext3 分区(推荐)

6-4、SD:ext3 to ext4——将ext3 分区转换为ext4 分区(C4 卡不推荐,C6 卡推荐)

7、Other——其它

7-1、Fix apk uid mismatches——修复apk 程序

7-2、Move apps+dalv to SD——移动程序和虚拟缓存到sd 卡(这个可不是 app2sd)

7-3、Move recovery.log to SD——移动刷机日志文件到sd 卡(执行此操作后,sd 卡根目录会出现一个“recovery.log” 文件 即为刷机日志文件)

8、Power off——关机

android 服务英文,Android recovery 模式 中英文对照相关推荐

  1. Android Q 按键启动recovery模式

    Android Q 按键启动recovery模式 相关文件路径 LINUX/android/bootable/bootloader/lk/app/aboot/aboot.c LINUX/android ...

  2. 安卓recovery菜单中英文对照

    安卓爱好者们必然都了解recovery的强大作用,recovery你可以把它当做是一个底层的回复系统模式,用于Android无法正常启动的情况下修复用的.当然,现在主要用途是用来刷第三方的ROM. 如 ...

  3. Android 11.0 进入recovery模式(等待用户选择recovery模式界面)进入自动恢复出厂设置模式

    1.概述 在定制11.0的产品的时候,由于没有音量键 所以用音量键和电源键来选择recovery模式就无法实现了 所以当进入recovery选择模式界面 就一直停在那里 根据需要 要修改成进入等待用户 ...

  4. Android 10.0 进入recovery模式(等待用户选择recovery模式界面)实现自动恢复出厂设置

    1.概述 在10.0 的产品由于没有音量键 所以用音量键和电源键来选择recovery模式就无法实现了 所以当进入 recovery选择模式界面 就一直停在那里 根据需要 要修改成进入等待用户选择re ...

  5. android 12.0去掉recovery模式UI页面的选项

    1.概述 在12.0进行定制化开发,会根据需要去掉recovery模式的一些选项 就是在device.cpp去掉一些选项就可以了 2.去掉recovery模式UI页面的选项核心代码 bootable/ ...

  6. Android之关机/重启/recovery模式(一百一十五)

    1.方式一:App调用系统api SystemProperties.set("sys.powerctl", "shutdown," + reason); 2.方 ...

  7. Android 9.0 进入recovery模式 自动恢复出厂设置的定制化

    1.概述 在9.0 设备中,由于定制的设备没有音量+和音量-按键,所以通过手动选择recovery选择界面的模式时,就不能选择进入哪种模式,这时就需要进入recovery的时候,默认进入恢复出厂设置模 ...

  8. Android 12.0 进入recovery模式(等待用户选择recovery模式界面)进入自动恢复出厂设置模式

    目录 1.概述 2.进入recovery模式(等待用户选择recovery模式界面)进入自动恢复出厂设置模式的核心类

  9. android 9.0去掉recovery模式UI页面的选项

    目录 1.概述 2.去掉recovery模式UI页面的选项的核心类 3.去掉recovery模式UI页面的选项的和功能分析和实现

  10. android 服务架构,Android MVP架构搭建

    目录 引言 为什么用MVP架构 MVP理论知识 乞丐版MVP架构模式的代码实现 MVP中的代码复用场景 平民版MVP架构 - base层顶级父类 Fragment怎么办 时尚版MVP架构 - Mode ...

最新文章

  1. JDK17 要来了!会带来什么新特性?不好意思,我还在JDK7 踏步走...
  2. VMware workstation安装
  3. MAC OS X 10.8 操作远程SSH服务器 + 无密码输入使用SSH服务器
  4. 36 多线程之线程池pool
  5. 图书馆预约在线课程方法
  6. celery delay 没反应
  7. 怎么在linux上修改mysql端口映射_如何在Linux中更改默认的MySQL / MariaDB端口
  8. 系统不做限流,我看你是对中国人口数量有什么误解
  9. 删除ELK中的数据。。
  10. menu什么意思中文意思_alternate什么意思
  11. 京瓷2211打印机清零_打印机墨粉盒清零的方法
  12. “千年老二”搜狐:从没有真正意义上成为第一
  13. 2021年立秋是什么时候?立秋的习俗有哪些?
  14. 得意狗寄给我特快专递
  15. 海豚湾在哪_菲律宾之海豚湾(PUERTO GALERA)攻略
  16. 在Linux环境下通过百度网盘下载并安装matlab2017a
  17. Tableau 不同产地电影数量与评分-案例讲解
  18. Java求一元二次方程的根
  19. python 爬手机号_python手机号前7位归属地爬虫代码实例
  20. 创新触手可及: 为使用企业级 OSGi 做好准备了吗?

热门文章

  1. Python语音合成小工具(PyQt5 + pyttsx3)
  2. 2018上半年最火的微信公众号有哪些?
  3. Android默认头像那些事儿
  4. MiniGUI源码分析——GDI概览及Surface
  5. 京东2022双11预售期,商家该做些什么?
  6. (Java)输入一个字母,若是小写字母,则变为大写输出,否则,原样输出
  7. 产品经理的修炼之道--读后感
  8. 帝国cms弱口令登录(帝国cms后台密码忘记怎么办?)
  9. 入职百度-念念不忘,必有回响
  10. pkl形式的数据集读取和可视化