1 android 提供了一套system img与vendor image 通信的机制,为hal定义了一套接口语言,类似aidl
2 HIDL其实也是一套binder 通信机制,只是该通信机制的driver使用的是hw binder。android 提供了对应的hw servicemanager,IPCThreadState和ProcessState的等binder code,与正常binder功能差不多。
3 定义的HIDL 类似aidl,是一个文件,该文件中定义了通信的接口。有了该接口文件,android 系统会自动生成对应的client和server code,这些code生成在out 目录下,已经内部封装好,可以直接使用。
4 hidl-gen 是上述3中自动生成的工具,code是在/system/tools/hidl/ 中。
5 生成的code 内部有****ALL,Bp****, Bs***, Bn***, ALL中有getService和registerService的实现。
6 hwservicemanager与servicemanager 相同,都是提供查询的功能,hidl register的service都是存放给它进行管理,有使用map进行管理,不知最近版本是否有修改。
7 HIDL有几种模式:passthrough 、binderized
8 HIDL 定义了一些基本数据结构,hidl_string/hidl_handle/hidl_memory/hidl_vec 等
9 HIDL 分为passthrough和binderize两种, passthrough是兼容旧的hal,client/server 同进程, binderied则client和server是不同进程。
10 hidl 可以直接生成java 类,HIDL生成的代码里面,实现了jni的各种注册、通信等操作。避免了jni代码的重复编写 [引用自评论]。
11 hidl 有定义system/libhidl/vintfdata/manifest.xml, 如下 指定hidl service的名称类型及version。
告诉系统所有的hidl service和相关信息, version 是main.sub,
如果有多个version,main不能相同,如果1.2和2.0是可以的,但1.2和1.3 是不能同时存在的。
这边是影响hwservicemanager的实现部分
<hal>
<name>android.system.net.netd</name>
<transport>hwbinder</transport>
<version>1.1</version>
<interface>
<name>INetd</name>
<instance>default</instance>
</interface>
</hal>
若manifest.xml 中没定义,则getService(true) 可以调用使用(类似定义的transport 为passthrough);直接使用getService(false) 会获取不到。
若manifest.xml 中定义transport为hwbinder ,实际上是passthrough 的hidl service ,如tvinput,可以正常使用
若manifest.xml 中定义transport为passthrough,实际上是hwbinder,则获取的仅仅是BsXXXX,没有办法进行跨进程间通信。
12 hidl 在新版已经被deprecated ,替换成aidl了