安卓OTA升级系统解析上
在MTK安卓环境中只需要在alps 目录执行./mk otapackage即可打包ota升级包,下面我们来分析下这个过程中。
alps/mk代码片段
sub chkDep
{
my $module = $_[0];
my $string = $module;
if (!$module)
{
$string = all;
}
# print "*********************************\n \"$string\" Dependency Checking...\n";
my $result;
#在./mk otapackage会调用mediatek/build/makemtk.mk中的otapackage目标
$result = &p_system("CUR_MODULE=$module make -f mediatek/build/makemtk.mk check-dep $cmdArg @mOpts > $logdir/${project}_check-dep.log 2>&1");
&p_system("cat $logdir/${project}_check-dep.log");
if ($result)
{
&p_system("cp -f $logdir/${project}_check-dep.log $logdir/${project}_check-dep.log_err");
die "Please check all dependency error First !!";
}
}12345678910111213141516171819
接下来查看mediatek/build/makemtk.mk otapackage目标.
从上图可以看出otapackage依赖于system.img boot.img recovery.img secro.img userdata.img目标
在打包otapackage过程中,mtk平台会重现编译上述的img
最终会执行alps/build/core/Makefile 中的otapackage目标
# -----------------------------------------------------------------
# OTA update package
name := $(TARGET_PRODUCT)
ifeq ($(TARGET_BUILD_TYPE),debug)
name := $(name)_debug
endif
name := $(name)-ota-$(FILE_NAME_TAG)
FWUPGRADEPACKAGE_SH := ./build/core/FWUpgradePackage.sh
INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
$(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
ifeq ($(strip $(MTK_FW_UPGRADE)), yes)
$(INTERNAL_OTA_PACKAGE_TARGET): $(FWUPGRADEPACKAGE_SH)
endif
$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS)
@echo "Package OTA: $@"
ifneq ($(TARGET_USERIMAGES_USE_UBIFS),true)
$(hide) ./build/tools/releasetools/ota_from_target_files -v \
-n \
-p $(HOST_OUT) \
-k $(KEY_CERT_PAIR) \
$(BUILT_TARGET_FILES_PACKAGE) $@
else
$(hide) ./build/tools/releasetools/ota_from_target_files -v \
-n \
-g \
-p $(HOST_OUT) \
-k $(KEY_CERT_PAIR) \
$(BUILT_TARGET_FILES_PACKAGE) $@
endif
ifeq ($(strip $(MTK_FW_UPGRADE)), yes)
@echo "Package FWUpgradePackage"
bash $(FWUPGRADEPACKAGE_SH) $(PRODUCT_OUT) $(KEY_CERT_PAIR)
endif
.PHONY: otapackage #otapackage 目标
otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)
上面可以看出$(INTERNAL_OTA_PACKAGE_TARGET)依赖于$(KEY_CERT_PAIR),$(HOST_OUT),$(BUILT_TARGET_FILES_PACKAGE),$(HOST_OUT)为主机输出目录,$(KEY_CERT_PAIR)为签名相关信息,$(BUILT_TARGET_FILES_PACKAGE)
‘BUILT_TARGET_FILES_PACKAGE’目标如下:
# -----------------------------------------------------------------
# A zip of the directories that map to the target filesystem.
# This zip can be used to create an OTA package or filesystem image
# as a post-build step.
#
name := $(TARGET_PRODUCT)
ifeq ($(TARGET_BUILD_TYPE),debug)
name := $(name)_debug
endif
name := $(name)-target_files-$(FILE_NAME_TAG)
intermediates := $(call intermediates-dir-for,PACKAGING,target_files)
BUILT_TARGET_FILES_PACKAGE := $(intermediates)/$(name).zip
$(BUILT_TARGET_FILES_PACKAGE): intermediates := $(intermediates)
$(BUILT_TARGET_FILES_PACKAGE): \
zip_root := $(intermediates)/$(name)
# $(1): Directory to copy
# $(2): Location to copy it to
# The "ls -A" is to prevent "acp s/* d" from failing if s is empty.
define package_files-copy-root
if [ -d "$(strip $(1))" -a "$$(ls -A $(1))" ]; then \
mkdir -p $(2) && \
$(ACP) -rd $(strip $(1))/* $(2); \
fi
endef
built_ota_tools := \
$(call intermediates-dir-for,EXECUTABLES,applypatch)/applypatch \
$(call intermediates-dir-for,EXECUTABLES,applypatch_static)/applypatch_static \
$(call intermediates-dir-for,EXECUTABLES,check_prereq)/check_prereq \
$(call intermediates-dir-for,EXECUTABLES,sqlite3)/sqlite3 \
$(call intermediates-dir-for,EXECUTABLES,updater)/updater
$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_OTA_TOOLS := $(built_ota_tools)
$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_API_VERSION := $(RECOVERY_API_VERSION)
$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_FSTAB_VERSION := $(RECOVERY_FSTAB_VERSION)
ifeq ($(TARGET_RELEASETOOLS_EXTENSIONS),)
# default to common dir for device vendor
$(BUILT_TARGET_FILES_PACKAGE): tool_extensions := $(TARGET_DEVICE_DIR)/../common
else
$(BUILT_TARGET_FILES_PACKAGE): tool_extensions := $(TARGET_RELEASETOOLS_EXTENSIONS)
endif
# Depending on the various images guarantees that the underlying
# directories are up-to-date.
$(BUILT_TARGET_FILES_PACKAGE): \
$(INSTALLED_BOOTIMAGE_TARGET) \
$(INSTALLED_RADIOIMAGE_TARGET) \
$(INSTALLED_RECOVERYIMAGE_TARGET) \
$(INSTALLED_SYSTEMIMAGE) \
$(INSTALLED_USERDATAIMAGE_TARGET) \
$(INSTALLED_CACHEIMAGE_TARGET) \
$(INSTALLED_VENDORIMAGE_TARGET) \
$(INSTALLED_ANDROID_INFO_TXT_TARGET) \
$(SELINUX_FC) \
$(built_ota_tools) \
$(APKCERTS_FILE) \
$(HOST_OUT_EXECUTABLES)/fs_config \
| $(ACP)
ifeq ($(TARGET_USERIMAGES_USE_EXT4),true)
$(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_CACHEIMAGE_TARGET)
endif
$(BUILT_TARGET_FILES_PACKAGE): \
$(INSTALLED_FACTORYIMAGE_TARGET) \
$(if $(BOARD_CUSTOMIMAGE_PARTITION_SIZE), $(INSTALLED_CUSTOMIMAGE_TARGET)) \
$(INSTALLED_SECROIMAGE_TARGET) \
mediatek/custom/$(MTK_PROJECT)/security/recovery/SEC_VER.txt
@echo "Package target files: $@"
$(hide) rm -rf $@ $(zip_root)
$(hide) mkdir -p $(dir $@) $(zip_root)
@# Components of the recovery image
$(hide) mkdir -p $(zip_root)/RECOVERY
$(hide) $(call package_files-copy-root, \
$(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/RECOVERY/RAMDISK)
ifdef INSTALLED_KERNEL_TARGET
$(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/RECOVERY/kernel
$(hide) $(ACP) $(recovery_ramdisk) $(zip_root)/RECOVERY/ramdisk
endif
ifdef INSTALLED_2NDBOOTLOADER_TARGET
$(hide) $(ACP) \
$(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/RECOVERY/second
endif
ifdef BOARD_KERNEL_CMDLINE
$(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/RECOVERY/cmdline
endif
ifdef BOARD_KERNEL_BASE
$(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/RECOVERY/base
endif
@# Components of the factory image
$(hide) mkdir -p $(zip_root)/FACTORY
$(hide) $(call package_files-copy-root, \
$(TARGET_FACTORY_ROOT_OUT),$(zip_root)/FACTORY/RAMDISK)
ifdef INSTALLED_KERNEL_TARGET
$(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/FACTORY/kernel
endif
ifdef BOARD_KERNEL_PAGESIZE
$(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/RECOVERY/pagesize
endif
ifdef INSTALLED_2NDBOOTLOADER_TARGET
$(hide) $(ACP) \
$(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/FACTORY/second
endif
ifdef BOARD_KERNEL_CMDLINE
$(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/FACTORY/cmdline
endif
ifdef BOARD_KERNEL_BASE
$(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/FACTORY/base
endif
@# Components of the boot image
$(hide) mkdir -p $(zip_root)/BOOT
$(hide) $(call package_files-copy-root, \
$(TARGET_ROOT_OUT),$(zip_root)/BOOT/RAMDISK)
ifdef INSTALLED_KERNEL_TARGET
$(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/kernel
$(hide) $(ACP) $(INSTALLED_RAMDISK_TARGET) $(zip_root)/BOOT/ramdisk
endif
ifdef INSTALLED_2NDBOOTLOADER_TARGET
$(hide) $(ACP) \
$(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second
endif
ifdef BOARD_KERNEL_CMDLINE
$(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline
endif
ifdef BOARD_KERNEL_BASE
$(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base
endif
ifdef BOARD_KERNEL_PAGESIZE
$(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize
endif
#wschen
$(hide) if [ -f $(PRODUCT_OUT)/custom_build_verno ]; then \
cat $(PRODUCT_OUT)/custom_build_verno > $(zip_root)/BOOT/board; \
fi
$(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),\
mkdir -p $(zip_root)/RADIO; \
$(ACP) $(t) $(zip_root)/RADIO/$(notdir $(t));)
@# Contents of the system image
$(hide) $(call package_files-copy-root, \
$(SYSTEMIMAGE_SOURCE_DIR),$(zip_root)/SYSTEM)
@# Contents of the data image
$(hide) $(call package_files-copy-root, \
$(TARGET_OUT_DATA),$(zip_root)/DATA)
ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
@# Contents of the vendor image
$(hide) $(call package_files-copy-root, \
$(TARGET_OUT_VENDOR),$(zip_root)/VENDOR)
endif
#wschen 2012-11-07
$(if $(BOARD_CUSTOMIMAGE_PARTITION_SIZE), \
$(hide) $(call package_files-copy-root, \
$(TARGET_CUSTOM_OUT),$(zip_root)/CUSTOM))
@# Extra contents of the OTA package
$(hide) mkdir -p $(zip_root)/OTA/bin
$(hide) $(ACP) $(INSTALLED_ANDROID_INFO_TXT_TARGET) $(zip_root)/OTA/
$(hide) $(ACP) $(PRIVATE_OTA_TOOLS) $(zip_root)/OTA/bin/
@# Security information of the OTA package
@echo "[SEC OTA] Adding Security information to OTA package"
@echo "[SEC OTA] path : mediatek/custom/$(MTK_PROJECT)/security/recovery/SEC_VER.txt"
$(hide) $(ACP) mediatek/custom/$(MTK_PROJECT)/security/recovery/SEC_VER.txt $(zip_root)/OTA/
@# Files that do not end up in any images, but are necessary to
@# build them.
$(hide) mkdir -p $(zip_root)/META
$(hide) $(ACP) $(APKCERTS_FILE) $(zip_root)/META/apkcerts.txt
$(hide) echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt
$(hide) echo "recovery_api_version=$(PRIVATE_RECOVERY_API_VERSION)" > $(zip_root)/META/misc_info.txt
$(hide) echo "fstab_version=$(PRIVATE_RECOVERY_FSTAB_VERSION)" >> $(zip_root)/META/misc_info.txt
ifdef BOARD_FLASH_BLOCK_SIZE
$(hide) echo "blocksize=$(BOARD_FLASH_BLOCK_SIZE)" >> $(zip_root)/META/misc_info.txt
endif
ifdef BOARD_BOOTIMAGE_PARTITION_SIZE
$(hide) echo "boot_size=$(BOARD_BOOTIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt
endif
ifdef BOARD_RECOVERYIMAGE_PARTITION_SIZE
$(hide) echo "recovery_size=$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt
endif
$(hide) echo "tool_extensions=$(tool_extensions)" >> $(zip_root)/META/misc_info.txt
$(hide) echo "default_system_dev_certificate=$(DEFAULT_KEY_CERT_PAIR)" >> $(zip_root)/META/misc_info.txt
ifdef PRODUCT_EXTRA_RECOVERY_KEYS
$(hide) echo "extra_recovery_keys=$(PRODUCT_EXTRA_RECOVERY_KEYS)" >> $(zip_root)/META/misc_info.txt
endif
$(hide) echo "mkbootimg_args=$(BOARD_MKBOOTIMG_ARGS)" >> $(zip_root)/META/misc_info.txt
$(hide) echo "use_set_metadata=1" >> $(zip_root)/META/misc_info.txt
$(hide) echo "update_rename_support=1" >> $(zip_root)/META/misc_info.txt
$(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt)
@# Zip everything up, preserving symlinks
$(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)
@# Run fs_config on all the system, boot ramdisk, and recovery ramdisk files in the zip, and save the output
$(hide) zipinfo -1 $@ | awk 'BEGIN { FS="SYSTEM/" } /^SYSTEM\// {print "system/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -S $(SELINUX_FC) > $(zip_root)/META/filesystem_config.txt
$(hide) zipinfo -1 $@ | awk 'BEGIN { FS="BOOT/RAMDISK/" } /^BOOT\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -S $(SELINUX_FC) > $(zip_root)/META/boot_filesystem_config.txt
$(hide) zipinfo -1 $@ | awk 'BEGIN { FS="RECOVERY/RAMDISK/" } /^RECOVERY\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -S $(SELINUX_FC) > $(zip_root)/META/recovery_filesystem_config.txt
#wschen 2012-11-07
$(if $(BOARD_CUSTOMIMAGE_PARTITION_SIZE), \
$(hide) zipinfo -1 $@ | awk 'BEGIN { FS="CUSTOM/" } /^CUSTOM\// {print "custom/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config >> $(zip_root)/META/filesystem_config.txt)
$(hide) (cd $(zip_root) && zip -q ../$(notdir $@) META/*filesystem_config.txt)
.PHONY: target-files-package
target-files-package: $(BUILT_TARGET_FILES_PACKAGE)
ifneq ($(TARGET_PRODUCT),sdk)
ifeq ($(filter generic%,$(TARGET_DEVICE)),)
ifneq ($(TARGET_NO_KERNEL),true)
ifneq ($(recovery_fstab),)
实际上最终执行的操作为:
$(hide) ./build/tools/releasetools/ota_from_target_files -v \
-n \
-g \
-p $(HOST_OUT) \
-k $(KEY_CERT_PAIR) \
$(BUILT_TARGET_FILES_PACKAGE) $@
上述所依赖的文件,最后都会作为参数传递给ota_from_target_files这个python脚本,这个python脚本会进一步生成最终的recovery升级包。示例参数如下:
./build/tools/releasetools/ota_from_target_files
-v -n -g -p out/host/linux-x86
-k build/target/product/security/testkey out/target/product/streambox/obj/PACKAGING/target_files_intermediates/streambox-target_files-eng.xiaojingling.zip
out/target/product/streambox/streambox-ota-eng.xiaojingling.zip
img_from_target_files为核心脚本,后面会专门解析此脚本。
安卓OTA升级系统解析上相关推荐
- android系统开机启动很慢,为什么安卓手机升级系统后,首次启动会比较慢?
原标题:为什么安卓手机升级系统后,首次启动会比较慢? 点击 很多小伙伴对安卓手机进行系统升级后,可能都会遇到一种情况:手机首次启动的时间好久,首次打开应用的时间也比往常要长. 为什么会出现这种情况? ...
- win7旗舰版 手机ota升级系统是什么意思
win7旗舰版 手机ota升级系统是什么意思 手机ota升级是指手机终端通过无线网络下载远程服务器上的升级包,对系统或应用进行升级的技术. 手机ota升级系统是什么意思 OTA是一项基于短消息机制,通 ...
- 安卓机更新系统会卡吗_安卓手机升级系统会变卡吗
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 手机升级系统会变卡有三种情况: 1.手机用的时间长了,版本太低,配置跟不上系统所需配置,这种情况系统升级会卡. 2.手机内存小,升 ...
- 安卓手机升级系统webview
今天公司有台android 5.1的的设备,其系统webview版本太低(39.0),给我手动升级了一下webview,顺便总结一下 一.前言 从Android4.4系统开始,Chromium内核取代 ...
- 安卓OTA升级文件的制作
OTA刷机包制作 整个项目编译完成后再执行make otapackage 生成的完整升级包会存放在out\debug\target\product[project name]\ 下 具体名字根 ...
- Android View系统解析(上)
注意:上图中的公式有误,正确的应该为: x = left + translationX y = top + translationY 顶 36 踩 2
- ipad一直卡在白苹果_IOS checkm8漏洞越狱 典型应用案例之OTA升级造成白苹果修复案例...
苹果设备OTA升级系统造成白苹果的现象屡见不鲜,给广大的手机用户造成诸多困扰,在这里解释下什么叫OTA升级,通俗讲,就是你的苹果手机提示你有新的版本,通过WIFI或者4G的网络条件下手机自己进行下载新 ...
- 全志T507如何在Android系统上进行OTA升级
OTA升级是Android系统所提供的标准软件升级方式.它功能十分强大,并且提供了完全升级(完整包)和增量升级(差异包)两种模式.https://www.forlinx.com/product/133 ...
- 干货 | 飞凌嵌入式OKT507-C开发板如何在Android系统上进行OTA升级
OTA升级是Android系统所提供的标准软件升级方式.它功能十分强大,并且提供了完全升级(完整包)和增量升级(差异包)两种模式.下面我们以飞凌嵌入式OKT507-C开发板为例,为大家讲解一下具体步骤 ...
最新文章
- CCS中各个项目文件的作用
- iOS:quartz2D绘图(给图形绘制阴影)
- linux 硬链接和软链接
- python编写格斗游戏_Python文字小游戏:搏击比赛
- 一周学会Mootools 1.4中文教程:(7)汇总收尾
- argis中4波段影像变3波段
- servlet乱码问题
- r语言导入ggplot2_R语言入门--画图(一)--ggplot2
- 下载丨10月数据库技术通讯:HAIP在两个私网网卡上发生互换,导致ASM实例启动失败...
- 《java程序员全攻略:从小工到专家》连载一:外行人眼中的IT人
- elementUI 下拉框隐藏时触发相关事件(下拉框下拉显示时不触发)
- paip.java桌面开发应用与WEB RIA应用
- 3600000毫秒等于多少小时_毫秒换算(秒与毫秒换算)
- python调节电脑音量_python如何调节音量大小
- syn重发_疑难杂症之被丢弃的SYN包
- mysql truncate分区表_MySQL分区表的管理~1
- Unable to boot device because it cannot be located on disk. Domain: NSPOSIXErrorDomain
- 运维祈求不宕机_一份运维监控的终极秘籍!监控不到位,宕机两行泪
- 带你一文搞懂VMware Workstation的三种网络模式
- P4844 LJJ爱数数 数论