Android OTA(一)关于make otapackage

来源:互联网 发布:网络大电影营销 编辑:程序博客网 时间:2024/06/05 07:24
make otapackage

顶层Makefile:

build/core/Makefile:1951.PHONY: otapackageotapackage: $(INTERNAL_OTA_PACKAGE_TARGET)
一、 $(INTERNAL_OTA_PACKAGE_TARGET)的定义:

INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip

对于这里的name:

name := $(TARGET_PRODUCT)ifeq ($(TARGET_BUILD_TYPE),debug)  name := $(name)_debugendifname := $(name)-ota-$(FILE_NAME_TAG)
1.  对于PRODUCT_OUT:

PRODUCT_OUTPRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/productTARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))TARGET_OUT_ROOT_release := $(OUT_DIR)/targetOUT_DIR := $(TOPDIR)out

实际上$(PRODUCT_OUT)是:out/target/product/

2. TARGET_DEVICE:

# 实际上就是$(INTERNAL_PRODUCT)TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)# $(TARGET_PRODUCT))实际上就是$(TARGET_PRODUCT)的“短名字”,假设$(TARGET_PRODUCT)为tardis,那么$(TARGET_DEVICE)就是tardisINTERNAL_PRODUCT := $(call resolve-short-product-name, $(TARGET_PRODUCT))

3. 综上,$(INTERNAL_OTA_PACKAGE_TARGET)值为:out/target/product/tardis/tardis-ota.zip

二、KEY_CERT_PAIR

KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)DEFAULT_KEY_CERT_PAIR := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) # The default key if not set as LOCAL_CERTIFICATEifdef PRODUCT_DEFAULT_DEV_CERTIFICATE  DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)else  DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkeyendif
可以看到默认的证书为build/target/product/security/testkey
三、OTA包的生成命令

$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE)@echo "Package OTA: $@"$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \   ./build/tools/releasetools/ota_from_target_files -v \   --block \   -p $(HOST_OUT) \   -k $(KEY_CERT_PAIR) \   $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \   $(BUILT_TARGET_FILES_PACKAGE) $@
1. PATH

PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH# 把$(INTERNAL_USERIMAGES_BINARY_PATHS)中列出的依赖工具的所有对应的目录都加入到$(PATH)中INTERNAL_USERIMAGES_BINARY_PATHS := $(sort $(dir $(INTERNAL_USERIMAGES_DEPS)))# 相当于取$(INTERNAL_USERIMAGES_DEPS)中的路径的“最小集合”INTERNAL_USERIMAGES_DEPS += $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(E2FSCK)# 对应的三个依赖:MKEXTUSERIMG := $(HOST_OUT_EXECUTABLES)/mkuserimg.shMAKE_EXT4FS := $(HOST_OUT_EXECUTABLES)/make_ext4fs$(HOST_EXECUTABLE_SUFFIX)E2FSCK := $(HOST_OUT_EXECUTABLES)/e2fsck$(HOST_EXECUTABLE_SUFFIX)
这里可以看出$(INTERNAL_USERIMAGES_BINARY_PATHS)实际上就是:$(HOST_OUT_EXECUTABLES),其定义:
HOST_OUT_EXECUTABLES := $(HOST_OUT)/bin
HOST_OUT_EXECUTABLES的依赖关系:
HOST_OUT := $(HOST_OUT_$(HOST_BUILD_TYPE))HOST_OUT_release := $(HOST_OUT_ROOT_release)/$(HOST_OS)-$(HOST_PREBUILT_ARCH)HOST_OUT_ROOT_release := $(OUT_DIR)/hostOUT_DIR := $(TOPDIR)outifneq (,$(findstring Linux,$(UNAME))) -> UNAME := $(shell uname -sm)  HOST_OS := linuxendifHOST_PREBUILT_ARCH := x86
也就是说$(HOST_OUT)实际上为:out/host-x86/
所以$(INTERNAL_USERIMAGES_BINARY_PATHS)为:out/host-x86/bin/, 也就是说$(PATH)为:out/host-x86/bin/:$PATH
2. MKBOOTIMG

$(MKBOOTIMG)的定义为:

MKBOOTIMG := $(HOST_OUT_EXECUTABLES)/mkbootimg$(HOST_EXECUTABLE_SUFFIX)
其中$(HOST_EXECUTABLE_SUFFIX)为空,实际上就是:out/host-x86/bin/mkbootimg

3. BUILT_TARGET_FILES_PACKAGE

BUILT_TARGET_FILES_PACKAGE := $(intermediates)/$(name).zip# 中间包路径的确定,这句话的意思是:寻找out/target/product/$(TARGET_PRODUCT)/obj/中PACKAGING类型文件中以target_files开头的目录intermediates := $(call intermediates-dir-for,PACKAGING,target_files)确定中间包名字name := $(TARGET_PRODUCT)ifeq ($(TARGET_BUILD_TYPE),debug)  name := $(name)_debugendifname := $(name)-target_files-$(FILE_NAME_TAG) -> FILE_NAME_TAG := $(BUILD_NUMBER) -> eng# 中间包的名字最后会变成:tardis-target_files.zip(假设$(TARGET_PRODUCT)为tardis,$(FILE_NAME_TAG)为空)

4. 命令本身

再回过头看看官网OTA说明:https://source.android.com/devices/tech/ota/tools 所讲的:

./build/tools/releasetools/ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip
而对于make otapackage的命令
./build/tools/releasetools/ota_from_target_files -v -p out/host/linux-x86 -k \build/target/product/security/testkey \out/target/product/tardis/obj/PACKAGING/target_files_intermediates/tardis-target_files.zip \out/target/product/tardis/tardis-ota.zip
可以看到多了点东西,但是无法改变的事实就是:make otapackage生成的包肯定是完整包

原创粉丝点击