今天看了下binder的原理,自己目前的基础对于深入理接力不从心,先学习学习,后续深入研究下:
Binder
Binder是Android提供的一套进程间相互通信框架。用来多进程间发送消息,同步和共享内存。已有的进程间通信方式有一下几种:
- Files 文件系统(包括内存映射
- Sockets
- Pipes 管道
- 共享内存
- Intents, ContentProviders, Messenger
- Binder
Binder的优点:
安全稳定:
每个进程单独运行,可以保证应用层对系统层分离,进程间独立运行不互相影响;Binder只需要一次拷贝,性能仅 次于共享内存,而且采用的传统的C/S结构,稳定性也是没得说,发送添加UID/PID,安全性高。
内存分配:
每个进程单独运行,如果某个进程不需要了或者其他优先级更高的进程需要更多的内存,可以回收相应的内存。
通信机制
Android系统分成三层。最上层是application应用层,第二层是Framework层,第三层是native层。
由下图可知几点:

- 1、Android中的应用层和系统服务层不在同一个进程,系统服务在单独的进程中。
- 2、Android中不同应用属于不同的进程中。
- 3、Android应用和系统services运行在不同进程中是为了安全,稳定,以及内存管理的原因,但是应用和系统服务需要通信和分享数据。
拿最简单的Activity举例:
Activity是由ActivityManager来控制的,而ActivityManager其实是通过Binder获取ActivityManagerService服务来控制Activity的,并且ActivityManager是Android系统FrameWork层的,和应用中的activity不是同一个进程。系统服务ActivityManagerService,LocationManagerService,等都是在单独进程中的,使用binder和应用进行通信。
进程隔离:
我们知道进程之间是无法直接进行交互的,每个进程独享自己的数据,而且操作系统为了保证自身的安全稳定性,将系统内核空间和用户空间分离开来,保证用户程序进程崩溃时不会影响到整个系统,简单的说就是,内核空间(Kernel)是系统内核运行的空间,用户空间(UserSpace)是用户程序运行的空间。为了保证安全性,它们之间是隔离的,所以用户空间的进程要进行交互需要通过内核空间来驱动整个过程。
Client获取服务过程:
- 第一步:client要请求服务,比如说在activity中调用context.getSystemService()方法,这个时候serviceManager就会使用getService(name),然后就会调用到native层中的ServiceManagerNative类中的getService(name)方法。
- 第二步:ServiceManagerNative会通过Binder发送一条SVG_MGR_GET_SERVICE的指令,然后通过svcmgr_handler()调用do_find_service()方法去svc_list中查找到相关的service。
- 第三步:查找到相应的服务后就会通过Binder将服务传给ServiceManagerNative,然后传给serviceManager,最后client就可以使用了。
- 注意: 服务实在svclist中保存的,svclist是一个链表,因此客户端调用的服务必须要先注册到svclist中才能被调用。
注册服务过程:
通过服务端代理注册
- 第一步:
service通过调用serviceManager中的addService方法,然后调用ServiceManagerNative类中的addservice(name)方法。 - 第二步:
ServiceManagerNative会通过Binder发送一条SVG_MGR_ADD_SERVICE的指令,然后通过svcmgr_handler()调用do_add_service()方法往svc_list中添加相应的service。
设计
采用代理模式:
客户端Client初始化Manager时,manager也像刚才的Service,直接从某个固定的地方拿到ContextManager的代理stub,通过代理,去查询ContextManager,获取一个“提供所要服务的代理对象”。manager有了这个对象,Client就可以通过manager来使用服务了,调用逻辑如图:

实现Client和Service的通信,Client如何获取Proxy代理对象?
一般我们会在App中通过Service组件的方式来创建一个服务。其它App通过BindService的方式连接到Service,通过onServiceConnected回调就能获取Proxy代理对象。后续我自己再研究研究写个小demo,现在的我对AIDL还一头雾水。这博客就简单了解了解先,后续深入我再学习学习。抱歉!!! 我太菜了
借鉴
借鉴了很多大佬的博客,学习了很多:
android跨进程通信(IPC):使用AIDL具体实现 https://blog.youkuaiyun.com/singwhatiwanna/article/details/17041691
图解Android中的binder机制: https://juejin.im/post/5e89f717f265da47e6491496#heading-6
3分钟带你看懂android中的Binder机制:https://www.jianshu.com/p/beebcd0c2e85
本文深入探讨了Android中的Binder机制,详细讲解了Binder作为进程间通信框架的工作原理,包括其优点、通信机制、服务注册与获取流程,以及设计模式的应用。
655

被折叠的 条评论
为什么被折叠?



