二、A/B 升级update_engine分析-整体模块

本文详细剖析了AB Update机制下的update_engine模块,包括其编译流程、关键组件及依赖关系,重点介绍了update_engine_client和update_engine服务端进程,为理解Android系统级OTA升级提供了深入视角。

    调试通了AB后确实想好好整理下这部分,其实与传统ota对比,我个人这样划分1、bootloder部分 2、kernel部分 3、framwork部分 4、update_engine核心 5、升级包的制作,而其中的大部分工作都来源于核心update_engine,在这里卡了很久,决定先从这里入手,按照framwork---->(binder机制)update_engine流程(设定对应的值给到boot_control)---->bootloder--->kernel---->ramdisk--->Android这样分析,本次先着重分析update_engine模块,我个人觉得对于目前分析问题,思路对于工作越来越重要,工作中问题形形色色,千奇百怪,有一套自己的方法处理起来才能得心应手。

    system/update_engine/的代码量比较多,首先我们先从Android.mk分析,这都是比较好的习惯,例如我们分析可执行文件和py文件从main方法入手一样,Android.mk代码比较多,先分割模块

总体模块

一、控制变量设定

二、编译参数设定和依赖定义

三、update_metadata-protos模块编译

四、libpayload_consumer模块编译

五、libupdate_engine_boot_control模块编译

六、libupdate_engine模块编译

七、libupdate_engine_android模块编译

八、update_engine模块编译

九、update_engine_sideload模块编译

十、update_engine_client模块编译

十一、libpayload_generator模块编译

十二、delta_generator模块编译

十三、Private and public keys for unittests.

十四、Sample images for unittests.

十五、update_engine.conf

十六、test_http_server

十七、test_subprocess

十八、update_engine_unittests

十九、Update payload signing public key.

二十、Brillo update payload generation script

 

看起来是挺多的,20个需要分析的,不过里面有部分并不会用到,下面我们开始挖坑分析

 

一、控制变量设定

 

# Default values for the USE flags. Override these USE flags from your product
# by setting BRILLO_USE_* values. Note that we define local variables like
# local_use_* to prevent leaking our default setting for other packages.
#USE标志的默认值。 覆盖产品中的这些USE标志
#通过设置BRILLO_USE_ *值。 请注意,我们定义了局部变量,例如
#local_use_ *以防止泄漏其他软件包的默认设置
local_use_binder := $(if $(BRILLO_USE_BINDER),$(BRILLO_USE_BINDER),1)
local_use_hwid_override := \
    $(if $(BRILLO_USE_HWID_OVERRIDE),$(BRILLO_USE_HWID_OVERRIDE),0)
local_use_mtd := $(if $(BRILLO_USE_MTD),$(BRILLO_USE_MTD),0)
local_use_chrome_network_proxy := 0
local_use_chrome_kiosk_app := 0

# IoT devices use Omaha for updates.
local_use_omaha := $(if $(filter true,$(PRODUCT_IOT)),1,0)
    
#log for local_use_*  这里是我加的打印,变量不清楚就打印出来看
#system/update_engine/Android.mk:35: warning: "local_use_binder = 1"
#system/update_engine/Android.mk:36: warning: "local_use_hwid_override = 0"
#system/update_engine/Android.mk:37: warning: "local_use_mtd = 0"
#system/update_engine/Android.mk:38: warning: "local_use_chrome_network_proxy = 0"
#system/update_engine/Android.mk:39: warning: "local_use_chrome_kiosk_app = 0"
#system/update_engine/Android.mk:46: warning: "local_use_omaha = 0"
    
$(warning "local_use_binder = $(local_use_binder)")  
$(warning "local_use_hwid_override = $(local_use_hwid_override)")
$(warning "local_use_mtd = $(local_use_mtd)")
$(warning "local_use_chrome_network_proxy = $(local_use_chrome_network_proxy)")
$(warning "local_use_chrome_kiosk_app = $(local_use_chrome_kiosk_app)")
$(warning "local_use_omaha = $(local_use_omaha)")

这些变量定义好,用于下面各模块的编译控制

local_use_binder = 1

local_use_hwid_override = 0

local_use_mtd = 0

local_use_chrome_network_proxy = 0

local_use_chrome_kiosk_app = 0

local_use_omaha = 0

二、编译参数设定和依赖定义

 

#定义一些编译的规则
ue_common_cflags := \
    -DUSE_BINDER=$(local_use_binder) \
    -DUSE_CHROME_NETWORK_PROXY=$(local_use_chrome_network_proxy) \
    -DUSE_CHROME_KIOSK_APP=$(local_use_chrome_kiosk_app) \
    -DUSE_HWID_OVERRIDE=$(local_use_hwid_override) \
    -DUSE_MTD=$(local_use_mtd) \
    -DUSE_OMAHA=$(local_use_omaha) \
    -D_FILE_OFFSET_BITS=64 \
    -D_POSIX_C_SOURCE=199309L \
    -Wa,--noexecstack \
    -Wall \
    -Werror \
    -Wextra \
    -Wformat=2 \
    -Wno-psabi \
    -Wno-unused-parameter \
    -ffunction-sections \
    -fstack-protector-strong \
    -fvisibility=hidden
ue_common_cppflags := \
    -Wnon-virtual-dtor \
    -fno-strict-aliasing
ue_common_ldflags := \
    -Wl,--gc-sections
#定义依赖
#c文件依赖
ue_common_c_includes := \
    $(LOCAL_PATH)/client_library/include \
    system
#动态库依赖
ue_common_shared_libraries := \
    libbrillo-stream \
    libbrillo \
    libchrome
#静态库依赖
ue_common_static_libraries := \
    libgtest_prod \

三、update_metadata-protos模块编译

# update_metadata-protos (type: static_library)
# ========================================================
# Protobufs.
ue_update_metadata_protos_exported_static_libraries := \
    update_metadata-protos
ue_update_metadata_protos_exported_shared_libraries := \
    libprotobuf-cpp-lite

ue_update_metadata_protos_src_files := \
    update_metadata.proto

# Build for the host.编译host静态库
include $(CLEAR_VARS)
LOCAL_MODULE := update_metadata-protos
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_IS_HOST_MODULE := true
generated_sources_dir := $(call local-generated-sources-dir)
LOCAL_EXPORT_C_INCLUDE_DIRS := $(generated_sources_dir)/proto/system
LOCAL_SRC_FILES := $(ue_update_metadata_protos_src_files)
LOCAL_CFLAGS := -Wall -Werror
include $(BUILD_HOST_STATIC_LIBRARY)

# Build for the target.编译target静态库
include $(CLEAR_VARS)
LOCAL_MODULE := update_metadata-protos
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
generated_sources_dir := $(call local-generated-sources-dir)
LOCAL_EXPORT_C_INCLUDE_DIRS := $(generated_sources_dir)/proto/system
LOCAL_SRC_FILES := $(ue_update_metadata_protos_src_files)
LOCAL_CFLAGS := -Wall -Werror
include $(BUILD_STATIC_LIBRARY)

定义静态库update_metadata-protos,分别指向host和target环境

protobuf是google团队开发的用于高效存储和读取结构化数据的工具。什么是结构化数据呢,正如字面上表达的,就是带有一定结构的数据。比如电话簿上有很多记录数据,每条记录包含姓名、ID、邮件、电话等,这种结构重复出现。

xml、json也可以用来存储此类结构化数据,但是使用protobuf表示的数据能更加高效,并且将数据压缩得更小,大约是json格式的1/10,xml格式的1/20。

四、libpayload_consumer模块编译

# libpayload_consumer (type: static_library)
# ========================================================
# The payload application component and common dependencies.
# payload应用程序组件和通用依赖项。
ue_libpayload_consumer_exported_static_libraries := \
    #包含了update_metadata-protos 所以先编译update_metadata-protos静态库,再编译libpayload_consumer
    update_metadata-protos \
    libxz \
    libbz \
    libbspatch \
    libbrotli \
    libpuffpatch \
    $(ue_update_metadata_protos_exported_static_libraries)
ue_libpayload_consumer_exported_shared_libraries := \
    libcrypto \
    $(ue_update_metadata_protos_exported_shared_libraries)

ue_libpayload_consumer_src_files := \
    common/action_processor.cc \
    common/boot_control_stub.cc \
    common/clock.cc \
    common/constants.cc \
    common/cpu_limiter.cc \
    common/error_code_utils.cc \
    common/file_fetcher.cc \
    common/hash_calculator.cc \
    common/http_common.cc \
    common/http_fetcher.cc \
    common/hwid_override.cc \
    common/multi_range_http_fetcher.cc \
    common/platform_constants_android.cc \
    common/prefs.cc \
    common/subprocess.cc \
    common/terminator.cc \
    common/utils.cc \
    payload_consumer/bzip_extent_writer.cc \
    payload_consumer/cached_file_descriptor.cc \
    payload_consumer/delta_performer.cc \
    payload_consumer/download_action.cc \
    payload_consumer/extent_reader.cc \
    payload_consumer/extent_writer.cc \
    payload_consumer/file_descriptor.cc \
    payload_consumer/file_descriptor_utils.cc \
    payload_consumer/file_writer.cc \
    payload_consumer/filesystem_verifier_action.cc \
    payload_consumer/install_plan.cc \
    payload_consumer/mount_history.cc \
    payload_consumer/payload_constants.cc \
    payload_consumer/payload_metadata.cc \
    payload_consumer/payload_verifier.cc \
    payload_consumer/postinstall_runner_action.cc \
    payload_consumer/xz_extent_writer.cc

ifeq ($(HOST_OS),linux)
# Build for the host.
include $(CLEAR_VARS)
LOCAL_MODULE := libpayload_consumer
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_CPP_EXTENSION := .cc
LOCAL_CFLAGS := $(ue_common_cflags)
LOCAL_CPPFLAGS := $(ue_common_cppflags)
LOCAL_LDFLAGS := $(ue_common_ldflags)
LOCAL_C_INCLUDES := \
    $(ue_common_c_includes)
LOCAL_STATIC_LIBRARIES := \
    update_metadata-protos \
    $(ue_common_static_libraries) \
    $(ue_libpayload_consumer_exported_static_libraries) \
    $(ue_update_metadata_protos_exported_static_libraries)
LOCAL_SHARED_LIBRARIES := \
    $(ue_common_shared_libraries) \
    $(ue_libpayload_consumer_exported_shared_libraries) \
    $(ue_update_metadata_protos_exported_shared_libraries)
LOCAL_SRC_FILES := $(ue_libpayload_consumer_src_files)
include $(BUILD_HOST_STATIC_LIBRARY)
endif  # HOST_OS == lin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值