main 函数
从main入口函数分析recovery的主要源码:
输出重定向
|
|
这部分代码很容易理解,主要作用是输出log到/tem/recovery.log文件中
执行adb sideload分支
|
|
判断命令行参数是否为–adbd,并执行adb_main函数,这部分代码在后续adb_install.cpp中分析;
填充fstab结构体
在main函数中调用 load_volume_table(),读取/etc/recovery.emmc.fstab文件内容,并填充fstab结构体,但是并没有执行挂载操作:
load_volume_table函数在roots.cpp文件中,也是很容易理解:
读取控制参数
recovery 和 bootloader 必须通过内存的一个特定分区,才能进行相互的通信,这个分区一般是/misc;
对应的信息数据结构体为bootloader_message;
参照源码中bootloader_message 的注释
|
|
recovery 根据命令行参数,再从/misc分区中解析出对应的参数,进行后续的操作,具体的调用函数为get_args(&argc, &argv);
|
|
解析命令行参数
|
|
这部分代码很简单,就是通过getopt_long进行命令行参数的解析并赋值;
显示界面和功能选项
接下来就是创建device,显示对应UI界面和功能选项;
|
|
进行分区挂载操作
ensure_path_mounted
界面定制
实现Recovery UI
在自己的设备目录下:device/vendor/recovery/recovery_ui.cpp
|
|
实现头部显示和列表项
|
|
实现ScreenRecoveryUI
|
|
实现设备类
|
|
添加编译实现
主要是覆盖TARGET_RECOVERY_UI_LIB,输出到/out/…./recovery/root目录下:
Android.mk
recovery 二次开发
代码结构:
bootable/recovery
Recovery主程序代码,其中recovery.cpp是入口,rkimage.cpp处理update.img升级流程,updater/install.c处理ota update.zip包升级流程。build/tools/releasetools/
Ota升级包编译的python脚本,控制完整包与差异包的生成。build/tools/drmsigntool/
如果开启drm,生成ota包时对boot.img进行签名,使用build/target/product/security/private.key,
保证进行ota升级后drm功能还能正常使用。build/tools/mkparameter/
编译ota包时打包可升级的parameter的工具。build/tools/remkloader/
编译ota包时打包可升级的loader的工具。build/target/product/security/
编译ota包时签名使用的密钥device/rockchip/rksdk/recovery/
Recovery菜单及按键定制device/rockchip/rksdk/loader/
将需要升级的loader放在该目录下,可以打包到ota升级包中。device/rockchip/rksdk/parameter/
将需要升级的parameter放在该目录下,可以打包到ota升级包中。out/target/product/rk3188/obj/PACKAGING/target_files_intermediates/
Ota升级包编译生成的素材包,要做差异包必须保存该素材包。
板级配置
Recovery 一些宏配置开关在device/rockchip/rk30sdk/BoardConfig.mk
BOARD_HAS_FLIPPED_SCREEN := true
针对lcd装反的情况可以强制recovery ui旋转180°
TARGET_RECOVERY_UI_LIB ?= librecovery_ui_rk30sdk
自定义recovery菜单与按键实现。
TARGET_USERIMAGES_USE_EXT4 ?= true
Recovery支持ext4 文件系统
RECOVERY_UPDATEIMG_RSA_CHECK ?= false
Update.img在升级时进行drm签名校验,防止第三方非法固件升级。Update.img必须使用secureboot工具签名,并勾选sign check复选框。
RECOVERY_BOARD_ID ?= false
一种根据烧录Boardid 串号实现一种固件支持不同硬件不同国家定制的one image方案,该方案支持google 的ota 完整升级和差异升级。
脚本文件命令以及解析
升级脚本文件解析,
try_update_binary
主要命令有