前言:
apk是怎么安装的?资源是怎么加载的?AIDL究竟是什么?Binder又是啥?等等这样的疑问,今天起就开始一一揭开。
先来一张图(网络图)感受一下:
今天重点先分析Binder。
知识准备
在讲解Binder前,我们先了解一些Linux的基础知识。
进程空间划分
- 一个进程空间分为 用户空间 & 内核空间(Kernel),即把进程内 用户 & 内核 隔离开来。
- 二者区别:进程间,用户空间的数据不可共享,所以用户空间 = 不可共享空间;进程间,内核空间的数据可共享,所以内核空间 = 可共享空间 。
所有进程共用1个内核空间
- 进程内 用户空间 & 内核空间 进行交互 需通过 系统调用,主要通过函数:
- [x] copy_from_user():将用户空间的数据拷贝到内核空间
- [x] copy_to_user():将内核空间的数据拷贝到用户空间
进程隔离 & 跨进程通信( IPC )
- 进程隔离
为了保证 安全性 & 独立性,一个进程 不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的 - 跨进程通信( IPC )
即进程间需进行数据交互、通信 - 跨进程通信的基本原理
a. 而Binder的作用则是:连接 两个进程,实现了mmap()系统调用,主要负责 创建数据接收的缓存空间 & 管理数据接收缓存
b. 注:传统的跨进程通信需拷贝数据2次,但Binder机制只需1次,主要是使用到了内存映射。
Binder 跨进程通信机制
模型原理步骤说明
以上内容参考:Android跨进程通信:图文详解 Binder机制 原理,如若侵权,请联系作者删除
Binder组成
(划重点了,作为APP开发人员👆上面的内容不是非必须的,下面的知识点是必须掌握的)
- Binder分为Client和Server两个进程
- [x] Client和Server是相对的,谁发消息,谁就是Client,谁接受消息,谁就是Server。
- Binder组成。
整个通信过程过程可以看做一个拨打电话进行通信的过程,ServericeManager相当于一个电话局,张三(Client)给李四(Server)打电话,电话局先解析电话号码的地址。有的话就可以拨通,没有的话,就报错。
- Binder通信过程
AIDL原理
AIDL是Binder的延伸。
Android系统中很多系统服务都是AIDL,比如剪切板,双进程守护。这里举例一下双进程守护:
|
|
AIDL重要的几个类:
- IBinder
- IInterface
- Stub
- Binder
- Proxy
AIDL中涉及到的类图:
- 1234MyService.asInterface(service).getName()```asInteface作用是判断当前进程是否和自己再同一个进程。Stub调用自己的asInterface方法发现不在同一个进程之内,就调用Proxy的getName()- Proxy在自己的getName方法中,会使用Parceable来准备数据,把函数名称、函数参数都写入_data,让_reply接受函数返回值,最后调用IBinder的transact,就可以把数据传递给Binder的Server端。
//通过 调用代理对象的transact() 将 上述数据发送到Binder驱动
mRemote.transact(Stub.TRANSACTION_getName, _data, _reply, 0);12- Server通过onTransact方法接受Client传递过来的数据,包括函数名称、函数参数,找到对应的函数,这里是getName(),把参数传递过去。所以onTransact方法经历了:读数据、执行要调用的函数、把执行结果再写入数据。//收到Binder驱动通知后,Server 进程通过回调Binder对象onTransact()进行数据解包 & 调用目标方法
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { // code即在transact()中约定的目标方法的标识符 switch (code) { case INTERFACE_TRANSACTION: { reply.writeString(DESCRIPTOR); return true; } case TRANSACTION_getName: { // a. 解包Parcel中的数据 // a1. 解析目标方法对象的标识符 data.enforceInterface(DESCRIPTOR); // a2. 获得目标方法的参数 java.lang.String _result = this.getName(); reply.writeNoException(); // c. 将计算结果写入到reply reply.writeString(_result); return true; } } // 2. 将结算结果返回 到Binder驱动 return super.onTransact(code, data, reply, flags); }
```
四大组件的启动和后续流程,都是在和AMS打交道,四大组件给AMS发消息,四大组件就是Client Binder , AMS就是Server Binder,反之,角色替换。
参考:
- Android系统源代码情景分析(第三版) 罗升阳著
- Android插件化开发指能 包建强著
- 项目Demo代码分析
- Android跨进程通信:图文详解 Binder机制 原理
声明:此为原创,转载请联系作者
作者:微信公众号添加公众号-遛狗的程序员 ,或者可以扫描以下二维码关注相关技术文章。
当然喜爱技术,乐于分享的你也可以可以添加作者微信号: