Android高级-架构师-Binder核心原理1

本文深入探讨了Binder机制在Android系统中的作用,解释了其如何实现进程间通信,包括Binder的由来、重要角色如Server、Client、ServiceManager及Binder驱动的作用,以及AIDL在Binder通讯中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:什么是Binder?

Binder可以实现进程与进程之间的通信。

        

 (1)为什么感觉Binder很陌生

 (2)为什么要学习Binder

    

Binder在相当于一个服务接入点,我提供了服务,你要对接我,我给你提供一个接入点,这个接入点就是Binder

而对于客户端而言,binder可以看成是通向某个管道的入口,要想和某个服务进行通讯,首先要建立这个管道。

从上图来看,个人电脑是客户端,应用服务器就是系统提供的一些服务,而binder就相当于是路由器,而ServiceManager就相当于一个DNS服务器,

没有路由器就不能上网,所以如果没有binder就不能访问其他进程和服务。

例如上图,如果可客户端想发起请求,查询www.google.com的网址,那么到了路由器以后就会通过serviceManager去查询有没有这个网址,如果没有,就返回404;

如果有,那么就将www.google.com对应的ip地址:192.168.245.123返回给客户端,然后客户端在去请求这个地址,然后服务器在将数据返回请求的数据。

2:Binder的由来

原来Linux内核提供了很多进程间的通讯,他尝试了很多方式,比如socket,共享内存等等,管道通常指的是半双工管道,指的就是A给B通讯,B给A通讯,是两件事情,有点类似于对讲机

Binder机制通讯的时候就会对通讯双方都进行一个身份验证,所以他是安全的。

传统的ipc协议,把数据进行管道中,容易被拦截。

android每个安装的apk都会分配uid,就是userid,pid就是进程id,基于c/s架构,传输过程仅通过一次copy。具体的后面再学习

3:Binder四个重要的角色

1:Server

2:Client

3:ServiceManager

4:Binder驱动

Clinet 和Server是相对的

前三者是用户空间,而Binder是内核空间,用户空间是不能进程间通讯的,而内核空间是可以共享空间的。

ServiceManager相当于DNS服务器,他是作为Client和Server之间的桥梁:

Client可以通过ServiceManager拿到Server中Binder实体的引用:如果服务器想给客户端提供服务,那么就需要通过ServiceManager来注册一个信息,这个信息就是Binder的引用注册到ServiceManager中,而Client如果想要访问服务器的话,就必须要提供一个key(www.google.com)和这个引用来进行访问。通过ServiceManager内部的map链表提取出来,通过这个key就可以拿到对应的引用。

而android内部都是通过Binder去跟系统进行交互的,比如获取音量

    getSystemService(Context.AUDIO_SERVICE);

  Servicemanager提供注册的时候,其实也是服务端,我们需要对很对系统的服务提供注册的功能.

ServiceManager作为服务端的时候比较特殊,他提供的Binder对象没有名字,也不需要注册,当一个进程使用Binder.setContextMgr命令把自己注册为ServiceManager的时候,Binder驱动就会自动为他创建Binder的实体,而Binder实体所在的引用所有的Client都为0,这样就可以进行进程间的通讯了。

而Binder驱动又是什么呢?

Binder驱动是负责进程之间Binder的建立,Binder是通讯的,因为进程之间根本没办法交互,所以都是通过Binder的驱动来进行交互的。

Binder驱动是一个线程池。是由Binder驱动来进行管理。一个BInder最大的线程池最大的线程数是50,

4:AIDL是什么?

AIDL:Android Interface Definition Language,是android的接口定义语言

Binder之前的通讯是需要统一一个语言,这种架构就是AIDL.

5:Binder的四个重要的对象

1:IBinder:是一个接口,代表跨进程通讯的能力或者功能,只要实现这个接口就可以跨进程传输了

2:IInterface:代表Server进程对象代表能够提供什么样的功能,什么样的方法,对应的就是AIDL定义的接口。

3:Binder:java层的Binder类,代表的就是Binder的本地对象,这里需要;了解这个BinderProxy,我们需要一个本地的代理来操    作Binder,通过BinderProxy来操作Binder。

4:Stub:就是Aidl的时候,编译工具会自动生成一个stub的静态内部类,他是继承了Binder,实现了IInterface的接口,表明具备了服务端对Clinet承诺接口的能力。他是一个抽象类,具体的实现需要我们自己去做

其中Binder和BinderProxy都是继承于IBinder的,所以他们都具备了跨进程传输的能力。实际上,在跨进程的时候,Binder驱动会自动的完成这两个对象的转换。

5:Binder的通讯机制

6:小知识补充

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值