在Android端的几个中的重要组件可以参考下图,可以看到大部分的核心逻辑都是在update_engine中完成的。
update_engine的代码源自Chrome,Google在其基础上对Android进行了适配。
Framework中的UpdateEngine提供了供APK来作AB升级的接口。
从UpdateEngine的注释可看到,要使用这个接口的最小流程如下,创建UpdateEngine实例,通过调用bind绑定callback,通过调用applyPayload进行升级
* The minimal flow is:
* <ol>
* <li>Create a new UpdateEngine instance.
* <li>Call {@link #bind}, optionally providing callbacks.
* <li>Call {@link #applyPayload}.
* </ol>
*
接口的使用方式可以参考Google提供的Sample Code,位于bootable/recovery/updater_sample/。
Native相关的主要有两个部分,一个是update_engine,另一个是fs_mgr文件夹下面的代码。
update_engine承接Framework接口Binder调用,作为Native的服务端实现具体的升级业务逻辑。
BinderUpdateEngineAndroidService: 负责与Framework的UpdateEngine对接,真正的实现其实在UpdateAttempterAndroid。这个类所谓AB升级的发动引擎,负责将update_engine中的大部分类都串联起来。
ActionProcessor: update_engine中定义了许多Action,通过管道方式相连,存储在ActionProcessor定义的队列里面,顺序执行。
download_action
: 下载模块, 负责边下边升级.filesystem_verifier_action
: 文件系统校验模块, 负责升级完成后校验数据的完整性postinstall_runner_action
: 后升级模块, 一些脚本或可执行程序在系统升级完成后执行.HardwareAndroid : 用来获取一些Android系统相关的信息,比如是否是正常启动,是不是User软件等。
DynamicPartitionControlAndroid: 负责动态分区相关配置,通过调用fs_mgr中相关的模块实现。
管理misc分区,它是作为AB升级meta信息的持久化分区,这个分区在MTK平台定义为para,可以通过如下方式查看
adb shell cat /vendor/etc/fstab.mt8766 | grep misc
/dev/block/platform/bootdevice/by-name/para /misc emmc defaults defaults
在下面的地方定义与misc关联
vendor/mediatek/proprietary/hardware/fstab/mt6761/fstab.in.emmc
FSTAB_RAW2(para,misc)
分区的定义如下
boot_control_definition.h
/* Bootloader Control AB
*
* This struct can be used to manage A/B metadata. It is designed to
* be put in the 'slot_suffix' field of the 'bootloader_message'
* structure described above. It is encouraged to use the
* 'bootloader_control' structure to store the A/B metadata, but not
* mandatory.
*/
struct bootloader_control {
// NUL terminated active slot suffix.
char slot_suffix[4];
// Bootloader Control AB magic number (see BOOT_CTRL_MAGIC).
uint32_t magic;
// Version of struct being used (see BOOT_CTRL_VERSION).
uint8_t version;
// Number of slots being managed.
uint8_t nb_slot : 3;
// Number of times left attempting to boot recovery.
uint8_t recovery_tries_remaining : 3;
// Status of any pending snapshot merge of dynamic partitions.
uint8_t merge_status : 3;
// Ensure 4-bytes alignment for slot_info field.
uint8_t reserved0[1];
// Per-slot information. Up to 4 slots.
struct slot_metadata slot_info[4];
// Reserved for further use.
uint8_t reserved1[8];
// CRC32 of all 28 bytes preceding this field (little endian
// format).
uint32_t crc32_le;
} __attribute__((packed));
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。