OTA 软件包工具

本文地址http://wossoneri.github.io/2018/09/21/%5BAndroid%5D%5BFramework%5Dcreate-ota-update-zip/

build/tools/releasetools 中提供的 ota_from_target_files 工具可以构建两种类型的软件包:完整更新软件包和增量更新软件包。该工具将 Android 构建系统生成的 target_files .zip 文件作为输入文件。

完整更新

完整更新是指软件包将对设备的整个最终状态(system分区、boot分区和recovery分区)进行更新。只要设备能够接收软件包并启动恢复系统,软件包就可以安装所需的版本,而不受设备当前状态的影响。

示例:使用发布工具为假设的 msm8953_32 设备构建完整更新:

# first, build the target-files .zip
. build/envsetup.sh && lunch msm8953_32-user
mkdir dist_output
make dist DIST_DIR=dist_output

target_files .zip 包含构建 OTA 软件包所需的所有内容。

./build/tools/releasetools/ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

ota_update.zip 现已准备就绪,可以发送到测试设备(所有内容均使用测试密钥进行签名)。

增量更新

增量更新包含一组要应用于设备上的已有数据的二进制补丁程序。以下原因可能会导致此类更新软件包非常小:

  • 未更改的文件不需要包含在其中。
  • 更改的文件通常与之前的版本非常相似,因此软件包中只需包含针对两个文件之间的不同之处进行的编码。

只有当设备具有构建相应软件包所使用的旧版本或源版本时,您才能在设备上安装增量更新软件包。要构建增量更新,您需要拥有上一个版本(您要更新的版本)中的 target_files .zip 以及新版本中的 target_files .zip。

./build/tools/releasetools/ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip # make incremental from the older version

该版本与上一个版本非常类似,而且增量更新软件包(约 1 MB)比对应的完整更新软件包 (60 MB) 小得多。

仅当设备运行的上一个版本与相应增量更新软件包的起点版本完全一样时,才向其分发该增量更新软件包。如果尝试在运行其他版本的设备上安装该增量包,系统将会显示恢复错误图标。此时用户只要重新启动设备,即可回到旧系统;软件包会先验证它要更新的所有文件是否已回到之前的状态,然后再对其执行操作,因此,如果发生上述情况,设备不应留在半升级状态。

制作升级包

为了减小升级包的大小,我们选择制作差分包(增量升级包)。

要制作差分升级包,需要先做出两个全升级包,然后根据这两个包制作出差分升级包。

编译系统

制作升级包之前需要先对系统代码进行整编。编译之前记得清空out目录,因为系统编译不会自动检查删除当前版本弃用的文件。

. build/envsetup.sh
lunch msm8953
make clobber
make -j20

编译完成就会在$OUT目录下生成所有的img文件。

可以通过printenv查看$OUT指向哪里。

编译升级包

使用

make otapackage

编译结束会在$OUT/obj/PACKAGING/target_files_intermediates/目录下生成升级用的.zip包。比如:msm8953-target_files-eng.Data.BU.zip

制作差分包

有了升级包,将其拷贝到一个目录下保存,比如OTA/old,然后对源码做一些修改,保证有更新。然后clean掉$OUT目录,再次整编,制作升级包,然后把新的升级包拷贝到OTA/new目录下。

最后使用ota_from_target_files脚本制作差分包就可以了:

./build/tools/releasetools/ota_from_target_files -i OTA/old/*.zip OTA/old/*.zip OTA/update/update.zip

差分包签名

使用

make otapackage

生成的包是系统签过名的。耳机通过脚本做出来的差分包也是签过名的:

$ unzip update.zip
Archive: update.zip
signed by SignApk
inflating: META-INF/com/android/metadata
inflating: META-INF/com/google/android/update-binary
inflating: META-INF/com/google/android/updater-script
inflating: META-INF/com/android/otacert
inflating: META-INF/MANIFEST.MF
inflating: META-INF/CERT.SF
inflating: META-INF/CERT.RSA
$ keytool -printcert -file META-INF/CERT.RSA

能够打印出我们的keystore。

如果手动修改自定义升级包,需要再次签名

./build/tools/releasetools/ota_from_target_files \
-k ~/.android-certs/releasekey \
signed-target_files.zip \
signed-ota_update.zip

编写升级包制作脚本

脚本在croot目录执行,思路是首先制作一个升级包放在OTA/old目录下,之后每次编译,都会编译出升级包放在OTA/new目录下,制作完差分包后,把新的升级包移动到OTA/old目录作为下一次升级的基础包。

#!/bin/sh

OTA_PATH="OTA/"
OTA_OLD="OTA/old/"
OTA_NEW="OTA/new/"
OTA_DIFF="OTA/update/" create_dir()
{
if [ ! -d "$1" ]
then
mkdir "$1"
echo "Create $1"
fi
} check_dir_empty()
{
if [ "`ls -A $1`" = "" ]; then
echo "Couldn\`t find update package in folder $1"
exit 404
fi
} create_dir $OTA_PATH
create_dir $OTA_OLD
create_dir $OTA_NEW
create_dir $OTA_DIFF #. build/envsetup.sh make otapackage -j20 # copy this time's build upgrade package to OTA/new
cp $OUT/obj/PACKAGING/target_files_intermediates/*.zip OTA/new # compare this one to old one to make a diff package
check_dir_empty $OTA_OLD
check_dir_empty $OTA_NEW
./build/tools/releasetools/ota_from_target_files -i $OTA_OLD*.zip $OTA_NEW*.zip OTA/update/update.zip check_dir_empty $OTA_UPDATE
echo "update.zip created in $OTA_UPDATE" # put this zip to old folder
mv $OTA_NEW*.zip $OTA_OLD echo "Finished!"

Ref:

https://blog.csdn.net/mike8825/article/details/47871481

https://source.android.com/devices/tech/ota

制作OTA升级包的更多相关文章

  1. android OTA升级包制作

    0.签名 java -Xmx2048m -jar out/host/linux-x86/framework/signapk.jar -w build/target/product/security/t ...

  2. android OTA升级包制作【转】

    本文转载自:http://www.thinksaas.cn/topics/0/445/445670.html 0.签名 java -Xmx2048m -jar out/host/linux-x86/f ...

  3. OTA升级包制作工具处理过程分析

    http://blog.csdn.net/ly890700/article/details/56048815 Android Recovery(30)  1.概述  OTA升级包制作工具是一个用pyt ...

  4. Hbuider制作app升级包的简单办法 (升级官方提供的案例)

    源文档:http://ask.dcloud.net.cn/question/11795 http://ask.dcloud.net.cn/article/199 一.生成移动App资源升级包 5+应用 ...

  5. 制作ota差分包

    制作ota包 . build/envsetup.sh lunch [product] make -j8 make otapackage -j8 cp out/target/product/projec ...

  6. Android系统OTA升级包制作【转】

    本文转载自:http://blog.csdn.net/dingfengnupt88/article/details/52882788 Android系统升级分为整包升级和差分包升级,整包升级就是将系统 ...

  7. [OTA] 系统加密后Recovery是如何读取OTA升级包的

    目前很多Android手机采用的FUSE方案,也就是内部SD卡不单独占用一个文件系统而实际上占用的是userdata的空间. 当系统加密后,解密需要VOLD的参于.而在Recovery模式下,是没有V ...

  8. NSIS 制作自动升级包

    1:首先定义基础变量 !define PRODUCT_NAME "XXX"//补丁名称 !define PRODUCT_VERSION "3"//版本号 !de ...

  9. OTA制作及升级过程笔记【转】

    本文转载自:http://www.it610.com/article/5752570.htm 1.概述 1.1   文档概要 前段时间学习了AndroidRecovery模式及OTA升级过程,为加深理 ...

随机推荐

  1. mybatis框架(4)---输入输出映射

    输入输出映射 通过parameterType制定输入参数类型 类型可以是简单类型(int String)也可以是POJO本身 或者包装类 1输入映射 关于输入简单类型和pojo本身的我就不写了,因为比 ...

  2. 如何正确且高效实现OSSIM中文化的解决方案(图文详解)

    前言   对于玩OSSIM的初学者或者中级水平的从业人员来说,都有一定必要性从中文看起,当然,最终还是英文的目标迈进,只是说,为了让自己更快速上手! 虽然系统说明支持中文,实际上,只是台湾的繁体中文而 ...

  3. Spring的后处理器-BeanPostProcessor跟BeanFactoryPostProcessors

    最近在重读spring源码(为什么要重读?因为不得不承认,去年跟着<深入解析sping源码>一书过了一遍spring的源码,除了满脑袋都是各种BeanFactory跟BeanDefinit ...

  4. leetcode — add-binary

    /** * Source : https://oj.leetcode.com/problems/add-binary/ * * * Given two binary strings, return t ...

  5. 菜鸟系列docker——docker镜像中(4)

    docker镜像命令 该章节主要介绍docker image相关命令实践操作,建议都一起跑一边 1. docker images 列举本机docker镜像 [centos@jiliguo docker ...

  6. 机器学习基础:(Python)训练集测试集分割与交叉验证

    在上一篇关于Python中的线性回归的文章之后,我想再写一篇关于训练测试分割和交叉验证的文章.在数据科学和数据分析领域中,这两个概念经常被用作防止或最小化过度拟合的工具.我会解释当使用统计模型时,通常 ...

  7. 关于kubernetes使用私有仓库一点说明

    一.概述 关于kubernetes使用私有docker image  registry的一些说明: 1.对于自己构建的项目镜像或一些不想暴露到外网的image需要使用自建的私有仓库,一般有两种选择:d ...

  8. Zookeeper(一) —— 环境搭建

    一.概述 集中式 向 分布式演变,高并发.海量存储 应用场景: * 数据发布.订阅的两种方式:推模式.拉模式 * 命名服务 * 分布式协调/通知(心跳检测) * 负载均衡 自增长id和uuid的缺点, ...

  9. Docker在Linux上运行NetCore系列(五)更新应用程序

    转发请注明此文章作者与路径,请尊重原著,违者必究. 本篇文章与其它系列文章不同,为了方便测试,新建了一个ASP.Net Core视图应用. 备注:下面说的应用,只是在容器中运行的应用程序. 查看现在运 ...

  10. C#委托。

    什么是委托. 委托是一种数据类型. 委托的作用. 把变化的东西封装起来. 委托是引用变量,声明后不赋值为null   所以使用前校验非空. class Program { static void Ma ...