从android P(9.0)版本开始,我们发现编译出来的OTA升级了里面多了一个文件,compatibility.zip,这个里面存储这system与vendor分区的一些特性,用来做升级前的兼容性检查。其实从android O开始已经增加了这个功能,但是没有默认打开。直到android P上,已经默认打开了。

解压compatibility.zip后,内容如下:

我们先从google的官方了解下这个功能。

https://source.android.com/devices/architecture/vintf/

Framework(system)和Device(vendor)匹配的框架如下:

Manifest 描述了提供给对方的feature, Matrix 描述了需要对方提供的feature。Manifest 和 Matrix 在OTA升级前会进行匹配检查,以确保framework和device是兼容的。总的来说,manifest是提供端,matrix是需求端。

下面以android P最新的aosp的code为例。

Framework Manifest:

manifest.xml的源文件由google手动生成,其存在路径:

system/libhidl/vintfdata/manifest.xml

system/libhidl/vintfdata/manifest_healthd_exclude.xml

至于xml的内容就不贴上来了,可以到对应的目录去查看源文件。manifest.xml的格式可以参考官方文档即可,也不在此详细讲解。

Framework Compatibility Matrix:

Framework compatibility matrix描述的是framework对 device的需求。这个matrix文件是和Android Framework Image(system.img)关联的。Framework compatibility matrix的这些需要被device manifest支持。

compatibility matrix源文件路径:

hardware/interfaces/compatibility_matrices/compatibility_matrix.1.xml

hardware/interfaces/compatibility_matrices/compatibility_matrix.2.xml

hardware/interfaces/compatibility_matrices/compatibility_matrix.3.xml

hardware/interfaces/compatibility_matrices/compatibility_matrix.empty.xml

hardware/interfaces/compatibility_matrices/compatibility_matrix.legacy.xml

Device Manifest:

由BoardConfig.mk中定义

device/xxxx/xxxx/BoardConfig.mk定义:

DEVICE_MANIFEST_FILE := device/xxxx/xxxx/manifest.xml

源文件为 device/xxxx/xxxx/manifest.xml

Device Compatibility Matrix

如果BoardConfig.mk中有定义,则以定义的文件为源文件:

#DEVICE_MATRIX_FILE   := device/amlogic/common/compatibility_matrix.xml

如果没有定义,则使用缺省的源文件:

system/libhidl/vintfdata/device_compatibility_matrix.default.xml

如上,我们找到了device manifest,device compatibility matrix,framework manifest,framework compatibility matrix各自对应的源文件,然后我们通过编译规则生成最终的xml文件。

build/make/target/board/Android.mk(定义了Device Manifest生成规则)

# Device Manifest
ifdef DEVICE_MANIFEST_FILE
# $(DEVICE_MANIFEST_FILE) can be a list of files
include $(CLEAR_VARS)
LOCAL_MODULE := device_manifest.xml
LOCAL_MODULE_STEM := manifest.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/etc/vintf GEN := $(local-generated-sources-dir)/manifest.xml
$(GEN): PRIVATE_DEVICE_MANIFEST_FILE := $(DEVICE_MANIFEST_FILE)
$(GEN): $(DEVICE_MANIFEST_FILE) $(HOST_OUT_EXECUTABLES)/assemble_vintf
BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) \
PRODUCT_ENFORCE_VINTF_MANIFEST=$(PRODUCT_ENFORCE_VINTF_MANIFEST) \
PRODUCT_SHIPPING_API_LEVEL=$(PRODUCT_SHIPPING_API_LEVEL) \
$(HOST_OUT_EXECUTABLES)/assemble_vintf -o $@ \
-i $(call normalize-path-list,$(PRIVATE_DEVICE_MANIFEST_FILE)) LOCAL_PREBUILT_MODULE_FILE := $(GEN)
include $(BUILD_PREBUILT)
BUILT_VENDOR_MANIFEST := $(LOCAL_BUILT_MODULE)
endif

system/libhidl/vintfdata/Android.mk(定义了Device Compatibility Matrix / Framework Manifest编译规则)

# Device Compatibility Matrix
ifdef DEVICE_MATRIX_FILE
DEVICE_MATRIX_INPUT_FILE := $(DEVICE_MATRIX_FILE)
else
DEVICE_MATRIX_INPUT_FILE := $(LOCAL_PATH)/device_compatibility_matrix.default.xml
endif include $(CLEAR_VARS)
LOCAL_MODULE := device_compatibility_matrix.xml
LOCAL_MODULE_STEM := compatibility_matrix.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/etc/vintf GEN := $(local-generated-sources-dir)/compatibility_matrix.xml $(GEN): PRIVATE_VINTF_VNDK_VERSION := $(VINTF_VNDK_VERSION)
$(GEN): $(DEVICE_MATRIX_INPUT_FILE) $(HOST_OUT_EXECUTABLES)/assemble_vintf
REQUIRED_VNDK_VERSION=$(PRIVATE_VINTF_VNDK_VERSION) \
BOARD_SYSTEMSDK_VERSIONS="$(BOARD_SYSTEMSDK_VERSIONS)" \
$(HOST_OUT_EXECUTABLES)/assemble_vintf -i $< -o $@ LOCAL_PREBUILT_MODULE_FILE := $(GEN)
include $(BUILD_PREBUILT)
BUILT_VENDOR_MATRIX := $(LOCAL_BUILT_MODULE) # Framework Manifest
include $(CLEAR_VARS)
LOCAL_MODULE := framework_manifest.xml
LOCAL_MODULE_STEM := manifest.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/vintf GEN := $(local-generated-sources-dir)/manifest.xml $(GEN): PRIVATE_FLAGS := ifeq ($(PRODUCT_ENFORCE_VINTF_MANIFEST),true)
ifdef BUILT_VENDOR_MATRIX
$(GEN): $(BUILT_VENDOR_MATRIX)
$(GEN): PRIVATE_FLAGS += -c "$(BUILT_VENDOR_MATRIX)"
endif
endif $(GEN): PRIVATE_VINTF_VNDK_VERSION := $(VINTF_VNDK_VERSION)
$(GEN): PRIVATE_FRAMEWORK_MANIFEST_INPUT_FILES := $(FRAMEWORK_MANIFEST_INPUT_FILES)
$(GEN): $(FRAMEWORK_MANIFEST_INPUT_FILES) $(HOST_OUT_EXECUTABLES)/assemble_vintf
PROVIDED_VNDK_VERSIONS="$(PRIVATE_VINTF_VNDK_VERSION) $(PRODUCT_EXTRA_VNDK_VERSIONS)" \
PLATFORM_SYSTEMSDK_VERSIONS="$(PLATFORM_SYSTEMSDK_VERSIONS)" \
$(HOST_OUT_EXECUTABLES)/assemble_vintf \
-i $(call normalize-path-list,$(PRIVATE_FRAMEWORK_MANIFEST_INPUT_FILES)) \
-o $@ $(PRIVATE_FLAGS)

hardware/interfaces/compatibility_matrices/Android.mk

hardware/interfaces/compatibility_matrices/compatibility_matrix.mk (定义了Framework Compatibility Matrix规则)

# 详细规则请查看源文件,就不贴代码了

有了上述源文件及编译规则,则可以生成最终的xml文件了, 具体的调用,都是使用了out/host/linux-x86/bin/assemble_vintf工具。

生成的最终的xml对应的分区路径如下:

/system/compatibility_matrix.xml

/system/etc/vintf/manifest.xml

/vendor/etc/vintf/compatibility_matrix.xml

/vendor/etc/vintf/manifest.xml

至此,我们在升级过程,可以从升级包update.zip中获取manifest与matrix文件(system_manifest.xml system_matrix.xml vendor_manifest.xml vendor_matrix.xml),然后挂载/system /vendor分区,与system/vendor分区对应的xml对比校验,检查是否符合升级条件。满足条件,则继续后面的升级,如果不满足条件,则终止升级。

具体的代码实现,bootable/recovery/install.cpp中

在升级包的完整性校验完成之后,就进行兼容性校验,最终的实现调用的接口是(system/libvintf/VintfObject.cpp):android::vintf::VintfObjectRecovery::CheckCompatibility

参考:

https://www.jianshu.com/p/a9ea323f892c

https://source.android.com/devices/architecture/vintf/

recovery 升级前兼容性检查(Vendor Interface Object)的更多相关文章

  1. Oracle数据库升级前必要的准备工作

    Oracle数据库升级向来是一门纷繁复杂的工程,DBA需要为产品数据库的升级耗费大量时间精力在准备工作上:因为其升级复杂度高,所以即便做了较为充分的准备仍可能在升级过程中遇到意想不到的问题,为了更高效 ...

  2. SQL Server2016升级前几点自检

    SQL Server2016已经出来一段时间了,而且最新的SP1包也于2016年11月18日正式发布,各种新的特性推出让我们跃跃欲试.那么对于我们真实的业务环境,特别是生产环境要不要"跟风& ...

  3. Android Recovery升级原理

    摘要 Recovery模式指的是一种可以对安卓机内部的数据或系统进行修改的模式(类似于windows PE或DOS).也可以称之为安卓的恢复模式,在这个所谓的恢复模式下,我们可以刷入新的安卓系统,或者 ...

  4. Inno Setup 在安装程序开始前和卸载程序开始前,检查并关闭运行的进程

    (2011-12-29 11:54:56) 转载▼ 标签: innosetup it 分类: 开发工具经验累积 Inno Setup在安装程序前,如果有使用的进程在运行,会有错误提示,而使得Insta ...

  5. Oracle升级前备份和失败回退

    一.升级前备份 1.软件备份[root@localhost backup]# su - oracle [oracle@localhost ~]$ cd $ORACLE_HOME[oracle@loca ...

  6. Objective-C 【NSString-字符串比较&前后缀检查及搜索】

    ———————————————————————————————————————————NSString 字符串比较 #import <Foundation/Foundation.h> vo ...

  7. BAT开发中,ChromeDriver版本兼容性检查

    打开解决方案的Nuget包管理器,选择合适的版本,安装即可.版本的兼容性检查,见上一篇blog(初次使用BAT,请检查Chrome浏览器和ChromeDriver兼容性 https://www.cnb ...

  8. recovery 升级过程LED灯闪烁

    Android设备在进入recovery升级的过程,我们在屏幕上面可以看到升级的机器人动画,以及升级的进度显示.这仅限于有屏幕的设备,比如平板PAD,电视TV等,对与没有屏幕的盒子BOX,那么在不接入 ...

  9. recovery 升级过程执行自定义shell命令

    有时候我们需要,在升级的过程中,执行一些shell命令,来完成我们的一些需求,利用升级过程,进行一些特殊化的操作,思路如下: 第一: 把我们需要执行的命令,写成一个test.sh脚本,然后在recov ...

随机推荐

  1. Ocelot简易教程(四)之请求聚合以及服务发现

    上篇文章给大家讲解了Ocelot的一些特性并对路由进行了详细的介绍,今天呢就大家一起来学习下Ocelot的请求聚合以及服务发现功能.希望能对大家有所帮助. 作者:依乐祝 原文地址:https://ww ...

  2. Android--通知之Toast

    前言 这篇博客讲解一下Android下的一个简单信息提示的方式:Toast.如果一直看我的博客,会发现在之前的Demo中,一直有用到Toast去提示消息,在这篇博客中就专门讲它.Toast提供一个浮动 ...

  3. Android--UI之ScrollView

    前言 本篇博客主要讲解ScrollView和HorizontalScrollView两个容器的使用.它们分别代表了垂直滚动以及水平滚动,滚动的内容是它其中包含的View.在本篇会简单介绍ScrollV ...

  4. Tomcat中server.xml配置详解(2)

    Tomcat中配置文件详解 Server.xml配置文件说明,以及Tomcat组件的说明 Tomcat服务器是由一系列可以配置的组件构成,其中核心组件是Catalina Servlet,它是最顶层组件 ...

  5. CentOS5/6/7系统下搭建安装Amabari大数据集群时出现SSLError: Failed to connect. Please check openssl library versions.错误的解决办法(图文详解)

    不多说,直接上干货! ========================== Creating target directory... ========================== Comman ...

  6. Java工程师修炼之路(从小白到BAT的两年学习历程)

    ​ 作者:陆小凤 文章首发于:微信公众号[程序员江湖] 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾 ...

  7. java正则表达式的忽略大小写

    (?i)abc 表示abc都忽略大小写  a(?i)bc 表示bc忽略大小写  a((?i)b)c 表示只有b忽略大小写

  8. #1 Python灵活技巧

    前言 Python基础系列博文已顺利结束,从这一篇开始将进入探索更加高级的Python用法,Python进阶系列文章将包含面向对象.网络编程.GUI编程.线程和进程.连接数据库等.不过在进阶之前,先来 ...

  9. Perl分片技术

    分片(slice) 在perl中,如果想要取得一部分变量.一部分列表内容.一部分hash内容,可以采用分片(切片)的方式. 注意,perl并未提供字符串的切片方式,但可以使用内置函数substr()来 ...

  10. CNN大战验证码

    介绍   爬虫江湖,风云再起.自从有了爬虫,也就有了反爬虫:自从有了反爬虫,也就有了反反爬虫.   反爬虫界的一大利器,就是验证码(CAPTCHA),各种各样的验证码让人眼花缭乱,也让很多人在爬虫的过 ...