高通recovery流程分析(编译、界面、图片)

news2024/11/26 16:29:39

目录

recovery 界面菜单

recovery 界面操作

recovery 启动流程

recovery 编译makefile

recovery 图片大小

ramdisk、boot.img、recovery.img之间的关系


authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主

recovery 界面菜单

recovery 界面显示

android recoveryuse

路径

bootable/recovery/device.cpp

背景设置

void ScreenRecoveryUI::draw_background_locked() {

 gr_color(0, 0, 0, 255); 

}

第一个参数 0:表示红色分量的强度,这里是最小值,表示没有红色。

第二个参数 0:表示绿色分量的强度,这里是最小值,表示没有绿色。

第三个参数 0:表示蓝色分量的强度,这里是最小值,表示没有蓝色。

第四个参数 255:表示透明度或不透明度,这里是最大值,表示完全不透明。

因此,gr_color(0, 0, 0, 255) 表示的是一个完全不透明的黑色。

如果要设置绿色不透明背景,修改参数为gr_color(0, 255, 0, 255)

路径

bootable/recovery/screen_ui.cpp

#include "device.h"
static const char* MENU_ITEMS[] = {
    "Reboot system now",
    "Reboot to bootloader",
    "Apply update from ADB",
    "Apply update from SD card",
    "Wipe data/factory reset",
#ifndef AB_OTA_UPDATER
    "Wipe cache partition",
#endif  // !AB_OTA_UPDATER
    "Mount /system",
    "View recovery logs",
    "Run graphics test",
    "Power off",
    NULL,
};

static const Device::BuiltinAction MENU_ACTIONS[] = {
    Device::REBOOT,
    Device::REBOOT_BOOTLOADER,
    Device::APPLY_ADB_SIDELOAD,
    Device::APPLY_SDCARD,
    Device::WIPE_DATA,
#ifndef AB_OTA_UPDATER
    Device::WIPE_CACHE,
#endif  // !AB_OTA_UPDATER
    Device::MOUNT_SYSTEM,
    Device::VIEW_RECOVERY_LOGS,
    Device::RUN_GRAPHICS_TEST,
    Device::SHUTDOWN,
};

static_assert(sizeof(MENU_ITEMS) / sizeof(MENU_ITEMS[0]) ==
              sizeof(MENU_ACTIONS) / sizeof(MENU_ACTIONS[0]) + 1,
              "MENU_ITEMS and MENU_ACTIONS should have the same length, "
              "except for the extra NULL entry in MENU_ITEMS.");

const char* const* Device::GetMenuItems() {
  return MENU_ITEMS;
}

这段代码定义了两个数组:MENU_ITEMS和MENU_ACTIONS。这两个数组用于存储菜单项和对应的操作。

MENU_ITEMS是一个字符串数组,包含了一系列菜单项的名称。每个菜单项都是一个字符串常量。

MENU_ACTIONS是一个Device::BuiltinAction类型的数组,用于存储与每个菜单项对应的操作。Device::BuiltinAction是一个枚举类型,表示设备的内置操作,如重启、应用更新、擦除数据等。

在MENU_ITEMS数组的末尾,有一个NULL指针,表示数组的结束。

代码中的GetMenuItems()函数返回了MENU_ITEMS数组的地址,即菜单项的名称数组的地址。

最后,代码使用了static_assert语句来确保MENU_ITEMS和MENU_ACTIONS数组的长度相同,除了MENU_ITEMS数组中的额外的NULL条目。如果长度不同,编译时将会报错。

recovery 界面操作

代码中的GetMenuItems()函数返回了MENU_ITEMS数组的地址,即菜单项的名称数组的地址。具体经过switch和case进行具体的操作

// Return REBOOT, SHUTDOWN, or REBOOT_BOOTLOADER.  Returning NO_ACTION
// means to take the default, which is to reboot or shutdown depending
// on if the --shutdown_after flag was passed to recovery.
static Device::BuiltinAction
prompt_and_wait(Device* device, int status) {
    for (;;) {
        finish_recovery(NULL);
        switch (status) {
            case INSTALL_SUCCESS:
            case INSTALL_NONE:
                ui->SetBackground(RecoveryUI::NO_COMMAND);
                break;

            case INSTALL_ERROR:
            case INSTALL_CORRUPT:
                ui->SetBackground(RecoveryUI::ERROR);
                break;
        }
        ui->SetProgressType(RecoveryUI::EMPTY);

        int chosen_item = get_menu_selection(nullptr, device->GetMenuItems(), 0, 0, device);

        // device-specific code may take some action here.  It may
        // return one of the core actions handled in the switch
        // statement below.
        Device::BuiltinAction chosen_action = device->InvokeMenuItem(chosen_item);

        bool should_wipe_cache = false;
        switch (chosen_action) {
            case Device::NO_ACTION:
                break;

            case Device::REBOOT:
            case Device::SHUTDOWN:
            case Device::REBOOT_BOOTLOADER:
                return chosen_action;

            case Device::WIPE_DATA:
                wipe_data(ui->IsTextVisible(), device);
                if (!ui->IsTextVisible()) return Device::NO_ACTION;
                break;

            case Device::WIPE_CACHE:
                wipe_cache(ui->IsTextVisible(), device);
                if (!ui->IsTextVisible()) return Device::NO_ACTION;
                break;

            case Device::APPLY_ADB_SIDELOAD:
            case Device::APPLY_SDCARD:
                    //省略代码……    
                break;

            case Device::VIEW_RECOVERY_LOGS:
                choose_recovery_file(device);
                break;

            case Device::RUN_GRAPHICS_TEST:
                run_graphics_test(device);
                break;

            case Device::MOUNT_SYSTEM:
#ifdef USE_MDTP
                if (is_mdtp_activated()) {
                    ui->Print("Mounting /system forbidden by MDTP.\n");
                }
                else
#endif
              //省略代码……    
                              break;
        }
    }
}

这段代码定义了一个函数prompt_and_wait,该函数用于提示用户选择一个操作,并等待用户的输入。

函数的参数包括一个指向Device对象的指针device和一个整数status。

函数使用一个无限循环for (;;) {}来不断执行以下操作:

调用finish_recovery(NULL)函数,完成recovery操作的最后步骤。

根据status的值,设置recovery界面的背景和进度条的类型。

如果status的值是INSTALL_SUCCESS或INSTALL_NONE,则将背景设置为RecoveryUI::NO_COMMAND;如果status的值是INSTALL_ERROR或INSTALL_CORRUPT,则将背景设置为RecoveryUI::ERROR。

将进度条的类型设置为RecoveryUI::EMPTY,表示没有进度信息。

调用get_menu_selection函数,显示菜单并等待用户选择。该函数的参数包括一个空指针nullptr,表示不显示标题;device->GetMenuItems(),表示获取设备的菜单项;0,表示不显示菜单的起始索引;0,表示不显示菜单的结束索引;device,表示设备对象。

函数最终返回用户选择的操作,可以是Device::REBOOT、Device::SHUTDOWN或Device::REBOOT_BOOTLOADER。如果用户没有选择任何操作,则返回Device::NO_ACTION,表示采取默认操作,即根据--shutdown_after标志决定是重启还是关机。

recovery 启动流程

参考链接

Recovery启动流程(2)---UI界面【转】-腾讯云开发者社区-腾讯云

https://www.cnblogs.com/xiaolei-kaiyuan/p/5456227.html

android-ramdisk.img分析、recovery.img&boot.img执行过程

我们知道,当我们通过按键或者应用进入recovery模式,实质是kernel后加载recovery.img,kernel起来后执行的第一个进程就是init,此进程会读入init.rc启动相应的服务。在recovery模式中,启动的服务是执行recovery可执行文件,此文件是bootable/recovery/recovery.cpp文件生成,我们就从recovery.cpp文件开始分析。

从recovery.cpp main()中可知,进入recovery后会分析/cache/recovery/command文件,根据内容来设定显示的文字语言

SetLocale函数根据locale判断所用的字体是否属于阿拉伯语系,阿拉伯语的书写习惯是从右到左,如果是阿拉伯语系的话,就设置一个标志,后面根据这个标志决定从右到左显示文字或进度条。关于显示文字的语言通过代码即可查看,这里只简单的列出语言设置的几条主线,不贴出具体的代码(太多了)。

recovery 编译makefile

makefile路径

build/core/Makefile

代码

/res 对应路径

bootable/recovery/res-xhdpi

bootable/recovery/res-mdpi

build/core/Makefile

# Otherwise, use the default medium density.
recovery_densities := ldpi
endif

ifneq (,$(wildcard $(recovery_resources_common)-$(recovery_density)))
recovery_resources_common := $(recovery_resources_common)-$(recovery_density)
else
# recovery_resources_common := $(recovery_resources_common)-xhdpi
recovery_resources_common := $(recovery_resources_common)-mdpi
endif

recovery 图片大小

路径

bootable/recovery/fonts

内容

2*22.png 打开如图用ps查看,并裁剪其中一个字符的大小是12*22像素

注意要包含空余空余

img文件

编译出来的recovery.img

ramdisk、boot.img、recovery.img之间的关系

ramdisk.img会被打包到boot.img和recovery.img中(不是同一个ramdisk.img).

ramdisk.img中比较重要的文件是"init","init.rc",其中init是system/core/init/init.c编译而来,

boot.img中ramdisk里的init.rc位于system/core/init/init.rc,

recovery.img中ramdisk里的init.rc位于bootable/recovery/etc/init.rc。

kernel加载结束以后第一个进程是执行init,init会解析init.rc文件,并起相应的服务。

由此可以知道正常开机和进入recovery模式起的进程是不同的。

感悟

        recovery这个块是自己在调试低分辨率屏幕时,kernel阶段正常显示,但是recovery界面灭有显示而排查的,后面发现主要是由于lk阶段的panel_xxxx_video.h文件初始化的command有关,但是recovery的fronts中的字符库分辨率大小确实影响了显示recovery.img的背景显示。

        另外在排查问题的过程中阅读别人的博客学习,但是很容易就忘记,所以就把优质博客记录下来一方面方便自己查阅,另一方面也是帮助大家过滤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

酒店布草管控RFID智能化回收管理

酒店行业作为服务业的重要组成部分,拥有大量的布草资产,如客房被罩、床单、浴巾和毛巾等,为了更好地管理和追踪这些布草的使用情况,提高效率和准确性,酒店多采用RFID技术进行布草智能化回收管理。 RFID电子标签的应用…

【深度学习】LeNet网络架构

文章目录 什么是LeNet代码实现网络架构 什么是LeNet LeNet是一种经典的卷积神经网络,由Yann LeCun等人在1998年提出。它是深度学习中第一个成功应用于手写数字识别的卷积神经网络,并且被认为是现代卷积神经网络的基础。 LeNet模型包含了多个卷积层和池…

JOSEF约瑟 剩余电流继电器PFR-5 PFE-W-20 国产化改造ZLR-G81 ZCT-45

系列型号: PFR-003剩余电流继电器 PFR-03剩余电流继电器 PFR-5剩余电流继电器 PFR-W-105互感器 PFR-W-140互感器 PFR-W-20互感器 PFR-W-210互感器 PFR-W-30互感器 PFR-W-35互感器 PFR-W-70互感器 一、用途 PFR剩余电流继电器(以下简称继电器…

【教学类】小2班学号字帖(A4横版2份)

图片展示: 背景需求: 突然接到通知,明天下午临时去带小2班。 小班刚入园的孩子,能给他们提供什么样的可操作的学具呢? 思来想去,还是让生成一份学号字帖,让幼儿熟悉自己的学号,让我也熟悉幼儿的名字和学…

phpstudy2016 RCE漏洞验证

文章目录 漏洞描述漏洞验证 漏洞描述 PHPStudyRCE(Remote Code Execution),也称为phpstudy_backdoor漏洞,是指PHPStudy软件中存在的一个远程代码执行漏洞。 漏洞验证 打开phpstudy2016,用bp自带的浏览器访问www目录下…

可视化报表设计器的功能内容是什么?

当前,随着社会化发展程度越来越深,传统的表单制作方式已经无法满足需求了,此时,低代码技术平台的出现,可以在一定程度上帮助不同行业的客户实现流程化办公管理,从而实现提质增效的办公效率。 可视化报表设计…

Yolov8小目标检测-添加模块改进-实验记录

简介,本文通过结合了一些先进的算法改进了yolov8小目标检测能力,以下是一些记录。 数据集:足球比赛数据集,里面只有两个类别足球和人。 兄弟姐妹们,如果本文对你有用,点赞收藏一下呗,☺️☺️…

云可观测性:提升云环境中应用程序可靠性

随着云计算的兴起和广泛应用,越来越多的企业将其应用程序和服务迁移到云环境中。在这个高度动态的环境中,确保应用程序的可靠性和可管理性成为了一个迫切的需求。云可观测性作为一种解决方案,针对这一需求提供了有效的方法和工具。本文将介绍…

单臂路由的配置

目录 单臂路由 单臂路由是什么 为什么要用单臂路由 单臂路由的注意事项 单臂路由的原理 单臂路由的优缺点 单臂路由的实验 ensp Cisco H3C 单臂路由是什么 单臂路由是一种特殊的路由器,它的设计目的是实现在一个路由器的一个接口上通过配置子接口&#xf…

森林防火可视化智能监管与风险预警系统解决方案

一、方案背景 森林火灾是世界八大自然灾害之一,具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点,严重危及人民生命财产和森林资源安全,甚至引发生态灾难。有效预防和及时控制森林火灾是保护国家生态建设成果、推进生态…

【实战案例】技术转项目经理容易踩的坑,我都踩了

“带团队容易,带好团队难。” 这是身边一位项目经理近期在团队管理方面的深刻感悟。目前,他手上的一个项目被迫暂停了,项目团队也散了。下面给大家简要分享下这个项目案例。 【案例分享】 小李负责的是一个二次开发的项目,所涉及…

新型智慧公厕“1+3+N”架构,平台、系统、应用的创新

近年来,随着人民生活水平的提高,人们对公共设施的要求也越来越高。其中,如厕问题一直是人们关注的焦点,但传统的公厕设施已经不能满足人们对干净、舒适、安全的需求,这促使了新型智慧公厕的诞生与应用,以如…

Puppeter与Electron的结合,使用Electron创建可视化界面

前言 上一篇文章:Puppeteer基础入门、常见应用、利用谷歌插件编写Puppeteer脚本,简单介绍了Puppeteer的基本使用,以及如何编写一个脚本。 但是呢脚本的运行需要在node环境里,开发人员可能没什么问题。但是如果你写的这个脚本要给…

Aspose转pdf乱码问题

一、问题描述 ​ 在centos服务器使用aspose.word转换word文件为pdf的时候显示中文乱码(如图),但是在win服务器上使用可以正常转换 二、问题原因 由于linux服务器缺少对应的字库导致文件转换出现乱码的 三、解决方式 1.将window中字体(c:\windows\fonts)放到linux…

软件过程能力成熟度评估——CSMM认证

CSMM认证又称为“软件过程能力过程成熟度评估”,由中国电子技术标准化研究院联合五十余家产学研用相关方结合我国实际,自主制定的团体标准,于2021年6月8号发布,目的是为了帮助国内软件企业对自身的软件能力进行评估和判断&#xf…

Redis实战(10)-一条命令在Redis是如何执行的?

Redis Server一旦和某客户端建立连接,就会在事件驱动框架中注册可读事件,对应客户端的命令请求。 整个命令处理过程可分阶段: 命令解析,processInputBufferAndReplicate命令执行,processCommand结果返回,…

APEX:开启Android系统新篇章的应用扁平化技术

APEX:开启Android系统新篇章的应用扁平化技术 Android Pony Express (APEX) 是在 Android Q 中引入的一种容器格式,用于安装流程中较低级系统模块的更新。该格式方便了系统组件的更新,这些组件不适合标准的 Android 应用程序模型。一些示例组…

计算机系大学生,可以通过Java做什么副业?这篇文章给你答案!

文章目录 前言发现副业机会提高效率面向人群 如何开启自己的副业价格优势需要课设的人多吗怎么宣传生成器的使用 生成器介绍安装功能介绍文档查询功能生成的JavaWeb系统示例生成的C#生成的Javaswing生成的VueER图 、UML、功能图..生成的C、C系统 前言 计算机系科班出身的学生&a…

轻量服务器2核与1核的区别

​ 1.核心数量 轻量服务器2核与1核最明显的区别在于核心数量。1核服务器只有一个处理器核心,而2核服务器有两个处理器核心。这使得2核服务器在处理数据时能够同时执行更多的任务。 2.并行处理能力 由于只有1个核心,1核服务器不具备并行处理任务的能力。而…

天津专升本文化课考试计算机应用基础考试大纲(2023年9月修订)

天津市高等院校“高职升本科”招生统一考试计算机应用基础考试大纲(2023年9月修订) 一、考试性质 天津市高等院校“高职升本科”招生统一考试是由合格的高职高专毕业生参加的选拔性 考试。高等院校根据考生的成绩,按照已确定的招生计划&am…