android recovery

本文详细介绍了Android Recovery的功能及其组成,包括启动选择、系统升级流程、recovery.img构成等内容,并深入解析了recovery应用的主入口、命令获取及解析、升级与恢复操作等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android recovery的功能可以分成三个主要的组成部分:

         1 选择引导部分。主要功能是启动是进行选择是启动正常的android系统还是用于recovery的特殊系统。

         2 用于进行升级的recovery系统,其中recovery系统拥有自己独立的UI和菜单解析系统。

         3 希望升级的程序集合包。在这个升级包中包含升级的目标程序,一个简单的安全验证机制和验证码。一个用于控制升级的脚本和运行脚本所需要的API。


Android recovery系统升级流程:

         Chip rom

            |

         SOC

            |

         u-boot

            |

            |—— KEY and boot reason 判断——|

         正常启动                                                        recovery

            |                                                                              |

         BOOT partition                                              RECOVERY partition

            |                                                                              |

         Android                                                            recovery UI

                                                                                       |

                                                                                    Check SD or cache

                                                                                       |

                                                                                    Find update package

                                                                                       |

                                                                                    Run update script


一、Recovery是如何构成的

  说recovery的构成并不贴切,应该说recovery.img的构成,它是由boot_img_hdr + zImage + recovery-ramdisk构成。boot_img_hd是个结构体它描述了很多重要的信息。


1 struct boot_img_hdr
 2 {
 3     unsigned char magic[BOOT_MAGIC_SIZE];
 4     unsigned kernel_size;  /* size in bytes */
 5     unsigned kernel_addr;  /* physical load addr */
 6     unsigned ramdisk_size; /* size in bytes */
 7     unsigned ramdisk_addr; /* physical load addr */
 8     unsigned second_size;  /* size in bytes */
 9     unsigned second_addr;  /* physical load addr */
10     unsigned tags_addr;    /* physical addr for kernel tags */
11     unsigned page_size;    /* flash page size we assume */
12     unsigned unused[2];    /* future expansion: should be 0 */
13     unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */
14     unsigned char cmdline[BOOT_ARGS_SIZE];
15     unsigned id[8]; /* timestamp / checksum / sha1 / etc */
16 };

其中kernel_size表示zImage的实际大小;kernel_addr表示zImage载入内存的物理地址,这个地址也是bootloader跳转到内核的地址;ramdisk_size表示ramdisk(此处就是指recovery-ramdisk)的实际大小;ramdisk_addr是ramdisk加载到内存的物理地址,之后kernel会解压并把它挂在成根文件系统,我们的中枢神经-init.rc就隐藏于内;second_size,second_addr做扩展用一般都不会使用(在我的一个项目中把它扩展成另外一种功能有机会介绍给大家);tags_addr是传参数用的物理内存地址,它作用是把bootloader中的参数传递给kernel;page_size是flash(eg. nandflash)的一个页大小,一般为2K,这通常情况取决于你使用Flash芯片的页大小;cmdline就是command line它可以由bootloader传递也可以在.config(kernel)中配置。

zImage是我们熟悉的内核镜像,由kernel编译生成。recovery-ramdisk是由mkbootfs、gzip打包生成的,命令如下:

mkbootfs ramdiskdir | gzip > recovery-ramdisk.gz

FROM: http://www.cnblogs.com/becklc/archive/2012/09/24/2676600.html



recovery相关代码路径:

1 启动引导部分:

  

2 OTA package打包脚本

         build/tools/releasetools/common.py

         build/tools/releasetools/edify_generator.py

         build/tools/releasetools/ota_from_target_files

3 recovery 主控程序

         bootable/recovery/*.*

         这部分代码主要完成三部分功能:UI,安全验证,脚本解释器。



1、调用main函数

在gingerbread/bootable/recovery/recovery.c最下面有个main(),这是recovery应用的主入口,当编译recovery的时候,会生成一个名为recovery的可执行文件,我这边是放在out/目录下recovery/文件系统的/sbin目录下,调用recovery可执行文件时会传入参数,这些参数就是main函数的参数,如下

  1. int  
  2. main(int argc, char **argv)  
  3. {  
  4.     char tmp[4];  
  5.     time_t start = time(NULL);  
  6.  
  7. #if RECOVERY_DBG  
  8.     log_init();  
  9. #endif  
  10.     INFO(">>>>> Enter recovery <<<<<\n");  
argc是参数个数,argv是每个参数指针

从这里开始了recovery...


2、获取commond

  1. static void  
  2. get_args(int *argc, char ***argv) {  
  3. //  INFO("Enter get_args\n");  
  4.     struct bootloader_message boot;  
  5.     memset(&boot, 0, sizeof(boot));  
如果命令行有recovery命令,优先执行命令行的recovery命令; 否则,往下查找misc分区中的命令、/cache/recovery/command文件中的命

3、获取默认升级固件路径和名称

 int property_get(const char *key, char *value, const char *default_value);

包括U盘、SD卡和Flash升级


4、解析命令

int getopt_long(int, char * const *, const char *,   const struct option *, int *);

如 case 's': send_intent = optarg; break;

optarg是取命令中等号后面字符串

注册一些命令,register_update_commands函数是注册在update-script和recovery-script使用的升级命令

初始化一个变量,int status = INSTALL_SUCCESS;这个变量是用来标识升级是否成功,在清除misc分区命令时候作为一个判断依据


5、升级、格式化、还原

接下来,有三种需求,一是factorytest;二是update、recover;三是wipe data

  1. if (update_image != NULL) {  
  2.     status = install_update(update_image);  
  3.     if (status != 0) {  
  4.         ui_set_background(BACKGROUND_ICON_ERROR);  
  5.         if(status==-1) g_enable_item_move = false;  
  6.     }  
  7. }else if(recover_image != NULL){  
  8. atus = recover_backup(recover_image);  
  9.     if (status != 0) {  
  10.         ui_set_background(BACKGROUND_ICON_ERROR);  
  11.         if(status==-1) g_enable_item_move = false;  
  12.     }  
  13. }   
这部分代码是update\recover的需求,update走install_update分支,recovery走recover_backup分支,g_enable_item_move是在recovery升级界面条目是否可移动的一个变量,false表示不能移动
  1. if (wipe_flags) {  
  2.        if( wipe_data(wipe_flags) != 0 )  
  3.        {  
  4.            status = INSTALL_ERROR;  
  5.            ui_print("Data wipe failed.\n");  
  6.            // 不擦除misc中的命令,重启后再次格式化  
  7.            g_reset_blmsg = false;  
  8.            g_enable_item_move = false;  
  9.        }  
  10.    }  
这部分是擦除数据,就是格式化需求,根据擦除flags记录,分别去擦除需要格式化的分区或者磁盘,如果擦除失败,g_reset_blmsg 这个变量在擦除boot时候作为判别依据,false表示不擦出,这样,misc分区的内容还是recovey,下次重启后,boot引导进入recovery模式 prompt_and_wait()函数里面,关键部分
  1.   for (;;) {  
  2.       int key = 0;  
  3. INFO("wait an key\n");  
  4. key = ui_wait_key();  
  5. INFO("end wait\n");  
这个函数作用就是一直在等待用户输入是一个不断的循环,可以选择五个条目,包括恢复出厂设置和重启等;maybe_install_firmware_update(send_intent);是给用户一个机会,写入你的intent,做一些谷歌没有做的事这个就是完成升级的最后一个函数,
  1. // Reset the bootloader message to revert to a normal main system boot.  
  2.     if(g_reset_blmsg)  
  3.     {  
  4.     INFO("ready to clear cmd in misc \n");  
  5.         struct bootloader_message boot;  
  6.         memset(&boot, 0, sizeof(boot));  
  7.         set_bootloader_message(&boot);  
  8.     }  
在这之前是针对intent的一个处理,这里g_reset_blmsg是根据上文提到的清除boot的一个判据,如果需要清除boot,表明下次重启后正常启动,不进入recovery模式 6、reboot处理完boot和misc分区,重启。



fastboot协议是PC通过USB与手机上的bootloader通信的协议。适用于Linux,Windows,OSX等平台。

 

基本配置要求:

1、USB连接PC与手机。

2、对于high-speec USB,包的最大尺寸必须是512byte.对于full-speed USB,包的最大尺寸必须是64byte。

3、协议由PC端驱动。

 

协议传输过程如下:

1、PC向手机发送一个命令,命令由ASCII字符组成,必须存在在一个不大于64byte的包里。

2、手机向PC响应一个不大于64byte的包。包的最前面四个byte是“OKAY”、“FAIL”、“DATA”、“INFO”中的一个。后面如果还有byte,包含就是ASCII信息。下面具体解释

INFO:后面的60个byte代表的信息被显示完成后,跳到#2继续执行。

FAIL:命令执行失败。后面的60个byte是需要显示给用户的失败信息。

OKAY:命令执行成功。跳到#1.

DATA:命令执行成功,开始进入数据传输阶段。一个DATA响应包的大小是12byte,通常是DATA00000000这样的形式,后面的8个数字代表的要传输的数据包的总大小。

3、如果#2时,PC收到的是DATA命令的话,就开始传输数据。0byte数据会被忽略。当#2指示的数据大小被传输完成时,数据传输结束。



内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
管理员功能需求 用户管理 查看用户列表:显示所有用户基本信息 添加用户:支持输入新用户信息并保存至数据库 修改用户信息:支持选择用户并更新其信息 删除用户:支持从数据库中删除选定用户 实习报告成绩管理 查看实习报告列表:显示所有学生实习报告 批阅实习报告:支持选择报告并给出批阅意见和评分 查看实习成绩列表:显示所有学生实习成绩 录入实习成绩:支持选择学生并输入成绩 修改实习成绩:支持更新学生实习成绩 通知公告管理 发布通知公告:支持输入通知内容并发布至系统 管理通知公告:支持查看、编辑和删除已发布通知 教师功能需求 学生管理 查看所指导学生列表:显示教师负责的所有学生 查看学生实习情况:支持查看学生实习岗位、日志、报告等 实习报告批阅成绩录入 查看待批阅报告列表:显示教师待批阅的实习报告 批阅报告:支持选择报告并给出批阅意见和评分 通知公告查看 查看系统通知公告:显示系统发布的所有通知和公告 实习岗位管理 发布实习岗位:支持输入岗位信息并发布至系统 编辑实习岗位:支持更新已发布岗位信息 删除实习岗位:支持从系统中删除选定岗位 学生功能需求 个人信息管理 查看个人信息:显示学生基本信息 修改个人信息:支持更新学生信息 实习岗位查询与申请 查询实习岗位:显示所有可用实习岗位 申请实习岗位:支持选择岗位并提交申请 实习日志提交 提交实习日志:支持输入日志内容并提交至系统 查看实习日志:显示学生提交的实习日志 实习报告提交 提交实习报告:支持输入报告内容并提交至系统 查看实习报告:显示学生报告及批阅意见 通知公告查看 查看系统通知公告:显示系统发布的所有通知和公告
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值