Recovery模式本地化文本显示(一、Framework层)

写在前面:

本系列博文所讨论的内容主要是与大家一起讨论Recovery模式本地化显示文本的原理,以及如何使用谷歌提供的recovery_l10n工具实现定制本地化显示的文本。

导读:

首先我们来讨论Recovery模式下本地化文本的显示是如何实现的。

先看两张图,相信很多人都很熟悉,第一张是我们恢复出厂设置操作,关机重启进入recovery模式之后所看到的界面,第二张是通过按键进入recovery模式,带有选项菜单的主界面。一般来说普通用户正常的操作是不会看到第二个界面的,而在第一张图片中我们看到,在绿色小机器人下面有一行字符,这行字符就是本文的关键。

图1:恢复出厂设置-擦除数据

图2:recovery模式主界面-选项菜单

其实上面这行文本内容并不是以字符的形式显示的,而是用图片代替,如下图:

图3:本地化文本图片合成

补充一下,就是说当Recovery模式下需要显示这些文本信息的时候,会根据进入recovery模式前的系统语言来从上面这张图片中截取对应语言的文本信息,也就是说这个信息并不是直接用C语言打印输出到屏幕上的。

在Recovery模式下是不支持系统语言库的,但是recovery中文本信息本地化又是与主系统当前语言环境保持同步的,那么,在recovery模式是如何与主系统进行交互的呢?

主系统与recovery通过command文件中特定的参数进行交互的。

Framework层

首先来看framework/base/core/java/android/os/RecoverySystem.java中的代码片段:

    /** RECOVERY_DIR是用来与recovery系统交互的目录,也就是说主系统与recovery系统是通过文件进行交互的.  详情可了解 bootable/recovery/recovery.c. */
    private static File RECOVERY_DIR = new File("/cache/recovery");
    private static File COMMAND_FILE = new File(RECOVERY_DIR, "command");
/* 安装指定的更新包并进行重启*/
    public static void installPackage(Context context, File packageFile)
        throws IOException {
        String filename = packageFile.getCanonicalPath()//得到更新包路径
        ......
        final String filenameArg = "--update_package=" + filename;//将更新包路径作为参数传递写入Command文件
        final String localeArg = "--locale=" + Locale.getDefault().toString();//本地化参数
        bootCommand(context, filenameArg, localeArg);//重启,并将参数写入command文件
    }
/*擦除data和cache分区的数据并重启*/
    public static void rebootWipeUserData(Context context, boolean shutdown, String reason)
            throws IOException {
        ......

        String shutdownArg = null;
        if (shutdown) {
            shutdownArg = "--shutdown_after";
        }
        String reasonArg = null;
        if (!TextUtils.isEmpty(reason)) {
            reasonArg = "--reason=" + sanitizeArg(reason);
        }
        final String localeArg = "--locale=" + Locale.getDefault().toString();//本地化参数
        bootCommand(context, shutdownArg, "--wipe_data", reasonArg, localeArg);
    }

    /*擦除cache分区的数据并重启*/
    public static void rebootWipeCache(Context context, String reason) throws IOException {
        ......
        final String localeArg = "--locale=" + Locale.getDefault().toString();//本地化参数
        bootCommand(context, "--wipe_cache", reasonArg, localeArg);
    }
/*重启进入recovery模式,并根据指定的参数指定相对应的操作,如安装更新,擦除用户数据等*/
    private static void bootCommand(Context context, String... args) throws IOException {
        RECOVERY_DIR.mkdirs();  // In case we need it
        COMMAND_FILE.delete();  // In case it's not writable
        LOG_FILE.delete();
        /*向command文件中写入指定的参数*/
        FileWriter command = new FileWriter(COMMAND_FILE);
        try {
            for (String arg : args) {
                if (!TextUtils.isEmpty(arg)) {
                    command.write(arg);
                    command.write("\n");
                }
            }
        } finally {
            command.close();
        }
        // Having written the command file, go ahead and reboot
        PowerManager pm=(PowerManager)context.getSystemService(Context.POWER_SERVICE);
        pm.reboot(PowerManager.REBOOT_RECOVERY);
        throw new IOException("Reboot failed (no permissions?)");
    }

从上面代码告诉我们,主系统是通过COMMAND_FILE文件的形式与recovery进行交互,根据不同的命令行参数执行不同的操作,如系统升级、恢复出厂设置等。

时间: 2024-11-09 05:53:31

Recovery模式本地化文本显示(一、Framework层)的相关文章

实现Recovery模式本地化显示文本定制(recovery_l10n工具的使用)

写在前面: 从Recovery模式本地化文本显示我们了解到,recovery是支持恢复出厂设置(正在清楚...)和安装升级包(正在安装系统更新...)本地化文本显示的,除了这两种recovery同样支持"无命令."和"出错了!"两种文本实现本地化显示,如下: 图1: 图2: 图3: 图4: 而且通过对前一篇博文的描述我们明白这四种文本本地化显示是通过图片合成的方式将各种语言的相关文本合成在同一张图片中,一般来说这四张图片是平台默认提供的,我们并不对其进行定制,但是谷

LG N4 进入Recovery 模式后,出现红色感叹号

show和set命令是两条用于维护SQLPlus系统变量的命令 : SQL> show all --查看所有系统变量值 SQL>show user --显示当前连接用户 SQL>show error --显示错误(编译function,procedure,package,pl/sql的时候,可以查看具体的错误提示) SQL>set sqlprompt SQL  --设置默认提示符,默认值就是SQL SQL>set linesize 1000 --设置屏幕显示行宽,默认100

Recovery模式下/cache/recovery/目录下创建文件,开机后文件被删除

在一次需求的实现过程中需要在remcovery模式下,在/cache/recovery/目录下创建一个日志文件用于记录相关的日志信息,以便于在开机后读取这些日志信息,再根据日志信息做出相应的处理,但是奇怪的是每当开机完成该文件不被系统自动删除,而系统中原有的日志文件(如升级log---last_log_r)等却依然保留,因此在全局中搜索关键字"/cache/recovery/"发现了这其中的原因. 也就是说系统会在系统启动完成后删除/cache/recovery/目录下不是以"

Android Framework中的Application Framework层介绍

Android的四层架构相比大家都很清楚,老生常谈的说一下分别为: Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework. Framework层为我们开发应用程序提供了非常多的API,我们通过调用特殊的API构造我们的APP,满足我们业务上的需求.写APP的人都知道,学习Android开发的第一步就是去学习各种各样的API,什么Activity,Service,Notification等.这些都是framework提供给我们的,那么我就详细的讲讲F

android telephone 4.2 framework层分析

framework层的相关代码主要在GSMPhone.CallManager.GSMCallTracker.TelePhonyManager中. GSMPhone: 与GSMPhone关联的主要是Phone.java.PhoneBase.java.GSMPhone.java.Phone作为基类,定义了25对Handler消息注册和注销的接口,而PhoneBase继承Phone实现了24对,还有一对在GSMPhone中实现,而GSMPhone继承了PhoneBase. 如何管理Phone对象的呢?

FastBoot BootLoader Recovery 模式解释

理论上,所有的Android设备都存在着Fastboot/Bootloader模式,不过,由于Android操作系统的开源特性,各厂商的对 自家的相关Android设备都有着各自不同的Fastboot/Bootlader模式.当然,并非所有的厂商的都会对旗下设备的Fastboot /Bootloader模式进行锁定.然而,大多数情况下,它们的Fastboot/Bootloader模式是锁定的.但是,值得称道的是,现在越来越多的厂商已渐渐向开发的Fastboot/Bootloader模式过渡,如H

IE的浏览器模式、文本模式

最近在部署网页的时候,发现IE下的布局完成混乱. 在改变IE的文本模式后,显示就正常了. IE的浏览器模式,用于切换IE针对该网页的默认文本模式.对不同版本浏览器的条件注释解析.决定请求头里userAgent的值.它在浏览器发出请求之前就已经确定,网站没有办法修改这个值.它代表的是用户以何种浏览器访问网站. 主要的是文本模式,文本模式决定浏览器的排版引擎和JS引擎,它代表的是浏览器以何种模式呈现页面. 为了解决布局混乱的问题,我们需要手动决定文本模式,通常我们采用以下的语句: <meta htt

Android4.0(Phone)拨号启动过程分析(三)与Framework层通信

由于Android几乎所有的代码都是公开的,如果要对Framework层分析就必需先拿到Framework层的代码,我在前面已经搭建好了ubuntu14.04的环境,下载好了Android4.0的源码,其中也包括了Framework层和Package的代码,导出到宿主机Windows XP中用Source Insight 3.5工具来查看源码,Package中的代码可以导入到Eclipse下查看,我是把frameworks\base整个目录都导入到Source Insight 3.5工程中,可以

Android Framework层Power键关机流程(一,Power长按键操作处理)

一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManager开始分析,在分析前我这里打印了该方法的堆栈调用信息.大家可以参考一下. public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) { ...... android.uti