HIDL是什么,Binder是什么?

HIDL(发音”hide-l”),全称HAL Interface Definition Language(HAL 接口定义语言),其诞生目的是使Android 可以在不重新编译HAL的情况下对Framework进行OTA升级(在线升级系统).

HIDL可以用于进程间通信(IPC),而进程间的通信通常采用Binder机制

Binder是Android系统进程间通信(IPC)方式之一。Linux已经拥有的进程间通信IPC手段(Internet Process Connection)包括: 管道(Pipe),信号(Signal), 跟踪(Trace),插口(Socket),报文队列(Message),共享内存(Share Memory)和信号量(Semaphore)。Binder是Android的主要IPC方式

Binder基于Client-Server通信模式。对于server端而言,Binder是一个访问接入点,client通过这个接入点来对server发送请求;对client端而言,Binder是通向server的入口,client想与某个server通信必须先得到入口许可。

Binder是面向对象的。Binder可以看成是server端的一个实体对象,该对象提供了一套方法(类的成员函数)来实现client端的请求;而client端通过Binder的引用(叫指针也行)来访问server。为什么要面向对象呢?因为Binder的实体位于server这个进程,而它的引用却遍布各个client进程中,这淡化了进程间通信过程,整个系统仿佛运行在同一个面向对象的程序之中。也就是说本来毫无联系的不同进程,被形形色色的Binder对象和它星罗棋布的引用粘结在一起了,这也是binder的原意:胶水。

Binder机制

Binder框架包括四个部分client,server,servicemanager和Binder驱动。Android8.0以后servicemanager 现在专供Framework使用,而应用进程和供应商进程无法再对其进行访问。

不过,供应商服务现在可以使用 vndservicemanager。将这四部分与网络通信进行类比:client是客户端,server是服务器端,servicemanager是域名服务器(DNS),Binder驱动是路由器。

首先,server要向servicemanager注册Binder实体对象和名字(就像一个网站除了有ip地址还要有自己的网址),然后client就可以根据名字向servicemanager请求Binder的引用。Servicemanager就从查找表中找到该名字对应的条目,从条目中取出Binder的引用并发给client。Binder驱动在整个过程中负责传递数据。这里面有个问题:server是一个进程,servicemanager也是一个进程,那server在向servicemanager注册Binder时 是一个进程间通信过程,这又要用到Binder机制。这就好像是蛋可以孵出鸡,但前提却是你要找只鸡来生蛋。

解决办法和网络通信类似:首先你得预先配置好DNS的服务器地址,其他服务器或者客户端才能访问这个DNS服务器。同样地,servicemanager是一个服务器,它通过BINDER_SET_CONTEXT_MGR命令将自己注册成servicemanager,这时Binder驱动会自动为它创建一个Binder实体(造一只鸡来生蛋),而Binder的引用都会在客户端(这时server和client被视为客户端)被自动创建为0号引用(相当于DNS的地址)。于是client和server就可以用0号引用来访问servicemanager了。

猜你喜欢

转载自blog.csdn.net/Coppa/article/details/107357447