Android Recovery 源码解析和界面定制

本文详细解析了Android Recovery的源码,包括主要功能、源码路径、命令行参数、main函数以及界面定制。重点介绍了如何实现Recovery UI、设备类以及如何在设备目录下添加编译实现。
摘要由CSDN通过智能技术生成

Android Recovery 源码解析和界面定制
Recovery主要功能
源码路径和主要原文件
recoverycpp
命令行参数
main 函数
界面定制
实现Recovery UI
实现头部显示和列表项
实现ScreenRecoveryUI
实现设备类
添加编译实现
Android Recovery 源码解析和界面定制
Recovery主要功能
深入了解recovery源码前,先浏览下recovery能够给我们提供哪些功能;

首先是我们熟悉的恢复工厂设置 –> wipe_data wipe_cache
刷升级包,可以通过sdcard升级,通常说的卡刷,有些还提供ADB sideload升级;
可以进行系统的系统的OTA升级,本质上同手动刷包一样;
源码路径和主要原文件
在Android源码环境中,recovery的源码主要在bootable/recovery文件下,另外再device目录下,会根据各个设备定制自己的接口以及UI界面,也就是文章后半部分分析的界面定制的内容;

在bootable/recovery目录下,主要的源文件有:

LOCAL_SRC_FILES :=
adb_install.cpp
asn1_decoder.cpp
bootloader.cpp
device.cpp
fuse_sdcard_provider.c
install.cpp
recovery.cpp
roots.cpp
screen_ui.cpp
ui.cpp
verifier.cpp \

该部分代码在编译后,会统一输出到 out/recovery/root/目录;

recovery.cpp
命令行参数
recovery最后是编译成一个可执行的命令,放在recovery文件系统中的/sbin/recovery;所以我们可以在终端中直接运行该命令,具体的参数如下:

–send_intent=anystring - 传递给recovery的信息
–adbd -adb sideload升级
–update_package=path - 指定OTA升级包
–wipe_data - 清楚用户数据并重启
–wipe_cache - 清楚缓存并重启
–set_encrypted_filesystem=on|off - 使能或者关闭文件系统加密
–just_exit - 退出并重启

main 函数
从main入口函数分析recovery的主要源码:

输出重定向

redirect_stdio(TEMPORARY_LOG_FILE);
//redirect log to serial output

#ifdef LogToSerial
freopen(“/dev/ttyFIQ0”, “a”, stdout); setbuf(stdout, NULL);
freopen(“/dev/ttyFIQ0”, “a”, stderr); setbuf(stderr, NULL);
#endif

这部分代码很容易理解,主要作用是输出log到/tem/recovery.log文件中

执行adb sideload分支

if (argc == 2 && strcmp(argv[1], "--adbd") == 0) {
    adb_main(0, DEFAULT_ADB_PORT);
    return 0;
}

判断命令行参数是否为–adbd,并执行adb_main函数,这部分代码在后续adb_install.cpp中分析;

填充fstab结构体

在main函数中调用 load_volume_table(),读取/etc/recovery.emmc.fstab文件内容,并填充fstab结构体,但是并没有执行挂载操作:
load_volume_table函数在roots.cpp文件中,也是很容易理解:

void load_volume_table()
{

int emmcState = getEmmcState();//判断是否为emmc设备
if(emmcState) {
fstab = fs_mgr_read_fstab(“/etc/recovery.emmc.fstab”);
}else {
fstab = fs_mgr_read_fstab(“/etc/recovery.fstab”);
}

//读取文件中每个条目内容,填充fstab结构体
ret = fs_mgr_add_entry(fstab, “/tmp”, “ramdisk”, “ramdisk”);

//日志打印fstable信息
printf(“recovery filesystem table\n”);
printf(“======================

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

android framework

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值