本文转载自:http://blog.csdn.net/huryjiang/article/details/7590015

1 升级包的制作

基本命令:

Ø  makeMtk [project[flavor]] new –编译整个项目

Ø  makeMtk [project[flavor]] otapackage –编译otapackage

Ø  /build/tools/releasetools/ota_from_target_files –n –i oldotapackage newotapackage update.zip –制作差分包

生成的otapackage为整包,update.zip为差分包,这两个包拷贝到SD卡上,进入recovery模式后便可以进行升级了。–n –i 这两个是编译差分包的参数,-n是忽略UTC时间戳对版本升级的限制,-i是生成的差分包。因为整包和差分包都是通过./build/tools/releasetools/ota_from_target_files这个脚本生成的,这个文件的分析详细查看,这位大侠的分析,非常的详细:http://blog.csdn.net/zjujoe/article/details/6209393

编译过程:

1、Android 的编译原理

参见下面:http://www.cnblogs.com/fly-fish/archive/2012/05/07/2489274.html

下面说明otapackage的编译原理:

(build/core/Makefile)

# -----------------------------------------------------------------
# host tools needed to build OTA packages

OTATOOLS :=  $(HOST_OUT_EXECUTABLES)/minigzip \
   $(HOST_OUT_EXECUTABLES)/mkbootfs \
   $(HOST_OUT_EXECUTABLES)/mkbootimg \
   $(HOST_OUT_EXECUTABLES)/fs_config \
   $(HOST_OUT_EXECUTABLES)/mkyaffs2image \
   $(HOST_OUT_EXECUTABLES)/zipalign \
   $(HOST_OUT_EXECUTABLES)/aapt \
   $(HOST_OUT_EXECUTABLES)/bsdiff \
   $(HOST_OUT_EXECUTABLES)/imgdiff \
   $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar \
   $(HOST_OUT_JAVA_LIBRARIES)/signapk.jar \
   $(HOST_OUT_EXECUTABLES)/mkuserimg.sh \
   $(HOST_OUT_EXECUTABLES)/make_ext4fs

.PHONY: otatools
otatools: $(OTATOOLS)

# -----------------------------------------------------------------
# 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,updater)/updater
$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_OTA_TOOLS := $(built_ota_tools)

$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_API_VERSION := $(RECOVERY_API_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_ANDROID_INFO_TXT_TARGET) \
  $(built_ota_tools) \
  $(APKCERTS_FILE) \
  $(HOST_OUT_EXECUTABLES)/fs_config \
  | $(ACP)
 @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
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
ifdef BOARD_KERNEL_PAGESIZE
 $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/RECOVERY/pagesize
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
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
 $(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)
 @# 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/
 @# 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
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
ifdef BOARD_SYSTEMIMAGE_PARTITION_SIZE
 $(hide) echo "system_size=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt
endif
ifdef BOARD_USERDATAIMAGE_PARTITION_SIZE
 $(hide) echo "userdata_size=$(BOARD_USERDATAIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt
endif
 $(hide) echo "tool_extensions=$(tool_extensions)" >> $(zip_root)/META/misc_info.txt
ifdef mkyaffs2_extra_flags
 $(hide) echo "mkyaffs2_extra_flags=$(mkyaffs2_extra_flags)" >> $(zip_root)/META/misc_info.txt
endif
 @# Zip everything up, preserving symlinks
 $(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)
 @# Run fs_config on all the system files in the zip, and save the output
 $(hide) zipinfo -1 $@ | awk -F/ 'BEGIN { OFS="/" } /^SYSTEM\// {$$1 = "system"; print}' | $(HOST_OUT_EXECUTABLES)/fs_config > $(zip_root)/META/filesystem_config.txt
 $(hide) (cd $(zip_root) && zip -q ../$(notdir $@) META/filesystem_config.txt)

target-files-package: $(BUILT_TARGET_FILES_PACKAGE)

ifneq ($(TARGET_SIMULATOR),true)
ifneq ($(TARGET_PRODUCT),sdk)
ifneq ($(TARGET_DEVICE),generic)
ifneq ($(TARGET_NO_KERNEL),true)
ifneq ($(recovery_fstab),)

# -----------------------------------------------------------------
# OTA update package

name := $(TARGET_PRODUCT)
ifeq ($(TARGET_BUILD_TYPE),debug)
  name := $(name)_debug
endif
name := $(name)-ota-$(FILE_NAME_TAG)

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

$(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)

$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(OTATOOLS)
 @echo "Package OTA: $@"
 $(hide) ./build/tools/releasetools/ota_from_target_files -v \
    -n \
    -p $(HOST_OUT) \
           -k $(KEY_CERT_PAIR) \
           $(BUILT_TARGET_FILES_PACKAGE) $@

.PHONY: otapackage
otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)

# -----------------------------------------------------------------
# The update package

name := $(TARGET_PRODUCT)
ifeq ($(TARGET_BUILD_TYPE),debug)
  name := $(name)_debug
endif
name := $(name)-img-$(FILE_NAME_TAG)

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

ifeq ($(TARGET_RELEASETOOLS_EXTENSIONS),)
# default to common dir for device vendor
$(INTERNAL_UPDATE_PACKAGE_TARGET): extensions := $(TARGET_DEVICE_DIR)/../common
else
$(INTERNAL_UPDATE_PACKAGE_TARGET): extensions := $(TARGET_RELEASETOOLS_EXTENSIONS)
endif

$(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(OTATOOLS)
 @echo "Package: $@"
 $(hide) ./build/tools/releasetools/img_from_target_files -v \
    -s $(extensions) \
    -p $(HOST_OUT) \
    $(BUILT_TARGET_FILES_PACKAGE) $@

.PHONY: updatepackage
updatepackage: $(INTERNAL_UPDATE_PACKAGE_TARGET)

endif    # recovery_fstab is defined
endif    # TARGET_NO_KERNEL != true
endif    # TARGET_DEVICE != generic
endif    # TARGET_PRODUCT != sdk
endif    # TARGET_SIMULATOR != true

上面红色标注的地方说明:

1、OTATOOLS 升级包制作的差分工具

2、$(hide) ./build/tools/releasetools/ota_from_target_files -v \
    -n \调用脚本生成otapackage包,这里Android源码是没有-n这个参数的,没有这个参数会导致版本之间无法升级,-n忽略ro.build.date.utc检查。

Android OTA在线升级二(升级包编译原理分析) 【转】相关推荐

  1. Android OTA在线升级一(架构分析)

    http://blog.csdn.net/huryjiang/article/details/7589625 1.前言 OTA(Over-the-Air Technology)空中下载技术.是通过移动 ...

  2. 高通Android智能平台环境搭建_编译流程分析

    高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...

  3. xposed hook java_[原创]Android Hook 系列教程(一) Xposed Hook 原理分析

    章节内容 一. Android Hook 系列教程(一) Xposed Hook 原理分析 二. Android Hook 系列教程(二) 自己写APK实现Hook Java层函数 三. Androi ...

  4. Android Jetpack组件ViewModel基本使用和原理分析

    本文整体流程:首先要知道什么是 ViewModel,然后演示一个例子,来看看 ViewModel 是怎么使用的,接着提出问题为什么是这样的,最后读源码来解释原因! 1.什么是ViewModel 1.1 ...

  5. Android 7.1 车机 Android 系统 在线升级,将安装到下载到/data/目录下面

    最近按项目要求,需要做一个车机Android在线升级操作,但是cache内存太小了,最后只能寄存希望在 data/文件夹下,但是data/目录在6.0之后禁止recovery读取data文件.最后的解 ...

  6. Android 7.1 车机 下载 Android 系统 在线升级,将安装包放到/data/下进行升级

    最近按项目要求,需要做一个车机Android在线升级操作,但是cache内存太小了,最后只能寄存希望在 data/文件夹下,但是data/目录在6.0之后禁止recovery读取data文件.最后的解 ...

  7. Android studio在线升级

    android studio2.3.3如何在线升级到Android studio3.0而无需手动下载再升级呢?升级Android studio3.0的方法很简单,只需要按照如下操作即可. 1:打开an ...

  8. OTA在线升级Android7.1系统迅为IMX6Q开发板支持SATA,PCIE,EIM总线,WIFI蓝牙

    iTOP-IMX6 开发平台是基于 NXP 的 IMX6 系列芯片开发的产品,该产品广泛应用于车载系统.数字标牌.金融设备.人机界面.机上娱乐系统.工业控制.医疗设备.仪器仪表.智慧城市.商业电子等多 ...

  9. Android 兼容 Java 8 语法特性的原理分析

    本文主要阐述了Lambda表达式及其底层实现(invokedynamic指令)的原理.Android第三方插件RetroLambda对其的支持过程.Android官方最新的dex编译器D8对其的编译支 ...

最新文章

  1. 这个笑脸胡子的表情是什么:“<:] {%>”?
  2. 天翼云从业认证(4.10)网络直播场景解决方案(CDN)
  3. 为什么蚂蚁金服架构师建议从Zookeeper开始提升技术水平?
  4. ubuntu 16.04 安装最新的 docker
  5. LED流水灯程序——小白的单片机笔记
  6. 如何从JavaScript对象中删除键? [重复]
  7. QT找不到python27.dll或python36.dll解决办法
  8. C# TextBox 自动换行问题解决
  9. java 数字转大写中文_java如何实现,把数字转换成中文的大写数字?
  10. 圆的内接正n边形的周长
  11. 大班音乐机器人反思_幼儿园大班音乐游戏教案活动《机器人》含反思
  12. windows操作系统---1
  13. 一文看懂李录价值投资体系
  14. java计算机毕业设计Web医学院校大学生就业信息管理系统源码+mysql数据库+系统+lw文档+部署
  15. 2020 ICPC 南京 H Harmonious Rectangle (DFS剪枝+思维)
  16. 超大型生鲜配送软件源码
  17. 【前瞻】Nature:2022年7大“颠覆性”技术
  18. 使用C语言的七个步骤
  19. 为Redmine的项目加上起止时间
  20. 不快乐的12个常见原因及有效疗法

热门文章

  1. 深入“肠-脑”神经高速通道,揭开“第六感觉”面纱
  2. DeepMind新论文:给侧面照片,AI给你脑补出正面
  3. AI将成科学家“高级定制”工具
  4. 来了个假阿里? | 每日趣闻
  5. mongoDB 文档概念
  6. Play Framework 2.5 整合 MyBatis
  7. 使用tcpwrapper实现访问控制功能
  8. Oracle:PL/SQL 中如何使用Array
  9. 【LeetCode】two num 利用comparable接口 对对象进行排序
  10. 1.6-puppet测试证书