android中的recovery模式

转载 2012年03月27日 14:39:40

原文地址::http://blog.csdn.net/armlinux_fans/article/details/6124450

 

这里使用基于freescale的imx_r9.2 patch的android源码分析.

android中的recovery模式,作为android的开发者或者用户都应该清楚和了解。android利用recovery模式完成整个系统的升级和恢复出厂设置。

这里先讲讲怎么进入recovery模式,这个工作是由bootloader完成。freescale使用的uboot.

bootloader每次启动的时候都要执行./lib_arm/board.c的代码:

   464    #ifdef CONFIG_ANDROID_RECOVERY
   465        check_recovery_mode();
   466    #endif

该函数位于./board/freescale/common/recovery.c,代码如下:

    98    /* export to lib_arm/board.c */
    99    void check_recovery_mode(void)
   100    {
   101        if (check_key_pressing())
   102            setup_recovery_env();
   103        else if (check_recovery_cmd_file()) {
   104            puts("Recovery command file founded!/n");
   105            setup_recovery_env();
   106        }
   107    }

line 101和line 103指出有两种方式可以执行setup_recovery_env()进入recovery模式。

我们接下来看看这三个函数到底干了些什么,

check_key_pressing也在board/freescale/common/recovery.c中,

    32    int check_key_pressing(void)
    33    {
...
    38   
    39        puts("Detecting HOME+POWER key for recovery .../n");
...
    45   
    46        for (i = 0; i < keys; i++) {
    47            if (test_key(CONFIG_POWER_KEY , &key_info[i]))
    48                state |= PRESSED_HOME;
    49            else if (test_key(CONFIG_HOME_KE Y, &key_info[i]))
    50                state |= PRESSED_POWER;
    51        }
...
    55        if ((state & RECOVERY_KEY_MASK) == RECOVERY_KEY_MASK)
    56            return 1;
    57   
    58        return 0;
    59    }
该函数用于探测HOME+POWER键,若同时按下,函数返回1,进入recovery模式。

   893    int check_recovery_cmd_file(void)
   894    {
...

   938                filelen = ext2fs_open(CONFIG_ANDROID_RECOVERY_CMD_FILE );

...

   955        return (filelen > 0) ? 1 : 0;

   956   
   957    }

 该函数探测宏CONFIG_ANDROID_RECOVERY_CMD_FILE,表示的文件是否存在,若存在返回1,进入recovery模式。

该宏定义在./include/configs/mx51_bbg_android.h

  115    #define CONFIG_ANDROID_RECOVERY_CMD_FILE "/recovery/command"

接下来看看setup_recovery_env()函数,做了些什么事情。

    70    void setup_recovery_env(void)
    71    {
    72        char *env, *boot_args, *boot_cmd;
    73        int bootdev = get_boot_device();
    74   
    75        boot_cmd = supported_reco_envs[bootdev].cmd;
    76        boot_args = supported_reco_envs[bootdev].args;

    77   
    78        if (boot_cmd == NULL) {
    79            printf("Unsupported bootup device for recovery/n");
    80            return;
    81        }
    82   
    83        printf("setup env for recovery../n");
    84   
    85        env = getenv("bootargs_android_recovery");
    86        /* Set env to recovery mode */
    87        /* Only set recovery env when these env not exist, give user a
    88         * chance to change their recovery env */
    89        if (!env)
    90            setenv("bootargs_android_recovery", boot_args);
    91   
    92        env = getenv("bootcmd_android_recovery");
    93        if (!env)
    94            setenv("bootcmd_android_recovery", boot_cmd);
    95        setenv("bootcmd", "run bootcmd_android_recovery");
    96    }
该函数主要用来设置bootargs_android_recovery和bootcmd_android_recovery环境变量,我们看看这两个环境变量到底设置成了什么,

请看代码:board/freescale/mx51_bbg/mx51_bbg.c

   878    struct reco_envs supported_reco_envs[BOOT_DEV_NUM] = {
...
   888         .cmd = CONFIG_ANDROID_RECOVERY_BOOTCMD_MMC ,
   889         .args = CONFIG_ANDROID_RECOVERY_BOOTARGS_MMC,
...
   891    };
上面line 888和line 889的宏定义在include/configs/mx51_bbg_android.h:

   109    #define CONFIG_ANDROID_RECOVERY_BOOTARGS_MMC /
   110        "setenv bootargs ${bootargs} init=/init root=/dev/mmcblk0p4 " /
   111        "rootfs=ext4 di1_primary"
   112    #define CONFIG_ANDROID_RECOVERY_BOOTCMD_MMC  /
   113        "run bootargs_base bootargs_android_recovery ;"    /
   114        "mmc read 0 ${loadaddr} 0x800 0x1800;bootm"
看到这里终于了解了,到底怎么进入recovery模式,实际上就是通过bootloader传递参数给内核,让kernel挂载recovery分区便启动了recovery模式。

 

 

android recovery 主系统代码分析

阅读完上一篇文章: http://blog.csdn.net/andyhuabing/article/details/9226569  我们已经清楚了如何进入正常模式和Recovery模式已有深刻理解...
  • andyhuabing
  • andyhuabing
  • 2013年07月05日 14:05
  • 26781

Android系统中Recovery模式服务的工作原理

http://my.oschina.net/u/572562/blog/63834 这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Re...
  • gjsisi
  • gjsisi
  • 2013年10月10日 14:46
  • 2007

Android Recovery:功能简介。Recovery模式介绍

Android Recovery Theory Android Recovery:功能简介 Android支持Recovery模式。在某些操作之后,系统会自动重启并进入到Recovery模式,用户...
  • wed110
  • wed110
  • 2014年06月09日 19:15
  • 7965

android recovery 模式启动进入流程

http://blog.csdn.net/yzhang8703/article/details/7166593 1.  上层应用的设置->隐私权->恢复出厂设置对应的java代码在如下路...
  • thinkinwm
  • thinkinwm
  • 2013年02月13日 16:42
  • 5367

android recovery 系统代码分析 -- 选择进入

最近做Recovery的规范及操作指导文档,花了一些时将此流程搞清。 Android利用Recovery模式,进行恢复出厂设置,OTA升级,patch升级及firmware升级。而在进入Recover...
  • andyhuabing
  • andyhuabing
  • 2013年07月03日 12:44
  • 12092

Android系统Recovery模式的工作原理

在使用update.zip包升级时怎样从主系统(main system)重启进入Recovery模式,进入Recovery模式后怎样判断做何种操作,以及怎样获得主系统发送给Recovery服务的命令,...
  • kevinx_xu
  • kevinx_xu
  • 2013年02月19日 09:48
  • 2076

Android--Recovery模块之恢复出厂设置

主要讲解一下Recovery模块的恢复出厂设置流程,上层入口主要是将恢复出厂设置命令写入/cache/recovery/command文件,并进行重启;重启后系统进入bootable的recovery...
  • Kitty_Landon
  • Kitty_Landon
  • 2015年05月28日 09:54
  • 5239

Android系统Recovery工作原理之使用update.zip升级过程分析(三)---Android系统的三种启动模式

Android系统Recovery工作原理之使用update.zip升级过程分析(三)---Android系统的三种启动模式...
  • ztguang
  • ztguang
  • 2016年10月17日 16:46
  • 378

Android判断进入recovery mode还是system mode的方法详解

Recovery简介 Android利用Recovery模式,进行恢复出厂设置,OTA升级,patch升级及firmware升级。 升级一般通过运行升级包中的META-INF/com/google...
  • lp542718520
  • lp542718520
  • 2014年08月21日 17:54
  • 3196

Recovery模式本地化文本显示

写在前面: 本系列博文所讨论的内容主要是与大家一起讨论Recovery模式本地化显示文本的原理,以及如何使用谷歌提供的recovery_l10n工具实现定制本地化显示的文本。 导读: 首先我们来讨论R...
  • huangyabin001
  • huangyabin001
  • 2015年04月10日 15:13
  • 4120
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android中的recovery模式
举报原因:
原因补充:

(最多只允许输入30个字)