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(“======================