binder通信(Android之Binder通信篇)

2024-07-13 21:33:03 21

binder通信(Android之Binder通信篇)

本文目录

Android之Binder通信篇

Binder跨进程通信的本质是依赖内核驱动将属于不同Binder进程的数据,从原始进程复制到目标进程,这样就完成了跨进程通信了。

Binder通过独特的内存映射机制,在跨进程通信时,可以做到一次拷贝,两个空间同时使用!如下图:

Binder跨进程通信是要传递数据的,既然有数据必然要占用内存空间,Android系统规定每一个进程都有一块Binder内存区,也就是图1中的 共享内存 ,系统最多只能给该区域分配4M的物理内存,由于申请这块内存是通过系统的mmap函数完成的,所以整个映射机制又被称为mmap机制 为了把这部分说明白,就再盗图一张,命名图2吧!

对于Binder驱动,通过 binder_procs 链表记录所有创建的 binder_proc 结构体,binder 驱动层的每一个 binder_proc 结构体都与用户空间的一个用于 binder 通信的进程一一对应,且每个进程有且只有一个 ProcessState 对象,这是通过单例模式来保证的。在每个进程中可以有很多个线程,每个线程对应一个 IPCThreadState 对象,IPCThreadState 对象也是单例模式,即一个线程对应一个 IPCThreadState 对象,在 Binder 驱动层也有与之相对应的结构,那就是 Binder_thread 结构体。在 binder_proc 结构体中通过成员变量 rb_root threads,来记录当前进程内所有的 binder_thread。

Binder 线程池:每个 Server 进程在启动时创建一个 binder 线程池,并向其中注册一个 Binder 线程;之后 Server 进程也可以向 binder 线程池注册新的线程,或者 Binder 驱动在探测到没有空闲 binder 线程时主动向 Server 进程注册新的的 binder 线程。对于一个 Server 进程有一个最大 Binder 线程数限制,默认为16个 binder 线程,例如 Android 的 system_server 进程就存在16个线程。对于所有 Client 端进程的 binder 请求都是交由 Server 端进程的 binder 线程来处理的。

Android里用 C 语言编写的应用程序怎么通过 binder 节点通信

  我不懂你的意思,什么叫C程序?你要直接call binder driver么?如果只是想在native layer里通过servicemanager 注册一个service,然后用client 去call,我过去用过这个github的project去测android binder的readwrite performance:  mcr/Android-HelloWorldService · GitHub  然后你要想办法把service run 起来,我当时很hack,直接在zygote里改了代码,强行让helloworld在系统init的时候生成,但应该有命令行给你用的,你可以在看看。  而去直接去和binder driver做交互也没问题,只要做几个ioctl call,然后起两个process,一个注册一个节点,然后另一个去写message,但我没具体实现过,你玩玩应该就出来了,我感觉过程可能就像这个shmget的example差不多 IPC:Shared Memory。  此外,Binder这东西没什么独特的,它就是把最基本的message passing:一次传输要向kernel copy paste两次(一次sender 到kernel,一次kernel到receiver,每次都有context switch)和shared memory(kernel 和 userland share 一块 内存,不用context switch)合并起来了,就是receiver和kernel共享一块内存,而sender和kernel的交互必须要严格遵守message passing的原则,于是就取了一个折中,两次copy paste就变成了一次。  此外,service manager会在自己被生成的时候现将自己注册成binder里一个最特殊的service,其他程序想要进行ipc,就必须通过binder向service manager注册,在binder生成一个unique id,然后其他client向service manager查询时候就会得到那个id,于是就能通过binder与service process建立通讯。  我过去很喜欢玩这个,还很蛋疼的在minix上把binder原理实现了一遍,还有一个大神 老罗,他研究Android native非常透彻,你可以看他博客,能够对整个Android从init到Dalvik跑起来全部了解,我现在只知道他一个,因为他把Android source code全都读了一遍:老罗的Android之旅  

Binder机制的原理

  因为Binder机制是涉及到进程的通信,所以需要对操作系统的进程通信需要有所了解。   进程的相关知识: Linux进程的学习的笔记  Binder机制相比于其他的进程通信方法更加高效,是因为使用了内存映射的机制,数据只需要复制一次。  内存映射的具体内容: 操作系统——内存映射  在介绍Binder跨进程通信之前,需要去了解一个动态内核可加载模块。  根据进程空间划分,进程之间的通信需要依赖到内核空间,例如在传统的IPC机制中,管道,Socket都时内核的一部分,因此通过内核支持来实现进程间通信时没有问题的,但是Binder并不是内核的一部分,那么怎么办呢 ?这就得益于Linux的动态内核可载模块的机制。模块时具有独立功能的程序,它可以被单独编译,但是不能独立运行,它在运行时被链接到内核作为内核的一部分运行。这样,Android系统就可以通过动态添加一个模块运行在内核空间,用户进程之间通过这个内核模块做为桥梁来实现通信。在Android系统中,这个运行在内核空间,负责各个用户进程通过Binder实现通信的内核模块就叫Binder驱动。  有了上面的所说的运行在内核空间的模块,在Android系统中是通过 内存映射 的方式来实现通信,数据的拷贝只需要一次,相比于传统的IPC机制需要两次的数据拷贝,是更加高效的。 Binder IPC是基于内存映射来实现的,但是mmap()通常是用在有物理介质的文件系统上的。比如进程中的用户区域是不能直接核物理设备打交道的,如果想要把磁盘上的数据读取到进程的用户区域,需要两次拷贝(磁盘 》》 内核空间 》》 用户空间)。通常在这种场景下mmap()就能发挥作用,通过在物理介质核用户空间之间建立映射,减少数据的拷贝次数,用内存读写代替I/O读写,提高文件读取效率。而Binder并不存在物理介质,因此Binder驱动使mmap()并不是为了在物理介质和用户空间之间建立映射,而是用来在内核空间创建数据接收的缓存空间。  Binder IPC通信过程: 示意图:  Binder是一套基于C/S架构的。由一系列的组件组成,主要包括:Client,Server,Service Manager和Binder驱动。其中Client,Service和Service Manager是在用户空间的,Binder驱动是在内核空间的。Client和Service是由用户是用户实现的,Binder驱动和Service Manager是系统实现的。Client,Server和Service Manager都可以通过系统调用open,mmap和ioctl来访问设备文件/dev/binder。从而实现与Binder驱动的交互间接实现进程间的通信。  其中 Android Bander设计与实现 - 设计篇 对上述的角色中有详细的讲解。 步骤1:使用 BINDERSETCONTEXT_MGR 命令通过Binder驱动将自己注册成为ServiceMannager。 步骤2:注册服务 步骤2:获取服务 关于Binder的原理学习,可参考 Android Binder 原理解析 和 Android跨进程通信:图文详解 Binder机制 原理 ,个人认为这两篇描述的比较详细。

Android-zygote进程通信为什么不使用Binder

首先,zygote进程在创建之后,才会创建SystemServer进程,而SystemServer进程是由zygote进程fock自身得到的,在fock自身的过程中,首先会结束自身的其他子线程,这样一来除了自身线程以外,其他线程都会被结束然后GC,而Binder是多线程模型,如果使用Binder进行进程间通信的话,则Binder线程也会被结束,而使用Binder进行进程间通信就无法做到。在fork新进程后,启动Zygote的4个Daemon线程,java堆整理,引用队列,以及析构线程。而在zygote通过fock自身创建子进程之后,如果该进程不是zygote进程,则会调用ZygoteInit.zygoteInit方法 而在zygoteInit方法中,才会对新创建的进程进行运行环境初始化工作以及启动Binder线程池。 其实Binder线程池的启动,是在SystemServer进程创建过程启动的,而在启动SystemServer的过程中,就需要传入ZygoteServer这个Zygote作为Server端的Socket,所以Zygote进程并不能使用Binder进程进行通信,而只能使用Socket。 而且,Binder线程池是在zygote进程启动之后启动的SystemServer进程中启动的,而SystemServer进程是由zygote进程fock自身得到的,所以zygote进程在启动之后,循环等待SystemServer进程的消息的时候,其实还没有Binder线程池。而且fock只支持当前线程的fock,而不支持多线程的fock,但是Binder又是一个多线程模型,在fock的时候会杀死多余的线程,这样一来,binder线程也就会被杀死,这样就没办法使用binder与SystemServer进程进行进程间通信。 fork 的行为是这样的:复制整个用户空间的数据(通常使用 copy-on-write 的策略,所以可以实现的速度很快)以及所有系统对象,然后仅复制当前线程到子进程。这里:所有父进程中别的线程,到了子进程中都是突然蒸发掉的

binder通信过程中,服务端和客户端异常处理

    起因是在使用第三方app的时候,鼠标进入第三方app后,退出进入其他app卡顿的问题。通过分析log发现有大量的System.err: android.os.DeadObjectException产生。     这个异常的产生是因为app和鼠标服务组成的cs模型中,app client突然挂掉导致,服务端产生DeadObjectException。     这里涉及到binder的死亡监听机制对服务端和客户端的处理,客户端需要调用linkToDeath去获取服务端binder的生存状态,如果binder突然挂掉,客户端就要讲binder连接remove掉。同样,如果客户端突然挂掉,服务端也需要去及时的进行处理,否则就会出现DeadObjectException。网上大多介绍了如何去对服务端的binder进行死亡监听,但是没有简洁的服务端对客户端的死亡监听(这里相当于对服务端的listener进行处理)。     首先新建一个继承 implements IBinder.DeathRecipient的listener类,然后在服务端的registerAIDLListener函数内新建一个类,然后添加linkToDeath。     实际上,测试的时候,先进入app,然后开始kill掉app进程,采用 的方法,并没有成功kill掉进程,采用 的方法会让app不在自动起,因为项目中launch会自动起该app,disable后,就无法被唤起,需要再度唤起需要     同时,如果关联进程比较多,binder可能并不会挂掉,可以尝试多杀几个关联进程,来确保binder连接挂掉     第二部分 关于对服务器binder进行的监听,网上版本比较多,同时上诉方法中,没有考虑client列表的情况,如果有多个client的情况下,需要进行listener的添加和移除,可以考虑参看如下blog

binder通信(Android之Binder通信篇)

本文编辑:admin

更多文章:


replace函数怎么还原(python中replace函数是不是无法替换原函数)

replace函数怎么还原(python中replace函数是不是无法替换原函数)

大家好,replace函数怎么还原相信很多的网友都不是很明白,包括python中replace函数是不是无法替换原函数也是一样,不过没有关系,接下来就来为大家分享关于replace函数怎么还原和python中replace函数是不是无法替换

2024年7月23日 12:33

特效师前景怎么样(特效师工作好找么)

特效师前景怎么样(特效师工作好找么)

本文目录特效师工作好找么Java程序员,cg动画师,特效师,那个前景好呢抖音特效师挣钱吗电影特效师这个职业如何前景如何特效师工作好找么我觉得特效师现在找工作非常好找,特别是游戏特效师。当然了,我说的前提是在特效这方面要有经验,所以说特效师是

2024年5月10日 04:32

国内军事新闻(新闻分为哪四类)

国内军事新闻(新闻分为哪四类)

大家好,今天小编来为大家解答以下的问题,关于国内军事新闻,新闻分为哪四类这个很多人还不知道,现在让我们一起来看看吧!本文目录新闻分为哪四类比较专业的军事论坛 最好偏重武器方面的网易军事有名的论坛作者是谁最新军事新闻哪里有,中国军事新闻网站哪

2024年9月4日 18:30

分段函数c语言(C语言 定义调用函数 求分段函数)

分段函数c语言(C语言 定义调用函数 求分段函数)

本篇文章给大家谈谈分段函数c语言,以及C语言 定义调用函数 求分段函数对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录C语言 定义调用函数

2024年9月6日 21:05

页面设置标准(word标准格式怎么设置)

页面设置标准(word标准格式怎么设置)

本文目录word标准格式怎么设置网页页面尺寸一般设置多大才合适word中页面设置怎么弄国家行政机关公文的标准“页面设置”规定是什么请教,关于政府公文中WORD格式的页面设置标准是什么样的求国家行政机关公文的标准“页面设置”规定word文档页

2024年7月4日 04:37

interesting前面加a还是an(interesting,的定冠词是a还是an)

interesting前面加a还是an(interesting,的定冠词是a还是an)

本文目录interesting,的定冠词是a还是aninteresting前为什么加an不是发噎的辅音吗.老师请细心回答.中考了急需.谢谢!what interesting film,是a还是an还是theAmy had an inter

2023年5月3日 04:20

vmware虚拟机linux怎么联网(想用虚拟机的linux连接我家wifi,虚拟机连无线的地方在哪)

vmware虚拟机linux怎么联网(想用虚拟机的linux连接我家wifi,虚拟机连无线的地方在哪)

本文目录想用虚拟机的linux连接我家wifi,虚拟机连无线的地方在哪vmware下的linux服务器怎样才能让外网访问VMWare 的linux系统没有网络的解决方案虚拟机中的linux怎么连接网络虚拟机VMware linux Nat上

2024年6月23日 21:30

terrorist怎么读(文明英文怎么读)

terrorist怎么读(文明英文怎么读)

本文目录文明英文怎么读horror;terror;terrorist;这英语怎么读文明英文怎么读文明的英文:一、civilization英  n.文明社会;文明,文化;开化,教化;修养The Victorians regarded the

2024年7月12日 03:38

网站浏览器下载(怎么下载新的浏览器)

网站浏览器下载(怎么下载新的浏览器)

本文目录怎么下载新的浏览器手机网页浏览器下载最好的浏览器下载哪些浏览器可以直接下载网页上的视频有下载浏览器网站ie浏览器怎么下载怎么在电脑上下载360浏览器怎么下载新的浏览器朋友你好,现在电脑的设置里的删除和添加程序里将原来的浏览器卸载,然

2023年5月8日 23:00

济南手机网站建设(专门做手机网站推广这块的,网站建设,优化推广一体化的,济南哪家网络优化公司好)

济南手机网站建设(专门做手机网站推广这块的,网站建设,优化推广一体化的,济南哪家网络优化公司好)

本文目录专门做手机网站推广这块的,网站建设,优化推广一体化的,济南哪家网络优化公司好济南有没有比较好的网页制作和网站建设、优化公司,本人有业务咨询~望指点济南网站建设:在网站建设中一般都需要些什么功能网站制作|购买域名在济南哪家网络公司比较

2024年6月26日 04:00

成员变量是什么意思(在声明final成员变量没有赋值时连编译都不过,那么下图的红色线表达的空白final是啥意思)

成员变量是什么意思(在声明final成员变量没有赋值时连编译都不过,那么下图的红色线表达的空白final是啥意思)

本文目录在声明final成员变量没有赋值时连编译都不过,那么下图的红色线表达的空白final是啥意思全局变量,局部变量,成员变量,静态变量,void,实例变量 ,遍历 ,引用,返回值,各是什么意思在声明final成员变量没有赋值时连编译都不

2024年7月15日 10:56

6元一年的云服务器(新睿云的云服务器包年和实时计费哪个划算)

6元一年的云服务器(新睿云的云服务器包年和实时计费哪个划算)

本文目录新睿云的云服务器包年和实时计费哪个划算怎么样买小鸟云服务器更划算云服务器怎么买才省钱自己买服务器和云服务器的一样吗小鸟云1h1g的服务器平均一天是多少钱1h1g的云服务器一年下来大概要多少钱新睿云的云服务器包年和实时计费哪个划算如果

2024年6月23日 05:39

js怎么用我的世界(《我的世界》手机版修改器JS使用方法讲解)

js怎么用我的世界(《我的世界》手机版修改器JS使用方法讲解)

本文目录《我的世界》手机版修改器JS使用方法讲解我的世界手机版矿物探测js怎么用手机版我的世界交通工具js怎么用在手机QQ上下载的我的世界js怎么用到我的世界里面去啊我的世界手机版js是什么 js怎么用我的世界手机版区域刷怪js怎么用我的世

2024年7月22日 07:40

视频解析网站源码下载(网上哪里有网站的源代码可以下载)

视频解析网站源码下载(网上哪里有网站的源代码可以下载)

本篇文章给大家谈谈视频解析网站源码下载,以及网上哪里有网站的源代码可以下载对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录网上哪里有网站的源

2024年6月26日 15:11

css图片居中自适应(css样式怎样让图片在不同分辨率的显示器都居中)

css图片居中自适应(css样式怎样让图片在不同分辨率的显示器都居中)

大家好,css图片居中自适应相信很多的网友都不是很明白,包括css样式怎样让图片在不同分辨率的显示器都居中也是一样,不过没有关系,接下来就来为大家分享关于css图片居中自适应和css样式怎样让图片在不同分辨率的显示器都居中的一些知识点,大家

2024年7月28日 04:35

periodic是什么意思(periodic table什么意思)

periodic是什么意思(periodic table什么意思)

各位老铁们好,相信很多人对periodic是什么意思都不是特别的了解,因此呢,今天就来为大家分享下关于periodic是什么意思以及periodic table什么意思的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文

2024年7月16日 19:43

yourself(yourself用英语怎么说)

yourself(yourself用英语怎么说)

其实yourself的问题并不复杂,但是又很多的朋友都不太了解yourself用英语怎么说,因此呢,今天小编就来为大家分享yourself的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录yourself用英语怎么

2024年9月8日 20:45

bootstrap4 网站后台模板(如何利用bootstrap框架开发后台)

bootstrap4 网站后台模板(如何利用bootstrap框架开发后台)

本文目录如何利用bootstrap框架开发后台bootstrap可以写后台管理系统界面吗bootstrap 的模板实现后端功能怎么用bootstrap做一套网站Bootstrap后台tab形式界面框架怎么实现有什么比较好的基于bootstr

2024年5月8日 16:28

小程序开发工具编辑器(小程序用什么开发工具)

小程序开发工具编辑器(小程序用什么开发工具)

本文目录小程序用什么开发工具微信小程序开发 使用什么编辑器开发小程序使用什么编辑器 知乎头条小程序开发工具有什么那些软件可以制作小程序小程序开发小程序用什么开发工具常见的小程序开发工具具有以下几种:1、微信小程序官方开发工具目前因为需要用到

2024年7月23日 16:12

jscript script文件(javascript和jscript的文件后缀都是js吗)

jscript script文件(javascript和jscript的文件后缀都是js吗)

本文目录javascript和jscript的文件后缀都是js吗jscript script 用什么打开jscript script 文件怎么打开jscript script是什么文件手机盘里经常有这种文件JScript Script 文件

2024年7月14日 08:06

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1731
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1156
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1153
标签列表

热门搜索