1)概念介绍
我们知道Android系统一般可以通过本地升级和空中升级两种,一般本地升级包括SD卡升级、U盘升级、串口升级等。而所谓的空中升级就是通过网络将升级包下载升级包到本地,进行升级。
而OTA升级作为Android系统提供的标准软件升级方式,同时支持本地升级如SD卡或U盘 和 空中升级如网络。OTA升级一般分为全包升级和差分升级。
全包升级:编译当前系统得到的软件包,不依赖于当前手机里的软件版本
差分升级:对手机两个软件版本做差分,在第一个版本上打patch得到第二个升级包,所以差分升级只能对第一个版本的机器进行升级
2)编译方法
在源码根目录下执行: make otapackage
注意:执行这句命令之前需要在根目录下make编译整个源码。
在out/target/product/$(PRODUCT_NAME)/$(BUILD_NAME)-target-files-$(BUILD_NUMBER).zip文件,其中$(PRODUCT_NAME)是编译产品名字,$(BUILD_NAME)是编译的版本名字,$(BUILD_NUMBER)一般是编译的版本号。以我的fsl的Qiyi版本为例。
生成文件目录为:out/target/product/sabresd_6dq/Qiyi-target-files-20130725.zip文件
拷贝到U盘下的upgrade目录下即可(有的是直接拷贝到U盘根目录下,各个代码不一样)。
3)编译过程
我们主要分析build/core/Makefile,以我飞思卡尔Android sabresd_6dq 奇异版本为例。
# -----------------------------------------------------------------
# OTA update package
name := $(TARGET_PRODUCT)
ifeq ($(TARGET_BUILD_TYPE),debug)
name := $(name)_debug
endif
name := $(name)-ota-$(FILE_NAME_TAG)
#$(FILE_NAME_TAG)就是$(BUILD_NUMBER)编译版本号,一般为build/core/build_id.mk文件中设置
name := $(BUILD_NAME)-target-files-$(BUILD_NUMBER)
#$(BUILD_NAME)就是编译名字,我的为Qiyi,所以最后升级包名字为:Qiyi-target-files-20130725.zip
INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
# 编译升级包依赖于 $(KEY_CERT_PAIR)文件,我这里build/target/product/security/testkey文件
$(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
# 编译升级包依赖于$(BUILT_TARGET_FILES_PACKAGE) 和 $(OTATOOLS)
# 这是编译核心,通过一个python脚本ota_from_target_files 将前面生成的zip包打成ota升级包文件
$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(OTATOOLS)
@echo "Package OTA: $@"
$(hide) ./build/tools/releasetools/ota_from_target_files -v \
-p $(HOST_OUT) \
-k $(KEY_CERT_PAIR) \
-n \
$(BUILT_TARGET_FILES_PACKAGE) $@
#-n 去掉时间戳标志,去掉该参数则不能回退版本
# 整个这句命令就是:./build/tools/releasetools/ota_from_target_files -v \
# -p out/host/linux-x86 \
# -k build/target/product/security/testkey \
# -n \
#