HIDL是用于指定HAL与其用户之间接口的一个接口描述语言(Interface Description Language,发音为“hide-l”)。HIDL允许指定类型和方法调用(会汇集到接口和软件包中)。从更广泛的意义上来说,HIDL是用于在可以独立编译的代码库之间进行通信的系统。
HIDL旨在用于进程间通信 (IPC)。进程之间的通信经过Binder化。对于必须与进程相关联的代码库,还可以使用直通模式(在 Java 中不受支持)。
HIDL的设计目的:主要是将Framework和HAL隔离开,Framework可以单独覆盖、更新而不用对HAL做改动。引入HIDL,可以将HAL从
system.img
中移除出去,方便Android版本的升级。
二、HIDL架构模式
HIDL的演化历程:
什么是Binder化?
一直以来,供应商进程都使用Binder进程间通信(IPC)技术进行通信。在Android O中,
/dev/binder
设备节点成为了框架进程的专属节点,这意味着供应商进程将无法再访问该节点。供应商进程可以访问/dev/hwbinder
,但必须将其AIDL接口转为使用HIDL。
三、软件包
软件包前缀 | 位置 |
---|---|
android.hardware.* | hardware/interfaces};
// interface methods
create(int32_t id) generates (MyStruct s);
close();
};
不含显式 声明的接口会从 (类似于Java中的 )隐式扩展。
五、导入
语句是用于访问其他软件包中的软件包接口和类型的HIDL机制。 语句本身涉及两个实体:
导入实体:可以是软件包或接口。
被导入实体:也可以是软件包或接口。
导入实体由 语句的位置决定。当该语句位于软件包的 中时,导入的内容对整个软件包是可见的;这是软件包级导入。当该语句位于接口文件中时,导入实体是接口本身;这是接口级导入。被导入实体由 关键字后面的值决定。该值不必是完全限定名称;如果某个组成部分被删除了,系统会自动使用当前软件包中的信息填充该组成部分。对于完全限定值,支持的导入情形有以下几种: 完整软件包导入 如果该值是一个软件包名称和版本(语法见下文),则系统会将整个软件包导入至导入实体。
部分导入
如果值为: 一个接口,则系统会将该软件包的 和该接口导入至导入实体中。
在 中定义的UDT,则系统仅会将该UDT导入至导入实体中(不导入 中的其他类型)。
仅类型导入
如果该值将上文所述的“部分导入”的语法与关键字types而不是接口名称配合使用,则系统仅会导入指定软件包的 中的UDT。
六、接口继承
接口可以是之前定义的接口的扩展。扩展可以是以下三种类型中的一种: 接口可以向其他接口添加功能,并按原样纳入其API。 软件包可以向其他软件包添加功能,并按原样纳入其API。 接口可以从软件包或特定接口导入类型。接口只能扩展一个其他接口(不支持多重继承)。 七、接口哈希 哈希是一种旨在防止意外更改接口并确保接口更改经过全面审查的机制。这种机制是必需的,因为HIDL接口带有版本编号,也就是说,接口一经发布便不得再更改,但不会影响应用二进制接口(ABI)的情况(例如更正备注)除外。 的 或映射到 的 )都必须包含一个列出所有已发布HIDL接口文件的 文件。
是安卓架构HIDL编译工具。它的源码目录为 ,编译生成的可执行文件路径为 ,可以手动将哈希添加到 文件中,也可以使用 添加。以下代码段提供了可与 搭配使用来管理 文件的命令示例(哈希已缩短):
生成的每个接口定义库都包含哈希,通过调用 可检索这些哈希。
八、注册服务
HIDL接口服务器(实现接口的对象)可注册为已命名的服务。注册的名称不需要与接口或软件包名称相关。如果没有指定名称,则使用名称“默认”;这应该用于不需要注册同一接口的两个实现的 HAL。例如,在每个接口中定义的服务注册的C++调用是:
HIDL接口的版本包含在接口本身中。版本自动与服务注册关联,并可通过每个HIDL接口上的方法调用 )进行检索。服务器对象不需要注册,并可通过HIDL方法参数传递到其他进程,相应的接收进程会向服务器发送HIDL方法调用。
九、发现服务
客户端代码按名称和版本请求指定的接口,并对所需的HAL类调用 :
每个版本的HIDL接口都会被视为单独的接口。因此,IFooService版本1.1和IFooService版本2.2都可以注册为 ,并且两个接口上的 都可获取该接口的已注册服务。因此,在大多数情况下,注册或发现服务均无需提供名称参数(也就是说名称为“默认”)。
十、服务终止通知
想要在Service终止时收到通知的客户端会接收到框架传送的终止通知。要接收通知,客户端必须: 将HIDL类/接口 (位于C++代码中,而非HIDL中)归入子类。
替换其 方法。
实例化 子类的对象。
在要监控的服务上调用 方法,并传入 的接口对象。请注意,此方法并不具备在其上调用它的终止接收方或代理的所有权。
伪代码示例:
作者:jaronho
免责声明: ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。 ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341 软考中级精品资料免费领
相关文章发现更多好内容
猜你喜欢AI推送时光机Android 框架学习(4)—— HIDL移动开发2022-06-06 每天学习一个Android中的常用框架——4.OkIo移动开发2022-06-06 Python Behave框架学习移动开发2024-04-02 HBase框架学习之路移动开发2024-04-02 spring框架学习总结移动开发2024-04-02 Python Web框架Django学习移动开发2023-01-31 Django框架基础学习移动开发2024-04-02 如何学习Ajax 框架移动开发2024-04-02 学习canvas框架 详解常用的canvas框架移动开发2024-01-17 Android学习之4种基本布局移动开发2022-06-06 学习笔记-TP5框架学习笔记\(路由\)移动开发2023-10-25 Python爬虫框架Scrapy 学习移动开发2023-01-31 sails框架的学习指南移动开发2022-06-04 python web框架学习笔记移动开发2022-06-04 每天学习一个Android中的常用框架——1.Litepal移动开发2022-06-06 每天学习一个Android中的常用框架——5.Retrofit移动开发2022-06-06 PHP之CI框架学习讲解移动开发2024-04-02 Spring框架学习之AOP详解移动开发2024-04-02 咦!没有更多了?去看看其它编程学习网 内容吧 |