• Android OTA在线升级二(升级包编译原理分析) 【转】


    本文转载自: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检查。

  • 相关阅读:
    团队介绍与选题报告
    实验6:开源控制器实践——RYU
    二叉搜索树的2层结点统计 (25 分)
    2020团队程学设计天梯赛-总决赛
    口罩发放 (25 分)
    九宫格输入法
    检查密码
    暑期训练10-1010
    暑期训练09-1003
    数据结构之循环队列
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/6595108.html
Copyright © 2020-2023  润新知