Android开发经验谈Android开发

深入Android系统Binder-1-导读与简介

2020-09-06  本文已影响0人  Android进阶架构

作者:apigfly

简单的开始

我们先简单了解下binder架构涉及的几个概念:

一个简单版本的跨进程调用的流程:

需要简单区分的两个名词:

Binder的一些疑问

第一个问题,客户进程要调用服务进程的函数,怎么确认要调用哪一个服务呢?又怎么知道要调用哪个函数呢?

我们先看几个知识点:

第二个问题,我们自己写的服务什么时候启动的呢?

从常理来讲,我们的服务要在进程启动的时候就要开始监听外界的消息了,不然万一错过消息怎么办。

Binder也是这样做的:

servicemanager 怎么没占多少篇幅呢?

首先这不是一个问题,哈哈哈哈!

导读结束

binder导读部分对一些知识点的描述比较简单。细节还是看正文

binder的学习比时间晚了两周。。。。。

好在真滴可以学到不少东西,下面是正文,谨慎阅读


Binder 简介

Binder是Android特有的一种进程间通信方式。Android Binder的前身是 OpenBinder,最早由 Dianne Hackborn 开发并用于PalmOS上,后来Dianne Hackborn加入了Google,在OpenBinder的基础上开发了Android Binder

Binder和传统的IPC机制相比,融合了远程过程调用(RPC)的概念,而且这种远程调用不是传统的面向过程的远程调用,而是一种面向对象的远程调用。

从Unix发展而来的IPC机制,只能提供比较原始的进程间通信手段,通信的双方必须处理线程同步、内存管理等复杂问题,不但工作量大,而且容易出错。

除了Socket、匿名管道以外,传统的IPC,例如命名管道、信号量、消息队列等已经从Android中去掉了。

和其他IPC相比,Socket是一种比较成熟的通信手段,同步控制也很容易实现。Socket用于网络通信非常合适,但是用于进程间通信,效率就不太高了。

Android在架构上一直希望模糊进程的概念,取而代之以组件的概念。应用不需要关系组件的存放位置、运行在哪个进程、生命周期等问题。随时随地,只要拥有Binder对象,就能使用组件功能。Binder就像一张网,将整个系统的组件,跨越进程和线程,组织在了一起。

Binder很强大也很复杂。但我们在使用时却是一件很轻松的事情,不需要考虑线程同步、内存分配等问题。这些复杂的事情都在Binder框架中完成了。

正因为如此,Android系统的服务都是利用Binder构建的。Android系统服务有几十种之多,这是任何一个其它嵌入式平台所不具备的。

Android在进程间传递数据使用的是共享内存的方式,这样数据只需要复制一次就能从一个进程到达另一个进程(一般的IPC都需要两步,从用户进程复制到内核,再从内核复制到服务进程),大大提高了数据传输效率。

在安全性方面Android也做了考虑,Binder调用时会传递进程的euid到服务端,因此,服务端可以通过检查调用进程的权限来决定是否允许其使用所调用的服务。

大家可以阅读下知乎大神的 为什么 Android 要采用 Binder 作为 IPC 机制? 来加深下了解,文章有惊喜

Binder对象定义

为了理解方便,把Binder相关的对象进行如下定义:

Binder接口对象主要和应用程序打交道,将Binder接口对象Binder引用对象分开的好处就是Binder接口对象可以有很多实例,但是它们包含的是同一个Binder引用对象这样方便了用户层的使用

关系图如下:

应用完全可以抛开Binder接口对象直接使用Binder引用对象,但是这样开发的程序兼容性不好。也正是因为在客户端将Binder引用对象Binder接口对象分离,Android才能用一套架构来同时为Java层Native层提供Binder服务。隔离后Binder底层不需要关心上层的实现细节,只需要和Binder实体对象Binder引用对象进行交互。

Binder的架构

Binder通信的参与者由4部分组成:

关系图如下:

Binder 驱动的简单解释:

ServiceManager的简单解释:

Binder服务可以分成两种:实名服务匿名服务。除实名服务能够通过ServiceManager查询到外,它们从开发到使用没有任何其他区别。

对于普通应用开发的Binder服务,都是匿名服务。对于匿名服务无法通过ServiceManager获取,那么客户端通过什么方式才能获得Binder引用对象呢?

匿名Binder这部分暂时收集到的资料就是这些,等学习完后面的再来补充吧

组件Service和匿名Binder服务

Android组件Service包含了一种启动Java匿名Binder服务的方法,我们来简单看下

在这里Android的FrameworkIntent代替了Binder服务的名称来查找对应的服务,同时也承担了ServiceManager的工作,解析Intent并传回服务的引用对象。如图:

Android的Framework并没有使用新的技术来传递Binder对象,因为Framework中担任这个角色的ActivityManagerService本身就是一个Binder服务,最终还是通过Binder框架在服务端和客户端之间传递了IBinder对象

Binder的层次

从代码实现上划分,Binde设计的类可以分为4个层次,如图:

从图上看,libbinder被拆分成了两个层次,主要原因是:

这些正是Binder架构被人诟病的地方,驱动和应用层之间过于耦合了,违反了Linux驱动设计的原则,因此,主流的Linux并不愿意接纳Binder

上一篇下一篇

猜你喜欢

热点阅读