前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AB升级(4):AB升级中的重要的组件

AB升级(4):AB升级中的重要的组件

原创
作者头像
小胡子
修改2022-05-28 20:00:15
1.2K0
修改2022-05-28 20:00:15
举报
文章被收录于专栏:小胡子专栏小胡子专栏

Overview

在Android端的几个中的重要组件可以参考下图,可以看到大部分的核心逻辑都是在update_engine中完成的。

update_engine的代码源自Chrome,Google在其基础上对Android进行了适配。

AB升级中的重要的组件.png
AB升级中的重要的组件.png

Framework

Framework中的UpdateEngine提供了供APK来作AB升级的接口。

从UpdateEngine的注释可看到,要使用这个接口的最小流程如下,创建UpdateEngine实例,通过调用bind绑定callback,通过调用applyPayload进行升级

代码语言:txt
复制
 * 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

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中相关的模块实现。

HAL

管理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关联

代码语言:txt
复制
vendor/mediatek/proprietary/hardware/fstab/mt6761/fstab.in.emmc
FSTAB_RAW2(para,misc)

分区的定义如下

代码语言:c
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Overview
  • Framework
  • Native
  • HAL
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档