Android 进程通讯机制之Binder(信使)架构以及内存映射详解(1)

IInterface plus = new IPlus(){

// 确定Client进程需要调用的方法

public int add(int a,int b) {

return a+b;

}

// 实现IInterface接口中唯一的方法

public IBinder asBinder(){

return null ;

}

};

// 步骤3

binder.attachInterface(plus,“add two int”);

// 1. 将(add two int,plus)作为(key,value)对存入到Binder对象中的一个Map<String,IInterface>对象中

// 2. 之后,Binder对象 可根据add two int通过queryLocalIInterface()获得对应IInterface对象(即plus)的引用,可依靠该引用完成对请求方法的调用

// 分析完毕,跳出

<-- 分析1:Stub类 -->

public class Stub extends Binder {

// 继承自Binder类 ->>分析2

// 复写onTransact()

@Override

boolean onTransact(int code, Parcel data, Parcel reply, int flags){

// 具体逻辑等到步骤3再具体讲解,此处先跳过

switch (code) {

case Stub.add:{

data.enforceInterface(“add two int”);

int arg0 = data.readInt();

int arg1 = data.readInt();

int result = this.queryLocalIInterface(“add two int”) .add( arg0, arg1);

reply.writeInt(result);

return true;

}

}

return super.onTransact(code, data, reply, flags);

}

// 回到上面的步骤1,继续看步骤2

<-- 分析2:Binder 类 -->

public class Binder implement IBinder{

// Binder机制在Android中的实现主要依靠的是Binder类,其实现了IBinder接口

// IBinder接口:定义了远程操作对象的基本接口,代表了一种跨进程传输的能力

// 系统会为每个实现了IBinder接口的对象提供跨进程传输能力

// 即Binder类对象具备了跨进程传输的能力

void attachInterface(IInterface plus, String descriptor);

// 作用:

// 1. 将(descriptor,plus)作为(key,value)对存入到Binder对象中的一个Map<String,IInterface>对象中

// 2. 之后,Binder对象 可根据descriptor通过queryLocalIInterface()获得对应IInterface对象(即plus)的引用,可依靠该引用完成对请求方法的调用

IInterface queryLocalInterface(Stringdescriptor) ;

// 作用:根据 参数 descriptor 查找相应的IInterface对象(即plus引用)

boolean onTransact(int code, Parcel data, Parcel reply, int flags);

// 定义:继承自IBinder接口的

// 作用:执行Client进程所请求的目标方法(子类需要复写)

// 参数说明:

// code:Client进程请求方法标识符。即Server进程根据该标识确定所请求的目标方法

// data:目标方法的参数。(Client进程传进来的,此处就是整数a和b)

// reply:目标方法执行后的结果(返回给Client进程)

// 注:运行在Server进程的Binder线程池中;当Client进程发起远程请求时,远程请求会要求系统底层执行回调该方法

final class BinderProxy implements IBinder {

// 即Server进程创建的Binder对象的代理对象类

// 该类属于Binder的内部类

}

// 回到分析1原处

}

<-- 分析3:IInterface接口实现类 -->

获取服务

Client进程 使用 某个 service前,须 通过Binder驱动 向 ServiceManager进程 获取相应的Service信息,Client进程与 Server进程已经建立了连接

使用服务

Client进程 根据获取到的 Service信息(Binder代理对象),通过Binder驱动 建立与 该Service所在Server进程通信的链路,并开始使用服务

  • Client进程 将参数(整数a和b)发送到Server进程

  • Server进程 根据Client进程要求调用 目标方法(即加法函数)

  • Server进程 将目标方法的结果(即加法后的结果)返回给Client进程

四.Binder与内存映射mmap


Binder IPC 是基于内存映射(mmap)来实现的,但是 mmap() 通常是用在有物理介质的文件系统上的。

进程中的用户区域是不能直接和物理设备打交道的,如果想要把磁盘上的数据读取到进程的用户区域,需要两次拷贝(磁盘–>内核空间–>用户空间);通常在这种场景下 mmap() 就能发挥作用,通过在物理介质和用户空间之间建立映射,减少数据的拷贝次数,用内存读写取代I/O读写,提高文件读取效率。

而 Binder 并不存在物理介质,因此 Binder 驱动使用 mmap() 并不是为了在物理介质和用户空间之间建立映射,而是用来在内核空间创建数据接收的缓存空间。

一次完整的 Binder IPC 通信过程通常是这样:

首先 Binder 驱动在内核空间创建一个数据接收缓存区;

接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;

发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

完工,有问题评论

最后


小编在网上收集了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等等文档,希望能帮助到大家学习提升,如有需要参考的可以直接去我 GitHub地址:https://github.com/733gh/Android-T3 访问查阅。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。

技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;

我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言

高级UI与自定义view;
自定义view,Android开发的基本功。

性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。

NDK开发;
未来的方向,高薪必会。

前沿技术;
组件化,热升级,热修复,框架设计

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多

当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。

不出半年,你就能看出变化!

化,热升级,热修复,框架设计

[外链图片转存中…(img-bfnlsquT-1711911666934)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多

当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。

不出半年,你就能看出变化!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值