每日一学——进程通信Binder篇(简单了解其原理)

今天看了下binder的原理,自己目前的基础对于深入理接力不从心,先学习学习,后续深入研究下:

Binder

Binder是Android提供的一套进程间相互通信框架。用来多进程间发送消息,同步和共享内存。已有的进程间通信方式有一下几种:

  • Files 文件系统(包括内存映射
  • Sockets
  • Pipes 管道
  • 共享内存
  • Intents, ContentProviders, Messenger
  • Binder

Binder的优点:

安全稳定:
每个进程单独运行,可以保证应用层对系统层分离,进程间独立运行不互相影响;Binder只需要一次拷贝,性能仅 次于共享内存,而且采用的传统的C/S结构,稳定性也是没得说,发送添加UID/PID,安全性高。

内存分配:
每个进程单独运行,如果某个进程不需要了或者其他优先级更高的进程需要更多的内存,可以回收相应的内存。

通信机制

Android系统分成三层。最上层是application应用层,第二层是Framework层,第三层是native层。
由下图可知几点:
每日一学——进程通信Binder篇(简单了解其原理)_第1张图片

  • 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来使用服务了,调用逻辑如图:
每日一学——进程通信Binder篇(简单了解其原理)_第2张图片
实现Client和Service的通信,Client如何获取Proxy代理对象?
一般我们会在App中通过Service组件的方式来创建一个服务。其它App通过BindService的方式连接到Service,通过onServiceConnected回调就能获取Proxy代理对象。后续我自己再研究研究写个小demo,现在的我对AIDL还一头雾水。这博客就简单了解了解先,后续深入我再学习学习。抱歉!!! 我太菜了

借鉴

借鉴了很多大佬的博客,学习了很多:

android跨进程通信(IPC):使用AIDL具体实现 https://blog.csdn.net/singwhatiwanna/article/details/17041691
图解Android中的binder机制: https://juejin.im/post/5e89f717f265da47e6491496#heading-6
3分钟带你看懂android中的Binder机制:https://www.jianshu.com/p/beebcd0c2e85

你可能感兴趣的:(Android架构)