Android Treble结构:Part 3 - Binder基础架构的改变

介绍

在教程一中,我们学习了Android碎片化产生的原因以及解决的方案Treble。在教程二中,我们明白了Treble如何解耦HAL实现和系统framework层,避免在HAL层重复处理。
Android Treble结构:Part 3 - Binder基础架构的改变_第1张图片

Android Treble结构:Part 3 - Binder基础架构的改变_第2张图片
在本教程中,让我们开始详细了解Treble前后的主要差异。

Binder变化

为了使Treble能够工作并将HAL与核心框架层分离,对现有订单binder基础架构进行了大量更改。主要是以下两个方面。

  • 支持多个binder节点实例
  • 每个binder设备都对应着自己的selinux上下文环境
  • 每个binder设备都有对应的自己的service manager

每个binder设备都有自己的上下文管理器,因此在逻辑上与其它设备分离。
Android Treble结构:Part 3 - Binder基础架构的改变_第3张图片

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被初始化,并且上下文与它们相关联。
Android Treble结构:Part 3 - Binder基础架构的改变_第4张图片

ServiceManager变化

为了实现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设备。

ServiceManager

除了现在使用Android.bp(blueprint - 现在Android使用soong和GO语言进行编译构建代码)之外,ServiceManager没有做太多的变化。

VndServiceManager

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上下文

HwServiceManager

Treble中最重要和区别最大的service manager是HwServiceManager。
由于它使用HIDL [Hardware interface description language 硬件接口描述语言],因此需要大量的修改,与VndServiceManager不同,它无法重复使用

HwServiceManager源码路径:system/hwservicemanager

由上面那张蓝图可知,ServiceManager和vndservicemanager使用的都是libbinder库[使用的binder节点不一样],hwservicemanager使用的是libhwbinder库。

参考文章
原文

如果无法访问原文,你需要的可能是一把梯子~

你可能感兴趣的:(Android之旅)