您可以使用 build/make/tools/releasetools 中提供的 ota_from_target_files 工具,针对使用 A/B 系统更新或非 A/B 系统更新的设备构建完整 OTA 软件包和增量 OTA 软件包。该工具将 Android 构建系统生成的 target-files.zip 文件作为输入文件。

注意:请勿使用或修改(或允许应用使用或修改)/data/ota_package 目录。对此目录或其内容的任何使用或修改都将导致 OTA 软件包下载出错。

对于搭载 Android 11 或更高版本的设备,您可以为具有不同 SKU 的多台设备构建一个 OTA 软件包。为此,需要将目标设备配置为使用动态指纹并更新 OTA 元数据,以便在前提条件和后置条件条目中添加设备名称和指纹。

Android 8.0 弃用了非 A/B 设备基于文件的 OTA 软件包,而必须改用基于块的 OTA 软件包。如需为搭载 Android 7.x 或更低版本的设备生成基于块的 OTA 软件包,请将 --block 选项传递给 ota_from_target_files 参数。

构建完整更新

完整更新是指 OTA 软件包将对设备的整个最终状态(system 分区、boot 分区和 recovery 分区)进行更新。不管设备的当前状态如何,只要设备能够接收和应用软件包,软件包就会安装 build。例如,以下命令使用发布工具为 tardis 设备构建 target-files.zip 归档文件。

. build/envsetup.sh && lunch tardis-eng

mkdir dist_output

make dist DIST_DIR=dist_output

生成的 .zip 文件包含为 tardis 设备构建 OTA 软件包所需的所有内容。

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

ota_update.zip 现已准备就绪,可以发送到测试设备(所有内容均使用测试密钥进行签名)。对于用户设备,请生成并使用自己的私钥,详情请参阅对需要发布的 build 进行签名。

构建增量更新

增量更新是指 OTA 软件包将对设备上的现有数据应用二进制补丁程序。采用增量更新的软件包通常较小,因为它们无需包含未更改的文件。此外,由于更改的文件通常与之前的版本非常相似,因此软件包中只需包含针对两个文件之间的不同之处进行的编码。

只有当设备具有构建相应软件包所使用的源 build 时,您才能在设备上安装增量更新软件包。如需构建增量更新,您需要上一个 build(您要更新的那个 build)中的 target_files.zip 文件以及新 build 中的 target_files.zip 文件。例如,以下命令可使用发布工具为 tardis 设备构建增量更新。

./build/make/tools/releasetools/ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip

此 build 与上一个 build 非常相似,而且增量更新软件包(incremental_ota_update.zip,约 1MB)比对应的完整更新软件包 (60MB) 小得多。

仅当设备运行的上一个 build 与相应增量更新软件包的起点 build 完全一样时,才向其分发该增量更新软件包。您必须刷写 PREVIOUS-tardis-target_files.zip 或 PREVIOUS-tardis-img.zip 中的映像(均使用 make dist 构建,将使用 fastboot update 进行刷写),而不是 PRODUCT_OUT 目录下的映像(使用 make 进行构建,将使用 fastboot flashall 进行刷写)。尝试在具有其他某个 build 的设备上安装增量更新软件包会导致安装错误。如果安装失败,设备同样会保持正常运行状态(运行旧系统);软件包在触及它要更新的所有文件之前,会验证其上一个状态,因此设备不会滞留在半升级状态。

为了提供最佳用户体验,请在每 3-4 次增量更新之后提供 1 次完整更新。这样有助于用户及时更新到最新版本,并避免冗长的增量更新安装序列。

为多个 SKU 构建 OTA 软件包

Android 11 或更高版本支持为具有不同 SKU 的多台设备使用单个 OTA 软件包。为此,需要将目标设备配置为使用动态指纹并更新 OTA 元数据(使用 OTA 工具),以便在前提条件和后置条件条目中添加设备名称和指纹。

关于 SKU

SKU 的格式是组合构建参数值的变体,通常是当前 build_fingerprint 参数的未声明子集。原始设备制造商 (OEM) 可以为 SKU 使用由 CDD 批准的构建参数的任意组合,同时仍对这些 SKU 使用单个映像。例如,以下 SKU 具有多个变体:

SKU =

modifierA 是设备级(例如 Pro、Premium 或 Plus)

modifierB 是硬件变体(例如无线装置)

modifierC 是区域,可以是一般区域(如 NA、EMEA 或 CHN),也可以是特定于国家/地区或语言的区域(如 JPN、ENG 或 CHN)

许多 OEM 都针对多个 SKU 使用单个映像,然后在设备启动后在运行时衍生出最终的产品名称和设备指纹。此过程简化了平台开发流程,使进行了小规模自定义但产品名称不同的设备(如 tardis 和 tardispro)可以共用常见的映像。

使用动态指纹

指纹是一个定义好的构建参数的串联,如 ro.product.brand、ro.product.name 和 ro.product.device。设备的指纹衍生自 system 分区指纹,用作在设备中运行的映像(和字节)的唯一标识符。如需创建动态指纹,请使用设备 build.prop 文件中的动态逻辑,在设备启动时获取引导加载程序变量的值,然后使用这些数据为该设备创建动态指纹。

例如,如需为 tardis 和 tardispro 设备使用动态指纹,请按如下说明更新相应文件。

更新 odm/etc/build_std.prop 文件,在其中添加以下代码行。

ro.odm.product.device=tardis

更新 odm/etc/build_pro.prop 文件,在其中添加以下代码行。

ro.odm.product.device=tardispro

更新 odm/etc/build.prop 文件,在其中添加以下代码行。

ro.odm.product.device=tardis

import /odm/etc/build_${ro.boot.product.hardware.sku}.prop

这些代码行会根据 ro.boot.product.hardware.sku 引导加载程序属性(只读)的值动态设置设备名称、指纹和 ro.build.fingerprint 值。

更新 OTA 软件包元数据

OTA 软件包中包含用于描述软件包的元数据文件 (META-INF/com/android/metadata),其中包括 OTA 软件包的前提条件和后置条件。例如,以下代码是某个以 tardis 设备为目标的 OTA 软件包的元数据文件。

post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys

post-build-incremental=6516341

post-sdk-level=30

post-security-patch-level=2020-07-05

post-timestamp=1590026334

pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys

pre-build-incremental=6515794

pre-device=tardis

pre-device、pre-build-incremental 和 pre-build 值定义了设备必须具备哪种状态后才能安装 OTA 软件包。post-build-incremental 和 post-build 值定义了设备在安装 OTA 软件包后的预期状态。pre- 和 post- 字段的值衍生自下列对应的构建属性。

pre-device 值衍生自 ro.product.device 构建属性。

pre-build-incremental 和 post-build-incremental 值衍生自 ro.build.version.incremental 构建属性。

pre-build 和 post-build 值衍生自 ro.build.fingerprint 构建属性。

在搭载 Android 11 或更高版本的设备上,您可以在 OTA 工具中使用 --boot_variable_file 标志指定一个文件的路径,该文件包含用于创建设备动态指纹的运行时变量的值。然后,这些数据将被用来更新 OTA 元数据,以在 pre- 和 post- 条件中添加设备名称和指纹(使用竖线字符 | 作为分隔符)。--boot_variable_file 标志的语法和说明如下。

语法:--boot_variable_file

说明:指定一个文件的路径,该文件包含 ro.boot.* 属性的可能值。该属性用于在某些 ro.product.* 属性被 import 语句覆盖时计算可能的运行时指纹。该文件每行需要填写一个属性,每行的格式如下:prop_name=value1,value2。

例如,当属性为 ro.boot.product.hardware.sku=std,pro 时,tardis 和 tardispro 设备的 OTA 元数据如下所示。

post-build=google/tardis/tardis:11/|google/tardis/tardispro:11/

pre-build=google/tardis/tardis:11/|google/tardis/tardispro:11/

pre-device=tardis|tardispro

如需在搭载 Android 10 的设备上支持此功能,请参阅参考实现。此变更列表会有条件地解析 build.prop 文件中的 import 语句,使属性替换项能被系统识别出来并反映在最终 OTA 元数据中。

注意:不要忘记通过更新您的 OTA 交付服务来识别新的元数据。

android ota 服务器搭建,构建 OTA 软件包  |  Android 开源项目  |  Android Open Source Project...相关推荐

  1. 【开源项目----Android OPenGLES渲染YUV视频文件】

    [开源项目----Android OPenGLES渲染YUV视频文件] OpenGLES对YUV渲染相关文章参考

  2. 10.5k Star!可快速搭建私人网盘的开源项目

    10.5k Star!可快速搭建私人网盘的开源项目 [导语]:可搭建私人网盘的在线文件浏览器. 简介 filebrowser 提供指定目录下的文件管理界面,可用于搭建私人网盘,在线管理各种文件资源,内 ...

  3. android ota服务器搭建,Android OTA 差分包升级

    稍作修改,因为直接用会有些错误 另外附上超详细的recovery模式update.zip升级分析说明的地址: 根目录下两个命令: 1.make --会生成系统的img文件,system.img,boo ...

  4. android ota更新app,企业 OTA 更新  |  Android 开源项目  |  Android Open Source Project

    Android 兼容性定义文档 (CDD) 可更新软件要求设备实现 SystemUpdatePolicy 类.SystemUpdatePolicy 可让设备所有者 (DO) 应用(如果存在)控制系统更 ...

  5. Android的服务器搭建

    网络 有网络就要有服务器 创建Web工程--选择动态工程 配置tomcat7--最好自己的JDK的版本保持一致 如果你下载的版本是tomcat6的话,就只能用6了. 填写工程的名称. 这时,要点击Ne ...

  6. android udt协议,接口和软件包  |  Android 开源项目  |  Android Open Source Project

    HIDL 围绕接口构建而成,而接口是在面向对象的语言中用来定义行为的抽象类型.每个接口都是软件包的一部分. 软件包 软件包名称可以具有子级,如 package.subpackage.已发布的 HIDL ...

  7. Android签名版本,签名版本以供发布  |  Android 开源项目  |  Android Open Source Project...

    Android 操作系统映像在两个地方使用加密签名: 映像中的所有 .apk 文件都必须经过签名.Android 软件包管理器通过下列两种方式使用 .apk 签名:更换应用时,必须使用与旧应用相同的密 ...

  8. android10分区镜像,分区和映像  |  Android 开源项目  |  Android Open Source Project

    分区 Android 设备包含若干个分区,这些分区在启动过程中发挥不同的作用.为了支持 A/B 更新,设备需要为 boot.system.vendor 和 radio 分区分别单独配置一个槽位. bo ...

  9. android的wifi直连,WLAN 直连  |  Android 开源项目  |  Android Open Source Project

    WLAN 直连功能又称"WLAN 点对点",它允许支持设备直接使用 WLAN 直连协议发现其他设备并与之互连(无需连接到互联网或移动网络).此功能是基于 Wi-Fi 联盟 (WFA ...

最新文章

  1. Ti公司DSP的DSK、EVM、DDK的区别
  2. selenium+Headless Chrome实现不弹出浏览器自动化登录
  3. 使用 Node.js、Express、AngularJS 和 MongoDB 构建一个Web程序
  4. 分布式理论(一)CAP 理论
  5. hierarchy change - ERP side debugging
  6. vc 6.0 显示文件全路径_配送路径规划思考(十二)
  7. 《软件项目管理(第二版)》期中考试试题总结/复习资料
  8. 江苏高中计算机考试成绩查询系统,江苏2018普通高中信息技术学业水平测试成绩查询系统已开通...
  9. linux更新硬件时钟,Linux内核“11分钟模式”可以做的最大的硬件时钟更新是什么?...
  10. [转]编程之美数组分割问题
  11. Hadoop概念学习系列之Hadoop 是什么?(一)
  12. 是==和!=相互依赖?
  13. R语言ETL工程系列:R语言基础设置
  14. python实验总结心得体会_如何更有效地“肝”论文?这里有份最全工具总结
  15. 【PS】如何使用Photoshop调整图片指定部分的大小
  16. airpods有一只耳机冒红光_AirPods单只耳机连接不上、充不上电、闪灯等问题解决方式...
  17. 重磅!罗振宇跨年演讲:扎心5问
  18. python3爬虫讲座ppt+demo
  19. 什么剪辑软件好用?视频剪辑这样做
  20. 不用运动快速有效减肥——红光光浴#大健康#红光光浴#红光#种光光学

热门文章

  1. macvim/babun+spf13-vim
  2. xshell和xftp6提示“要继续使用此程序,您必须应用最新的更新或使用新版本”
  3. php 数组保存到文件的方法 (数组转为字符串)
  4. hikari如何切换数据源_Hikari 数据源参数配置说明
  5. duilib学习笔记
  6. LightGCN实践2——GPU内存爆炸终结篇
  7. 谁驱动公司?上帝赐予食物,魔鬼送来厨师
  8. 服务器显卡无信号,长久不用电脑的朋友注意了,电脑出现无信号是什么情况?...
  9. 记一次keep-alive没有生效的排查
  10. iOS安全攻防之越狱设备检测