HIDL 概要

摘要:
HIDL也是软件之间的通信系统,为接口添加了绑定机制。HIDL语言的符号类似于C++和Java语言,但也有不同的关键字。HIDL设计目标:框架和HALS是相互独立的OTA,而不是相互依赖。HIDL工作模式绑定传递传递模式也是相同的处理模式。为了将运行早期版本的设备升级到ANDROIDO,可以将传统的HALS封装到HIDL接口中,该接口为HAL提供捆绑和直通模式。它包括HAL实现和导出函数IFoo*HIDL_FETCH_ IFoo获取HIDL服务通过名称和版本获取服务。HIDL接口的每个版本都是一个独立的接口。

HIDL 概要第1张

概述

HIDL:HAL interface definition langurage。描述HAL和用户之间的接口。接口可以是数据类型或方法。这些数据类型和方法组织在接口和包里。
HIDL也是软件之间的一个通信系统,为接口添加了binder机制。
HIDL描述的数据结构和方法签名组织在接口里,即.hal文件。HIDL语言的符号类似于C++和java语言,但也有不同的关键字。

HIDL设计

设计目标:framework和HALS之间互相独立OTA,不依赖于对方。
HIDL 概要第2张

HIDL工作模式

  1. binderized
  2. passthrough
    HIDL 概要第3张
passthrough

passthrough mode也就是same-process mode。
为了把运行早期版本的设备升级到ANDROID O,可以把传统(和legacy)HALS封装成HIDL接口,这个接口为HAL提供binderized和passthrough 模式。这种封装对HAL和framework是透明的。
Passthrough模式只支持C++,运行早期版本的Android的设备没有Java编写的HALs,因此Java HALs只支持binderized。

Passthrough 头文件

Hidl-gen在编译.hal文件时生成一个用于passthrough 模式的头文件:BsFoo.h。
其它头文件则用于binder通信。
Passthrough方法调用:
1:直接调用 ,运行在调用者线程里
2:oneway 方法调用,运行在自己线程里
BsFoo.h包含由HIDL产生的方法提供了诸如让oneway 方法运行在独立线程的特性。

Binderized HALS

例如:HAL 接口 a.b.c.d@M.N::IFoo,需要实现两部分:
实现a.b.c.d@M.N::IFoo-impl SO库。它包含HAL实现以及导出函数IFoo* HIDL_FETCH_IFoo(const char* name)。HIDL_FETCH_IFoo函数可以获取HAL实现的对象。
hidl-gen -Lc++-impl and -Landroidbp-impl

a.b.c.d@M.N::IFoo-service HAL服务。需要dlopen passthrough HAL以及把自己注册成binder服务

sp IFoo::getService(string name, bool getStub)

  1. getStub等于ture时,getservice以passthrough模式打开HAL实现。
  2. getStub等于false时,getservice会先获取binder服务,如果失败了才会获取passthrough服务。

注册HIDL 服务

egisterAsService(); // service name is default
registerAsService("another_foo_service"); // if needed
如果相同接口注册多个hal服务实现,就可以给服务指定name。

获取HIDL服务

HIDL 概要第4张

通过name和version获取服务。
每一个版本的HIDL 接口都是独立的接口。版本1.1的IFooService’和版本2.2 的IFooServer都可以注册成名为foo_service的服务。
不指定参数的化默认使用的是default服务。

HIDL 概要第5张

如何实现client获取服务死亡通知

Client需要实现:
1.从hidl_death_recipient 类继承一个子类IDeathRecipient
2.重写serviceDied()方法
3.实例化IDeathRecipient对象
4.调用服务的linkToDeath()方法,同时传递IDeathRecipient对象
例如:
HIDL 概要第6张

死亡接受callback可以注册到多个服务。

数据传输

两种类型接口方法:

  1. Blocking 等待直到服务返回
  2. Oneway 单向调用,没有返回值,no block,关键字oneway声明

Callbacks

  1. Synchronous callbacks
  2. Asynchronous callbacks

语法

ROOT =
    PACKAGE IMPORTS PREAMBLE { ITEM ITEM ... }  // not for types.hal
    PREAMBLE = interface identifier EXTENDS
  | PACKAGE IMPORTS ITEM ITEM...  // only for types.hal; no method definitions

ITEM =
    ANNOTATIONS? oneway? identifier(FIELD, FIELD ...) GENERATES?;
  |  struct identifier { SFIELD; SFIELD; ...};  // Note - no forward declarations
  |  union identifier { UFIELD; UFIELD; ...};
  |  enum identifier: TYPE { ENUM_ENTRY, ENUM_ENTRY ... }; // TYPE = enum or scalar
  |  typedef TYPE identifier;

VERSION = integer.integer;

PACKAGE = package android.hardware.identifier[.identifier[...]]@VERSION;

PREAMBLE = interface identifier EXTENDS

EXTENDS = <empty> | extends import_name  // must be interface, not package

GENERATES = generates (FIELD, FIELD ...)

// allows the Binder interface to be used as a type
// (similar to typedef'ing the final identifier)
IMPORTS =
  [empty]
  |  IMPORTS import import_name;

TYPE =
  uint8_t | int8_t | uint16_t | int16_t | uint32_t | int32_t | uint64_t | int64_t |
 float | double | bool | string
|  identifier  // must be defined as a typedef, struct, union, enum or import
               // including those defined later in the file
|  memory
|  pointer
|  vec<TYPE>
|  bitfield<TYPE>  // TYPE is user-defined enum
|  fmq_sync<TYPE>
|  fmq_unsync<TYPE>
|  TYPE[SIZE]

FIELD =
   TYPE identifier

UFIELD =
   TYPE identifier
  |  struct identifier { FIELD; FIELD; ...} identifier;
  |  union identifier { FIELD; FIELD; ...} identifier;

SFIELD =
   TYPE identifier
  |  struct identifier { FIELD; FIELD; ...};
  |  union identifier { FIELD; FIELD; ...};
  |  struct identifier { FIELD; FIELD; ...} identifier;
  |  union identifier { FIELD; FIELD; ...} identifier;

SIZE =  // Must be greater than zero
     constexpr

ANNOTATIONS =
     [empty]
  |  ANNOTATIONS ANNOTATION

ANNOTATION =
  |  @identifier
  |  @identifier(VALUE)
  |  @identifier(ANNO_ENTRY, ANNO_ENTRY  ...)

ANNO_ENTRY =
    identifier=VALUE

VALUE =
     "any text including " and other escapes"
  |  constexpr
  |  {VALUE, VALUE ...}  // only in annotations

ENUM_ENTRY =
     identifier
  |  identifier = constexpr

HIDL C++ 数据类型

HIDL 概要第7张

免责声明:文章转载自《HIDL 概要》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【qt】【QString的诸多操作】如何在Kubernetes集群动态使用 NAS 持久卷下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jmeter测试webservice接口

webservice怎样使用jmeter测试呢? 测试样例url=http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl 如下创建sample为soap/xml-rpc  url:要测试的wsdl soapAction:要测试的具体函数 RPC Data:远程调用和应...

黑马程序员——JAVA学习笔记八(集合)

1,    JAVA最初版本只为最常用的数据结构提供了很少的一组类:Vector、Stack、Hashtable、BitSet与Enumeration接口,从JAVA1.2版本开始推出了一组功能完善的的数据结构。 集合类的由来:  对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。  就使用集合容器进行存储。 集合特点: 1,用于存储对象的容器...

SpringMVC类型转换、数据绑定

SpringMVC类型转换、数据绑定详解[附带源码分析] 目录 前言 属性编辑器介绍 重要接口和类介绍 部分类和接口测试 源码分析 编写自定义的属性编辑器 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一。  如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0...

perl weixin webwxbatchgetcontact 接口

webwxbatchgetcontact 返回全部群信息 这个 webwxgetcontact 只是批量获取 群组或者好友的详细信息 Post 请求: https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact? type=ex &r=1454120072706 &lang=z...

MyX5TbsPlusDemo【体验腾讯浏览服务Android SDK (TbsPlus 版)】

版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 按照官网上的说明:只需接入aar文件和调用一个接口即可完成TBS接入,我们会通过全屏Activity展示TBS WebView,适用于快速接入TBS且常规使用WebView的开发者。 按照接入文档中的说明:tbsplus是在tbs sdk 完整版基础上提供的开发者一键接入的AAR包,开发者...

HTML5 文件处理之FileAPI简介整理

  在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅长的处理之一。但文件处理,尤其是二进制文件处理,一直是个空白。在一些情况下,我们不得不通过Flash/ActiveX/NP插件或云端的服务器处理较为复杂或底层的数据。今天,HTML5的一系列新规范正在致力于让浏览器具备更强大的文件处理能力。 今天要介绍...