Android Recoveryの代码分析

1、调用main函数

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

  1. int
  2. main(intargc,char**argv)
  3. {
  4. chartmp[4];
  5. time_tstart=time(NULL);
  6. #ifRECOVERY_DBG
  7. log_init();
  8. #endif
  9. INFO(">>>>>Enterrecovery<<<<<\n");
 

 argc是参数个数,argv是每个参数指针 

从这里开始了recovery...


2、获取commond

  1. staticvoid
  2. get_args(int*argc,char***argv){
  3. //INFO("Enterget_args\n");
  4. structbootloader_messageboot;
  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. }elseif(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("Datawipefailed.\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. intkey=0;
  3. INFO("waitankey\n");
  4. key=ui_wait_key();
  5. INFO("endwait\n");
 这个函数作用就是一直在等待用户输入是一个不断的循环,可以选择五个条目,包括恢复出厂设置和重启等;maybe_install_firmware_update(send_intent);是给用户一个机会,写入你的intent,做一些谷歌没有做的事这个就是完成升级的最后一个函数, 
  1. //Resetthebootloadermessagetoreverttoanormalmainsystemboot.
  2. if(g_reset_blmsg)
  3. {
  4. INFO("readytoclearcmdinmisc\n");
  5. structbootloader_messageboot;
  6. memset(&boot,0,sizeof(boot));
  7. set_bootloader_message(&boot);
  8. }
 在这之前是针对intent的一个处理,这里g_reset_blmsg是根据上文提到的清除boot的一个判据,如果需要清除boot,表明下次重启后正常启动,不进入recovery模式 
 
 6、reboot处理完boot和misc分区,重启
                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值