Android OTA(一)關於make otapackage

make otapackage

頂層Makefile:

build/core/Makefile:1951
.PHONY: otapackage
otapackage: $(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)_debug
endif
name := $(name)-ota-$(FILE_NAME_TAG)
1.  對於PRODUCT_OUT:

PRODUCT_OUT
PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)
TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product
TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))
TARGET_OUT_ROOT_release := $(OUT_DIR)/target
OUT_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)就是tardis
INTERNAL_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_CERTIFICATE
ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
  DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
else
  DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey
endif
可以看到默認的證書爲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.sh
MAKE_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)/host
OUT_DIR := $(TOPDIR)out
ifneq (,$(findstring Linux,$(UNAME))) -> UNAME := $(shell uname -sm)
  HOST_OS := linux
endif
HOST_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)_debug
endif
name := $(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生成的包肯定是完整包
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章