android中的recovery模式

本文详细解析了基于Freescale i.MX平台的Android设备如何进入Recovery模式。介绍了通过同时按下特定组合键或检查特定文件的方式触发进入Recovery模式,并深入分析了实现这一过程的底层代码。

这里使用基于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模式。

<think>嗯,用户想在Androidrecovery模式下实现日语显示功能。首先,我需要回忆一下Android recovery的相关知识。Recovery模式通常用于系统更新和恢复,它的界面显示是由特定的代码控制的。根据引用[3],recovery模式的代码位于/bootable/recovery目录,其中ui.cpp负责显示逻辑,而资源文件可能存放在其他地方。 用户的问题涉及到多语言支持,特别是日语。首先,我需要确认recovery模式是否原生支持多语言。一般来说,原生的Android recovery可能只支持少数几种语言,比如英文,所以添加日语可能需要修改源码中的资源文件和显示逻辑。 接下来,考虑资源文件的配置。Android系统通常使用res/values-ja目录来存放日语的本地化资源,比如字符串。但recovery模式可能使用不同的机制,可能需要检查ui.cpp或者相关的资源加载代码。引用[4]提到编译时使用Android.mk,可能需要修改编译配置来包含日语资源。 然后,字体支持也是一个问题。日语需要相应的字体文件,比如NotoSansJP。Recovery模式可能需要将字体文件打包到镜像中,并在代码中指定使用该字体。引用[3]中的ui.cpp可能涉及字体加载的部分,需要确认如何加载自定义字体。 另外,区域设置的配置也很重要。可能需要设置正确的locale,比如ja_JP,这可以通过修改启动参数或者在代码中硬编码。引用[1]中的setup_recovery_env函数设置了bootargs,或许可以在那里添加locale参数。 还要考虑编译和刷机的问题。用户需要能够编译recovery镜像,并且通过刷机来测试修改。引用[2]提到了使用adb sideload来刷入修改后的文件,可能需要类似的步骤。 最后,用户可能需要具体的代码示例,比如修改ui.cpp加载日语字符串和字体,以及更新资源文件。同时,需要指导用户如何编译和测试修改后的recovery。可能还需要处理字库缺失导致的显示问题,确保字体文件正确包含在镜像中。</think>### Android Recovery模式日语显示配置方法 在Android Recovery模式下实现日语显示需要修改系统底层代码和资源文件,主要涉及三个核心模块的调整: 1. **本地化资源配置** - 在源码目录`bootable/recovery/res/values-ja/strings.xml`中添加日语字符串资源 ```xml <string name="recovery_installing">インストール中...</string> <string name="install_error">インストールエラー</string> ``` - 需要确保`ResourceManager`正确加载日语资源包,参考`ui.cpp`中的资源初始化代码[^3] 2. **字体渲染系统** ```c++ // 在ui.cpp中加载日语字体 gr_font* font = gr_load_font("NotoSansCJK-Regular.ttf"); // 日文字体文件需要包含在文件系统中 gr_set_font(font); ``` 需要将日文字体文件打包到`recovery.img`的`/system/fonts/`目录,推荐使用开源字体如Noto Sans CJK[^4] 3. **区域设置(Locale)** 修改`recovery.cpp`的启动参数: ```c++ setenv("LANG", "ja_JP.UTF-8", 1); // 强制设置日语环境 ``` **完整实现步骤:** 1. 在源码中增加日语资源文件 2. 修改`ui.cpp`的字体加载逻辑 3. 调整`bootargs_android_recovery`添加语言参数 ```c++ setenv("bootargs_android_recovery", "locale=ja_JP", 1); // 引用[1]的启动参数设置方法 ``` 4. 重新编译recovery镜像: ```bash make -j8 recoveryimage # 引用[4]的编译系统 ``` 5. 通过fastboot刷入: ```bash fastboot flash recovery out/target/product/[设备名]/recovery.img ``` **常见问题处理:** - 出现文字方块:检查字体文件是否包含日语字符集 - 语言不切换:确认`strings.xml`文件路径符合`values-ja`命名规范 - 编译失败:检查Android.mk是否包含新增资源文件[^4]
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值