调试通了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 == linux
# Build for the target.
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:-host=) \
$(ue_update_metadata_protos_exported_static_libraries)
LOCAL_SHARED_LIBRARIES := \
$(ue_common_shared_libraries) \
$(ue_libpayload_consumer_exported_shared_libraries:-host=) \
$(ue_update_metadata_protos_exported_shared_libraries)
LOCAL_SRC_FILES := $(ue_libpayload_consumer_src_files)
include $(BUILD_STATIC_LIBRARY)
定义静态库libpayload_consumer,分别指向host和target环境
五、libupdate_engine_boot_control模块编译
# libupdate_engine_boot_control (type: static_library)
# ========================================================
# A BootControl class implementation using Android's HIDL boot_control HAL.
# 使用Android的HIDL boot_control HAL的BootControl类实现。
ue_libupdate_engine_boot_control_exported_static_libraries := \
update_metadata-protos \
$(ue_update_metadata_protos_exported_static_libraries)
ue_libupdate_engine_boot_control_exported_shared_libraries := \
libhwbinder \
libhidlbase \
libutils \
android.hardware.boot@1.0 \
$(ue_update_metadata_protos_exported_shared_libraries)
include $(CLEAR_VARS)
LOCAL_MODULE := libupdate_engine_boot_control
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) \
bootable/recovery
LOCAL_STATIC_LIBRARIES := \
$(ue_common_static_libraries) \
$(ue_libupdate_engine_boot_control_exported_static_libraries)
LOCAL_SHARED_LIBRARIES := \
$(ue_common_shared_libraries) \
$(ue_libupdate_engine_boot_control_exported_shared_libraries)
LOCAL_SRC_FILES := \
boot_control_android.cc
include $(BUILD_STATIC_LIBRARY)
编译libupdate_engine_boot_control静态库,实现了hardware HAL 层定义的boot_control相关的接口,升级执行完需要设定slot a 和slot b两套系统的一些参数,判定如何启动
六、libupdate_engine模块编译
#根据我们之前local_use_omaha = 0 不会再编译libupdate_engine静态库 #而是编译libupdate_engine_android模块 ifeq ($(local_use_omaha),1) 编译libupdate_engine静态库 # libupdate_engine (type: static_library) 编译libupdate_engine_androi静态库 endif # local_use_omaha == 1
七、libupdate_engine_android模块编译
# libupdate_engine_android (type: static_library)
# ========================================================
# The main daemon static_library used in Android (non-Brillo). This only has a
# loop to apply payloads provided by the upper layer via a Binder interface.
ue_libupdate_engine_android_exported_static_libraries := \
libpayload_consumer \
libfs_mgr \
libbase \
liblog \
$(ue_libpayload_consumer_exported_static_libraries) \
libupdate_engine_boot_control \
$(ue_libupdate_engine_boot_control_exported_static_libraries)
ue_libupdate_engine_android_exported_shared_libraries := \
$(ue_libpayload_consumer_exported_shared_libraries) \
$(ue_libupdate_engine_boot_control_exported_shared_libraries) \
libandroid_net \
libbinder \
libbinderwrapper \
libbrillo-binder \
libcutils \
libcurl \
libmetricslogger \
libssl \
libutils
include $(CLEAR_VARS)
LOCAL_MODULE := libupdate_engine_android
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) \
bootable/recovery
#TODO(deymo): Remove external/cros/system_api/dbus once the strings are moved
# out of the DBus interface.
LOCAL_C_INCLUDES += \
external/cros/system_api/dbus
LOCAL_STATIC_LIBRARIES := \
$(ue_common_static_libraries) \
$(ue_libupdate_engine_android_exported_static_libraries:-host=)
LOCAL_SHARED_LIBRARIES += \
$(ue_common_shared_libraries) \
$(ue_libupdate_engine_android_exported_shared_libraries:-host=)
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/binder_bindings
LOCAL_SRC_FILES += \
binder_bindings/android/os/IUpdateEngine.aidl \
binder_bindings/android/os/IUpdateEngineCallback.aidl \
binder_service_android.cc \
certificate_checker.cc \
daemon.cc \
daemon_state_android.cc \
hardware_android.cc \
libcurl_http_fetcher.cc \
metrics_reporter_android.cc \
metrics_utils.cc \
network_selector_android.cc \
proxy_resolver.cc \
update_attempter_android.cc \
update_status_utils.cc \
utils_android.cc
include $(BUILD_STATIC_LIBRARY)
编译libupdate_engine_android静态库
八、update_engine模块编译
# update_engine (type: executable)
# ========================================================
# update_engine daemon. update_engine守护程序
include $(CLEAR_VARS)
LOCAL_MODULE := update_engine
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_REQUIRED_MODULES := \
cacerts_google
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_SHARED_LIBRARIES := \
$(ue_common_shared_libraries)
LOCAL_STATIC_LIBRARIES := \
$(ue_common_static_libraries)
LOCAL_SRC_FILES := \
main.cc
#根据local_use_omaha判断所需的静态库依赖
ifeq ($(local_use_omaha),1)
LOCAL_C_INCLUDES += \
$(ue_libupdate_engine_exported_c_includes)
LOCAL_STATIC_LIBRARIES += \
libupdate_engine \
$(ue_libupdate_engine_exported_static_libraries:-host=)
LOCAL_SHARED_LIBRARIES += \
$(ue_libupdate_engine_exported_shared_libraries:-host=)
else # local_use_omaha == 1
#依赖libupdate_engine_android
LOCAL_STATIC_LIBRARIES += \
libupdate_engine_android \
$(ue_libupdate_engine_android_exported_static_libraries:-host=)
LOCAL_SHARED_LIBRARIES += \
$(ue_libupdate_engine_android_exported_shared_libraries:-host=)
endif # local_use_omaha == 1
LOCAL_INIT_RC := update_engine.rc
include $(BUILD_EXECUTABLE)
编译可执行文件update_engine,所需静态库依赖是libupdate_engine_android
九、update_engine_sideload模块编译
# update_engine_sideload (type: executable)
# ========================================================
# A static binary equivalent to update_engine daemon that installs an update
# from a local file directly instead of running in the background.
#一个等同于update_engine守护程序的静态二进制文件,用于安装更新
#直接从本地文件而不是在后台运行。
include $(CLEAR_VARS)
LOCAL_MODULE := update_engine_sideload
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_CPP_EXTENSION := .cc
LOCAL_CFLAGS := \
$(ue_common_cflags) \
-D_UE_SIDELOAD
LOCAL_CPPFLAGS := $(ue_common_cppflags)
LOCAL_LDFLAGS := $(ue_common_ldflags)
LOCAL_C_INCLUDES := \
$(ue_common_c_includes) \
bootable/recovery
#TODO(deymo): Remove external/cros/system_api/dbus once the strings are moved
# out of the DBus interface.
LOCAL_C_INCLUDES += \
external/cros/system_api/dbus
LOCAL_SRC_FILES := \
boot_control_recovery.cc \
hardware_android.cc \
metrics_reporter_stub.cc \
metrics_utils.cc \
network_selector_stub.cc \
proxy_resolver.cc \
sideload_main.cc \
update_attempter_android.cc \
update_status_utils.cc \
utils_android.cc
LOCAL_STATIC_LIBRARIES := \
libfs_mgr \
libbase \
liblog \
#静态库依赖libpayload_consumer
libpayload_consumer \
update_metadata-protos \
$(ue_common_static_libraries) \
$(ue_libpayload_consumer_exported_static_libraries:-host=) \
$(ue_update_metadata_protos_exported_static_libraries)
# We add the static versions of the shared libraries since we are forcing this
# binary to be a static binary, so we also need to include all the static
# library dependencies of these static libraries.
LOCAL_STATIC_LIBRARIES += \
$(ue_common_shared_libraries) \
libbase \
liblog \
$(ue_libpayload_consumer_exported_shared_libraries:-host=) \
$(ue_update_metadata_protos_exported_shared_libraries) \
libevent \
libmodpb64 \
libgtest_prod
#判断PRODUCT_STATIC_BOOT_CONTROL_HAL是否为空
ifeq ($(strip $(PRODUCT_STATIC_BOOT_CONTROL_HAL)),)
# No static boot_control HAL defined, so no sideload support. We use a fake
# boot_control HAL to allow compiling update_engine_sideload for test purposes.
ifeq ($(strip $(AB_OTA_UPDATER)),true)
#如果PRODUCT_STATIC_BOOT_CONTROL_HAL为空而AB_OTA_UPDATER不为空,会在编译报出warning,因为
两个宏控不同步,所以不支持update sideload
$(warning No PRODUCT_STATIC_BOOT_CONTROL_HAL configured but AB_OTA_UPDATER is \
true, no update sideload support.)
endif # AB_OTA_UPDATER == true
LOCAL_SRC_FILES += \
boot_control_recovery_stub.cc
else # PRODUCT_STATIC_BOOT_CONTROL_HAL != ""
#如果PRODUCT_STATIC_BOOT_CONTROL_HAL不为空,指定静态库依赖PRODUCT_STATIC_BOOT_CONTROL_HAL
LOCAL_STATIC_LIBRARIES += \
$(PRODUCT_STATIC_BOOT_CONTROL_HAL)
endif # PRODUCT_STATIC_BOOT_CONTROL_HAL != ""
include $(BUILD_EXECUTABLE)
编译update_engine_sideload可执行程序,根据这个名字显然是跟之前recvoery下的本地升级类似
LOCAL_MODULE := update_engine_sideload
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
定义编译可执行程序的名称为update_engine_sideload,位置在recovery/sbin,因为recovery下面使用不到update_engine守护进程,所以这里定义了一个类似的update_engine_sideload,同时该可执行程序需要依赖静态库PRODUCT_STATIC_BOOT_CONTROL_HAL
开启AB升级后,该宏控是有值的device/mediatek/common/device.mk:3681:PRODUCT_STATIC_BOOT_CONTROL_HAL := bootctrl.$(MTK_PLATFORM_DIR)
十、libupdate_engine_client模块编译
libupdate_engine_client (type: shared_library)
# ========================================================
include $(CLEAR_VARS)
LOCAL_MODULE := libupdate_engine_client
LOCAL_CFLAGS := \
-Wall \
-Werror \
-Wno-unused-parameter \
-DUSE_BINDER=$(local_use_binder)
LOCAL_CPP_EXTENSION := .cc
# TODO(deymo): Remove "external/cros/system_api/dbus" when dbus is not used.
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/client_library/include \
external/cros/system_api/dbus \
system
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/client_library/include
LOCAL_SHARED_LIBRARIES := \
libchrome \
libbrillo
LOCAL_SRC_FILES := \
client_library/client.cc \
update_status_utils.cc
# We only support binder IPC mechanism in Android.
ifeq ($(local_use_binder),1)
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/binder_bindings
LOCAL_SHARED_LIBRARIES += \
libbinder \
libbrillo-binder \
libutils
LOCAL_SRC_FILES += \
binder_bindings/android/brillo/IUpdateEngine.aidl \
binder_bindings/android/brillo/IUpdateEngineStatusCallback.aidl \
client_library/client_binder.cc \
parcelable_update_engine_status.cc
endif # local_use_binder == 1
include $(BUILD_SHARED_LIBRARY)
编译libupdate_engine_client共享库
十一、update_engine_client模块编译
# update_engine_client (type: executable)
# ========================================================
# update_engine console client. update_engine控制台客户端
include $(CLEAR_VARS)
LOCAL_MODULE := update_engine_client
LOCAL_MODULE_CLASS := EXECUTABLES
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_SHARED_LIBRARIES := $(ue_common_shared_libraries)
LOCAL_STATIC_LIBRARIES := $(ue_common_static_libraries)
ifeq ($(local_use_omaha),1)
LOCAL_SHARED_LIBRARIES += \
libupdate_engine_client
LOCAL_SRC_FILES := \
update_engine_client.cc \
common/error_code_utils.cc \
omaha_utils.cc
else # local_use_omaha == 1
#TODO(deymo): Remove external/cros/system_api/dbus once the strings are moved
# out of the DBus interface.我们关注的代码
LOCAL_C_INCLUDES += \
external/cros/system_api/dbus
LOCAL_SHARED_LIBRARIES += \
libbinder \
libbinderwrapper \
libbrillo-binder \
libutils
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/binder_bindings
LOCAL_SRC_FILES := \
binder_bindings/android/os/IUpdateEngine.aidl \
binder_bindings/android/os/IUpdateEngineCallback.aidl \
common/error_code_utils.cc \
update_engine_client_android.cc \
update_status_utils.cc
endif # local_use_omaha == 1
include $(BUILD_EXECUTABLE)
编译update_engine_client可执行文件,这个在ab中其实是用于测试的,开启后可以在adblog中输出升级的log,
这里其实有个疑问,编译了libupdate_engine_client,但是实际只有iot会用到这个共享库,普通Android并没有依赖这个共享库,所以为什么不在libupdate_engine_client编译的时候也加入local_use_omaha的控制开关呢
十二、libpayload_generator模块编译
# libpayload_generator (type: static_library)
# ========================================================
# server-side code. This is used for delta_generator and unittests but not
# for any client code.
#服务器端代码。这是用于delta_generator和单元测试,但不对于任何客户端代码。
ue_libpayload_generator_exported_static_libraries := \
libbsdiff \
libdivsufsort \
libdivsufsort64 \
libbrotli \
liblzma \
libpayload_consumer \
libpuffdiff \
libz \
update_metadata-protos \
$(ue_libpayload_consumer_exported_static_libraries) \
$(ue_update_metadata_protos_exported_static_libraries)
ue_libpayload_generator_exported_shared_libraries := \
libext2fs \
$(ue_libpayload_consumer_exported_shared_libraries) \
$(ue_update_metadata_protos_exported_shared_libraries)
ue_libpayload_generator_src_files := \
payload_generator/ab_generator.cc \
payload_generator/annotated_operation.cc \
payload_generator/blob_file_writer.cc \
payload_generator/block_mapping.cc \
payload_generator/bzip.cc \
payload_generator/cycle_breaker.cc \
payload_generator/deflate_utils.cc \
payload_generator/delta_diff_generator.cc \
payload_generator/delta_diff_utils.cc \
payload_generator/ext2_filesystem.cc \
payload_generator/extent_ranges.cc \
payload_generator/extent_utils.cc \
payload_generator/full_update_generator.cc \
payload_generator/graph_types.cc \
payload_generator/graph_utils.cc \
payload_generator/inplace_generator.cc \
payload_generator/mapfile_filesystem.cc \
payload_generator/payload_file.cc \
payload_generator/payload_generation_config.cc \
payload_generator/payload_signer.cc \
payload_generator/raw_filesystem.cc \
payload_generator/squashfs_filesystem.cc \
payload_generator/tarjan.cc \
payload_generator/topological_sort.cc \
payload_generator/xz_android.cc
ifeq ($(HOST_OS),linux)
# Build for the host.
include $(CLEAR_VARS)
LOCAL_MODULE := libpayload_generator
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 := \
libbsdiff \
libdivsufsort \
libdivsufsort64 \
liblzma \
libpayload_consumer \
libpuffdiff \
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_generator_exported_shared_libraries) \
$(ue_libpayload_consumer_exported_shared_libraries) \
$(ue_update_metadata_protos_exported_shared_libraries)
LOCAL_SRC_FILES := $(ue_libpayload_generator_src_files)
include $(BUILD_HOST_STATIC_LIBRARY)
endif # HOST_OS == linux
# Build for the target.
include $(CLEAR_VARS)
LOCAL_MODULE := libpayload_generator
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 := \
libbsdiff \
libdivsufsort \
libdivsufsort64 \
libpayload_consumer \
update_metadata-protos \
liblzma \
$(ue_common_static_libraries) \
$(ue_libpayload_consumer_exported_static_libraries:-host=) \
$(ue_update_metadata_protos_exported_static_libraries)
LOCAL_SHARED_LIBRARIES := \
$(ue_common_shared_libraries) \
$(ue_libpayload_generator_exported_shared_libraries:-host=) \
$(ue_libpayload_consumer_exported_shared_libraries:-host=) \
$(ue_update_metadata_protos_exported_shared_libraries)
LOCAL_SRC_FILES := $(ue_libpayload_generator_src_files)
include $(BUILD_STATIC_LIBRARY)
编译libpayload_generator静态库,分别用于host和target环境
十三、delta_generator模块编译
# delta_generator (type: executable)
# ========================================================
# server-side delta generator.服务器端增量生成器
ue_delta_generator_src_files := \
payload_generator/generate_delta_main.cc
ifeq ($(HOST_OS),linux)
# Build for the host.
include $(CLEAR_VARS)
LOCAL_MODULE := delta_generator
LOCAL_MODULE_CLASS := EXECUTABLES
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 := \
libpayload_consumer \
libpayload_generator \
$(ue_common_static_libraries) \
$(ue_libpayload_consumer_exported_static_libraries) \
$(ue_libpayload_generator_exported_static_libraries)
LOCAL_SHARED_LIBRARIES := \
$(ue_common_shared_libraries) \
$(ue_libpayload_consumer_exported_shared_libraries) \
$(ue_libpayload_generator_exported_shared_libraries)
LOCAL_SRC_FILES := $(ue_delta_generator_src_files)
include $(BUILD_HOST_EXECUTABLE)
endif # HOST_OS == linux
# Build for the target.
include $(CLEAR_VARS)
LOCAL_MODULE := ue_unittest_delta_generator
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_NATIVE_TESTS)/update_engine_unittests
LOCAL_MODULE_STEM := delta_generator
LOCAL_MODULE_CLASS := EXECUTABLES
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 := \
libpayload_consumer \
libpayload_generator \
$(ue_common_static_libraries) \
$(ue_libpayload_consumer_exported_static_libraries:-host=) \
$(ue_libpayload_generator_exported_static_libraries:-host=)
LOCAL_SHARED_LIBRARIES := \
$(ue_common_shared_libraries) \
$(ue_libpayload_consumer_exported_shared_libraries:-host=) \
$(ue_libpayload_generator_exported_shared_libraries:-host=)
LOCAL_SRC_FILES := $(ue_delta_generator_src_files)
include $(BUILD_EXECUTABLE)
编译delta_generator可执行程序,分别用于host 和 target 环境,这个文件在做ab升级包的时候会用到
十四、Private and public keys for unittests.
# Private and public keys for unittests.
# ========================================================
# Generate a module that installs a prebuilt private key and a module that
# installs a public key generated from the private key.
# 生成安装预建私钥的模块和安装从私钥生成的公钥的模块。
# $(1): The path to the private key in pem format.
define ue-unittest-keys
$(eval include $(CLEAR_VARS)) \
$(eval LOCAL_MODULE := ue_$(1).pem) \
$(eval LOCAL_MODULE_CLASS := ETC) \
$(eval LOCAL_SRC_FILES := $(1).pem) \
$(eval LOCAL_MODULE_PATH := \
$(TARGET_OUT_DATA_NATIVE_TESTS)/update_engine_unittests) \
$(eval LOCAL_MODULE_STEM := $(1).pem) \
$(eval include $(BUILD_PREBUILT)) \
\
$(eval include $(CLEAR_VARS)) \
$(eval LOCAL_MODULE := ue_$(1).pub.pem) \
$(eval LOCAL_MODULE_CLASS := ETC) \
$(eval LOCAL_MODULE_PATH := \
$(TARGET_OUT_DATA_NATIVE_TESTS)/update_engine_unittests) \
$(eval LOCAL_MODULE_STEM := $(1).pub.pem) \
$(eval include $(BUILD_SYSTEM)/base_rules.mk) \
$(eval $(LOCAL_BUILT_MODULE) : $(LOCAL_PATH)/$(1).pem ; \
openssl rsa -in $$< -pubout -out $$@)
endef
$(call ue-unittest-keys,unittest_key)
$(call ue-unittest-keys,unittest_key2)
十五、Sample images for unittests.
# Sample images for unittests.
# ========================================================
# Generate a prebuilt module that installs a sample image from the compressed
# sample_images.tar.bz2 file used by the unittests.
#生成一个预构建模块,该模块从单元测试使用的压缩sample_images.tar.bz2文件中安装示例图像。
# $(1): The filename in the sample_images.tar.bz2
define ue-unittest-sample-image
$(eval include $(CLEAR_VARS)) \
$(eval LOCAL_MODULE := ue_unittest_$(1)) \
$(eval LOCAL_MODULE_CLASS := EXECUTABLES) \
$(eval LOCAL_MODULE_PATH := \
$(TARGET_OUT_DATA_NATIVE_TESTS)/update_engine_unittests/gen) \
$(eval LOCAL_MODULE_STEM := $(1)) \
$(eval include $(BUILD_SYSTEM)/base_rules.mk) \
$(eval $(LOCAL_BUILT_MODULE) : \
$(LOCAL_PATH)/sample_images/sample_images.tar.bz2 ; \
tar -jxf $$< -C $$(dir $$@) $$(notdir $$@) && touch $$@)
endef
$(call ue-unittest-sample-image,disk_ext2_1k.img)
$(call ue-unittest-sample-image,disk_ext2_4k.img)
$(call ue-unittest-sample-image,disk_ext2_4k_empty.img)
$(call ue-unittest-sample-image,disk_ext2_unittest.img)
十六、update_engine.conf
# update_engine.conf # ======================================================== include $(CLEAR_VARS) LOCAL_MODULE := ue_unittest_update_engine.conf LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_NATIVE_TESTS)/update_engine_unittests LOCAL_MODULE_STEM := update_engine.conf LOCAL_SRC_FILES := update_engine.conf include $(BUILD_PREBUILT)
拷贝ue_unittest_update_engine.conf到out下面
十七、test_http_server
# test_http_server (type: executable)
# ========================================================
# Test HTTP Server.
include $(CLEAR_VARS)
LOCAL_MODULE := test_http_server
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_NATIVE_TESTS)/update_engine_unittests
LOCAL_MODULE_CLASS := EXECUTABLES
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_SHARED_LIBRARIES := $(ue_common_shared_libraries)
LOCAL_STATIC_LIBRARIES := $(ue_common_static_libraries)
LOCAL_SRC_FILES := \
common/http_common.cc \
test_http_server.cc
include $(BUILD_EXECUTABLE)
测试模块,暂时不做分析
十八、test_subprocess
# test_subprocess (type: executable) # ======================================================== # Test helper subprocess program. include $(CLEAR_VARS) LOCAL_MODULE := test_subprocess LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_NATIVE_TESTS)/update_engine_unittests LOCAL_MODULE_CLASS := EXECUTABLES 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_SHARED_LIBRARIES := $(ue_common_shared_libraries) LOCAL_STATIC_LIBRARIES := $(ue_common_static_libraries) LOCAL_SRC_FILES := test_subprocess.cc include $(BUILD_EXECUTABLE)
测试模块,暂时不做分析
十九、update_engine_unittests
# update_engine_unittests (type: executable)
# ========================================================
# Main unittest file.主单元测试文件
include $(CLEAR_VARS)
LOCAL_MODULE := update_engine_unittests
LOCAL_REQUIRED_MODULES := \
test_http_server \
test_subprocess \
ue_unittest_delta_generator \
ue_unittest_disk_ext2_1k.img \
ue_unittest_disk_ext2_4k.img \
ue_unittest_disk_ext2_4k_empty.img \
ue_unittest_disk_ext2_unittest.img \
ue_unittest_key.pem \
ue_unittest_key.pub.pem \
ue_unittest_key2.pem \
ue_unittest_key2.pub.pem \
ue_unittest_update_engine.conf
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) \
$(ue_libupdate_engine_exported_c_includes)
LOCAL_STATIC_LIBRARIES := \
libpayload_generator \
libbrillo-test-helpers \
libgmock \
libchrome_test_helpers \
$(ue_common_static_libraries) \
$(ue_libpayload_generator_exported_static_libraries:-host=)
LOCAL_SHARED_LIBRARIES := \
$(ue_common_shared_libraries) \
$(ue_libpayload_generator_exported_shared_libraries:-host=)
LOCAL_SRC_FILES := \
certificate_checker_unittest.cc \
common/action_pipe_unittest.cc \
common/action_processor_unittest.cc \
common/action_unittest.cc \
common/cpu_limiter_unittest.cc \
common/fake_prefs.cc \
common/file_fetcher_unittest.cc \
common/hash_calculator_unittest.cc \
common/http_fetcher_unittest.cc \
common/hwid_override_unittest.cc \
common/mock_http_fetcher.cc \
common/prefs_unittest.cc \
common/subprocess_unittest.cc \
common/terminator_unittest.cc \
common/test_utils.cc \
common/utils_unittest.cc \
payload_consumer/bzip_extent_writer_unittest.cc \
payload_consumer/cached_file_descriptor_unittest.cc \
payload_consumer/delta_performer_integration_test.cc \
payload_consumer/delta_performer_unittest.cc \
payload_consumer/extent_reader_unittest.cc \
payload_consumer/extent_writer_unittest.cc \
payload_consumer/fake_file_descriptor.cc \
payload_consumer/file_descriptor_utils_unittest.cc \
payload_consumer/file_writer_unittest.cc \
payload_consumer/filesystem_verifier_action_unittest.cc \
payload_consumer/postinstall_runner_action_unittest.cc \
payload_consumer/xz_extent_writer_unittest.cc \
payload_generator/ab_generator_unittest.cc \
payload_generator/blob_file_writer_unittest.cc \
payload_generator/block_mapping_unittest.cc \
payload_generator/cycle_breaker_unittest.cc \
payload_generator/deflate_utils_unittest.cc \
payload_generator/delta_diff_utils_unittest.cc \
payload_generator/ext2_filesystem_unittest.cc \
payload_generator/extent_ranges_unittest.cc \
payload_generator/extent_utils_unittest.cc \
payload_generator/fake_filesystem.cc \
payload_generator/full_update_generator_unittest.cc \
payload_generator/graph_utils_unittest.cc \
payload_generator/inplace_generator_unittest.cc \
payload_generator/mapfile_filesystem_unittest.cc \
payload_generator/payload_file_unittest.cc \
payload_generator/payload_generation_config_unittest.cc \
payload_generator/payload_signer_unittest.cc \
payload_generator/squashfs_filesystem_unittest.cc \
payload_generator/tarjan_unittest.cc \
payload_generator/topological_sort_unittest.cc \
payload_generator/zip_unittest.cc \
proxy_resolver_unittest.cc \
testrunner.cc
#iot 定义依赖
ifeq ($(local_use_omaha),1)
LOCAL_C_INCLUDES += \
$(ue_libupdate_engine_exported_c_includes)
LOCAL_STATIC_LIBRARIES += \
libupdate_engine \
$(ue_libupdate_engine_exported_static_libraries:-host=)
LOCAL_SHARED_LIBRARIES += \
$(ue_libupdate_engine_exported_shared_libraries:-host=)
LOCAL_SRC_FILES += \
common_service_unittest.cc \
fake_system_state.cc \
image_properties_android_unittest.cc \
metrics_reporter_omaha_unittest.cc \
metrics_utils_unittest.cc \
omaha_request_action_unittest.cc \
omaha_request_params_unittest.cc \
omaha_response_handler_action_unittest.cc \
omaha_utils_unittest.cc \
p2p_manager_unittest.cc \
payload_consumer/download_action_unittest.cc \
payload_state_unittest.cc \
parcelable_update_engine_status_unittest.cc \
update_attempter_unittest.cc \
update_manager/android_things_policy_unittest.cc \
update_manager/boxed_value_unittest.cc \
update_manager/chromeos_policy.cc \
update_manager/chromeos_policy_unittest.cc \
update_manager/enterprise_device_policy_impl.cc \
update_manager/evaluation_context_unittest.cc \
update_manager/generic_variables_unittest.cc \
update_manager/next_update_check_policy_impl_unittest.cc \
update_manager/out_of_box_experience_policy_impl.cc \
update_manager/policy_test_utils.cc \
update_manager/prng_unittest.cc \
update_manager/real_device_policy_provider_unittest.cc \
update_manager/real_random_provider_unittest.cc \
update_manager/real_system_provider_unittest.cc \
update_manager/real_time_provider_unittest.cc \
update_manager/real_updater_provider_unittest.cc \
update_manager/umtest_utils.cc \
update_manager/update_manager_unittest.cc \
update_manager/variable_unittest.cc
else # local_use_omaha == 1
#普通android定义依赖
LOCAL_STATIC_LIBRARIES += \
libupdate_engine_android \
$(ue_libupdate_engine_android_exported_static_libraries:-host=)
LOCAL_SHARED_LIBRARIES += \
$(ue_libupdate_engine_android_exported_shared_libraries:-host=)
LOCAL_SRC_FILES += \
update_attempter_android_unittest.cc
endif # local_use_omaha == 1
include $(BUILD_NATIVE_TEST)
编译可执行程序update_engine_unittests
二十、Update payload signing public key.
# Update payload signing public key. # ======================================================== ifeq ($(PRODUCT_IOT),true) include $(CLEAR_VARS) LOCAL_MODULE := brillo-update-payload-key LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/update_engine LOCAL_MODULE_STEM := update-payload-key.pub.pem LOCAL_SRC_FILES := update_payload_key/brillo-update-payload-key.pub.pem LOCAL_BUILT_MODULE_STEM := update_payload_key/brillo-update-payload-key.pub.pem include $(BUILD_PREBUILT) endif # PRODUCT_IOT
这一段不做分析,ifeq ($(PRODUCT_IOT),true)就是local_use_omaha,IOT设备会把brillo公钥拷贝到$(TARGET_OUT_ETC)/update_engine下面
二一、Brillo update payload generation script
# Brillo update payload generation script
# ========================================================
ifeq ($(HOST_OS),linux)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := scripts/brillo_update_payload
LOCAL_MODULE := brillo_update_payload
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_IS_HOST_MODULE := true
LOCAL_MODULE_TAGS := optional
LOCAL_REQUIRED_MODULES := \
delta_generator \
shflags \
simg2img
include $(BUILD_PREBUILT)
endif # HOST_OS == linux
编译复制脚本brillo_update_payload到host下面
模块汇总
以上基本上是update_engine所有编译出来的模块,下面我们做个汇总
一、静态库模块
update_metadata-protos 指向host和target环境 不知道是个啥,要再详细了解下
libpayload_consumer 指向host和target环境
依赖:update_metadata-protos
libupdate_engine_boot_control 指向target环境 连接boot_control模块
libupdate_engine_android 指向target环境
libpayload_generator 指向host和target环境
二、可执行程序
update_engine 指向target环境 服务端进程,也是我们要分析的重中之重
依赖:libupdate_engine_android
update_engine_sideload 指向target环境 recovery升级使用,最后再分析
update_engine_client 指向target环境 相当于一个调试模块,也是客户端进程的demo
delta_generator 指向host和target环境 制作差分包会使用到
依赖:libpayload_generator
update_engine_unittests 指向target环境
依赖:libupdate_engine_android
三、预编译文件
update_engine.conf 拷贝到target环境
brillo_update_payload 拷贝到host环境 制作差分包会使用到
看了这份文档,好像写了东西,又好像什么都没写,不过确实对我们需要关注的点有了更好的划分,这就是写的重要性,接下来将从update_engine_client update_engine开始分析,虽然client只是一个测试模块,不过我想按照先客户端再服务端进行分析。
本文详细剖析了AB Update机制下的update_engine模块,包括其编译流程、关键组件及依赖关系,重点介绍了update_engine_client和update_engine服务端进程,为理解Android系统级OTA升级提供了深入视角。
409

被折叠的 条评论
为什么被折叠?



