在教程一中,我们学习了Android碎片化产生的原因以及解决的方案Treble。在教程二中,我们明白了Treble如何解耦HAL实现和系统framework层,避免在HAL层重复处理。
为了使Treble能够工作并将HAL与核心框架层分离,对现有订单binder基础架构进行了大量更改。主要是以下两个方面。
- 支持多个binder节点实例
- 每个binder设备都对应着自己的selinux上下文环境
- 每个binder设备都有对应的自己的service manager
每个binder设备都有自己的上下文管理器,因此在逻辑上与其它设备分离。
上面的Treble架构显示了Binder通信基础架构的重要性。所有的跨进程通信都需要使用binder接口。这对开发人员是透明的,就像是本地调用一样。
实现框架和HAL解耦,binder起着非常重要的作用。binder通信也在Framework和HAL之间使用,通信接口由HIDL定义(Hardware Interface Description Language)。
在Treble中,添加了多个Binder设备。但是,binder驱动程序的核心实现原理并没有改变。
由于Android框架和HAL现在使用Binder进行相互通信。这种通信大大增加了Binder的流量。
为了在framework(设备无关)和vendor(设备特定)代码之间有效的分割Binder流量,Andorid O引入了“Binder Context”的概念。
每个Binder Context都有自己的设备节点和context(service)管理器。你只能通过上下文管理器所属的设备节点访问它,并且当Binder node通过特定上下文传递时,上下文管理器只能由另一个进程从相同的上下文来进行访问,从而确保这些域完全隔离彼此。
/dev/binder,/dev/hwbinder&/dev/vndbinder被初始化,并且上下文与它们相关联。
为了实现HAL和框架的正确解耦,Treble通过添加两个管理器来扩展现有的ServiceManager框架。
总而言之,我们现在有3个不同的Manager,它们使用不同的binder节点进行IPC并实现解耦。分别如下
- ServiceManager (/dev/binder)
- HwServiceManager (/dev/hwbinder)
- VndServiceManager (/dev/vndbinder)
binder和vndbinder都使用libbinder.so库(hwbinder使用libhwbinder.so库),当打开binder设备时,我们需要调用ProcessState::initWithDriver("/dev/vndbinder")
来指定要打开的binder设备。
除了现在使用Android.bp(blueprint - 现在Android使用soong和GO语言进行编译构建代码)之外,ServiceManager没有做太多的变化。
ServiceManager和VndServiceManager用的是同一份代码,Android.bp编译出了两个名称不同的程序。
代码路径:frameworks/native/cmds/servicemanager
在早期版本的Android中,所有服务都是使用ServiceManager注册的,它们的获取与使用也都是通过ServiceManager。
在Android O之后,SeriviceManager仅用于framework和application进程的使用,vendor进程无法使用ServiceManager进行IPC通信。
但是,vendor服务现在可以使用VndServiceManager,这是使用/dev/vndbinder而不是/dev/binder的ServiceManager的新实例。
ServiceManager和VndServiceManager都是使用service_manager.c编译的。主要区别如下:
- 使用/dev/vndbinder作为vndservicemanager可执行文件的额外参数
- 使用不同的sepolicy上下文
Treble中最重要和区别最大的service manager是HwServiceManager。
由于它使用HIDL [Hardware interface description language 硬件接口描述语言],因此需要大量的修改,与VndServiceManager不同,它无法重复使用
HwServiceManager源码路径:system/hwservicemanager
由上面那张蓝图可知,ServiceManager和vndservicemanager使用的都是libbinder库[使用的binder节点不一样],hwservicemanager使用的是libhwbinder库。
参考文章
原文
如果无法访问原文,你需要的可能是一把梯子~