您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 理论文章 > android recovery
AndroidOTA升级过程的学习目录1.Android升级的三种模式2.OTA与本地升级的流程3.Recovery4.全包升级与差分升级5.双备份升级6.升级过程断电问题一、Android升级的三种模式1.1android系统的三种启动模式1.在uboot通过组合键进入bootloader的fastboot。2.在uboot通过组合键或者读取MISC分区的command进入recovery模式。3.正常启动模式一、Android升级的三种模式1.2android系统的三种升级模式1.fastboot模式通过uboot进入bootloader的fastboot模式,通过USB将底包数据写入FLASH。2.本地升级通过应用层升级APK将升级信息写入MISC分区的bootloader_message数据结构中。3.OTA升级将升级服务器的升级包下载到本地,再通过本地升级的方式进行升级。二、OTA与本地升级的流程2.1OTA与本地升级的流程需要整个软件平台的配合,主要有三个部分。1.MainSystem:在重启进入Recovery模式之前,会向cache分区的recovery目录写入升级信息和MISC分区BCB结构写入命令,以便在重启后告诉bootloader进入Recovery模式。2.Recovery:系统进入Recovery模式后会装载Recovery分区,该分区包含recovery.img(同boot.img相同,包含了标准的内核和根文件系统)。进入该模式后主要是运行Recovery服务(/sbin/recovery)来做相应的操作(重启、升级update.zip、擦除cache分区等)。3.Bootloader:除了正常的加载启动系统之外,还会通过读取MISC分区(BCB)获得来至Mainsystem和Recovery的消息。二、OTA与本地升级的流程2.2升级过程流程1.Upgrade的升级过程2.Upgrade的通讯过程三、Recovery1.recovery.img启动的初始配置也是启动内核,然后启动文件系统。在进入文件系统后会执行init,init使用配置文件/init.rc进行初始配置。#设置环境变量#建立etc连接#新建目录#挂载/tmp为内存文件系统tmpfs#启动recovery(/sbin/recovery)服务#启动adbd服务(用于调试)三、Recovery2.recovery服务recovery服务是Recovery启动模式中最核心的部分。它完成Recovery模式所有的工作。1.ui_init():Recovery服务使用了一个基于framebuffer的简单ui。2.get_arg():获取Mainsystem传递给Recovery服务参数3.parserargc/argv:解析我们获得参数。4.根据参数分析的结果,进一步分析是否升级,是否wipe等。5.如果安装失败执行:prompt_and_wait()待用户处理。6.安装成功执行:finish_recovery(),清除参数,以及备份升级log到cache分区。7.reboot.三、Recovery2.recovery服务的核心install_package.1.ensure_path_mount():先判断所传的update.zip包路径所在的分区是否已经挂载。如果没有则先挂载。2.load_keys():加载公钥源文件,路径位于/res/keys。这个文件在Recovery镜像的根文件系统中。3.verify_file():对升级包update.zip包进行签名验证。4.mzOpenZipArchive():打开升级包,并将相关文件信息拷贝到一个临时的ZipArchinve变量中。5.try_update_binary():在这个函数中才是对update.zip升级的地方。6.pipe():创建管道,用于下面的子进程和父进程之间的通信。7.fork():创建子进程。8.父进程通过pipe接收升级过程信息并显示,等待子进程退出。三、Recovery3.升级程序update_binary的执行过程1.函数参数以及版本的检查:当前updaterbinaryAPI所支持的版本号有1,2,3这三个。2.获取管道并打开:在执行此程序的过程中向该管道写入命令,用于通知其父进程根据命令去更新UI显示。3.读取updater-script脚本:从update.zip包中将updater-script脚本读到一块动态内存中4.Configureedify’sfunctions:注册脚本中的语句处理函数,即识别脚本中命令的函数。5.Parsethescript:调用yy*库函数解析脚本,并将解析后的内容存放到一个Expr类型数据结构中。6.执行脚本:核心函数是Evaluate(),它会调用其他的callback函数,7.错误信息提示:最后就是根据Evaluate()执行后的返回值,给出一些打印信息。三、Recovery4.updater-script脚本语法简介以及执行流程#update-script脚本格式有edify,amend两种,android1.5以前使用amend,1.5以后使用edify格式。1.比较时间戳:如果升级包较旧则终止脚本的执行。2.匹配设备信息:如果和当前的设备信息不一致,则停止脚本的执行。3.显示进度条:如果以上两步匹配则开始显示升级进度条。4.格式化system分区并挂载。5.提取包中的recovery以及system目录下的内容到系统的/system下。6.为/system/bin/下的命令文件建立符号连接。7.设置/system/下目录以及文件的属性。8.将包中的boot.img提取到/tmp/boot.img,写入到boot分区。9.完成后卸载/system。四、全包升级与差分升级全包升级与差分升级包的升级过程都是zip文件的升级过程。所以升级的流程是一样的,唯一不同的地方就是从升级包中提取升级脚本的不同,执行不同的升级过程。#如:全包升级脚本中包含格式化system分区的语句,差分升级则没有。五、双备份升级双备份升级:是指系统(boot、system)分区做双备份A,B,使用A系统时升级B系统,使用B系统时升级A系统。#将系统做双备份,多划分两个分区(boot,system)。#使用A系统时后台升级B系统,使用B系统时后台升级A系统,升级完成后再uboot做标记。#uboot根据标记决定从哪个系统启动。六、升级过程断电问题在升级过程断电问题断电,会导致uboot、recovery、Mainsystem的数据被破坏,导致系统起不来成为砖头。规避方法成为砖头方法:1.在升级包中不包含uboot,recovery镜像,使在升级过程断电的情况下,也不会损坏uboot,和recovery。可以使用双备份升级和一键恢复升级方式,进行恢复升级。2.在升级包中不包含uboot,使在升级过程断电的情况下,也不会损坏uboot,。可以使用一键恢复升级方式从外部存储设备加载recovery,进行恢复升级。
本文标题:android recovery
链接地址:https://www.777doc.com/doc-3301757 .html