首页 > 编程知识 正文

Android两个服务通信(android进程共享)

时间:2023-05-03 21:35:18 阅读:76988 作者:2048

IPC IPC是“Inter-Process Communication”的缩写,称为进程间通信或进程间通信,是指在两个进程之间交换数据的过程。 Android主要使用Binder进行进程间通信,当然也支持管道、插座、文件共享、信号等其他IPC方式。

Binder配置文件1 .为什么要使用Binder?性能方面:

在移动设备(性能受限的设备,如节电)中,广泛使用过程间通信对通信机制的性能要求更高,并且Binder比传统的套接字方案更有效率。Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次,共享内存方式一次内存拷贝都不需要,但实现方式又比较复杂。

安全方面:

在传统的进程通信方式中,由于套接字通信的IP地址由客户端手动填写,因此没有对通信双方的身份进行严格的验证,例如容易伪造等。 但是,Binder机制从协议本身来看为支持对通信双方做身份校检,大大提高了安全性。

2 .从2.Binder原理流程看互联网处理通信(IPC )机制

每个Android进程只能在自己进程拥有的虚拟地址空间中运行。 例如,它对应于4GB的虚拟地址空间。 其中3GB是用户空间,1GB是内核空间。 当然,内核空间的大小可以通过参数配置来调整。 对于用户空间,不能在不同进程之间共享,但可以共享内核空间。 客户端进程与Server进程通信是利用进程之间可共享的内核内存空间进行基本通信工作。 客户端和服务器端进程经常通过ioctl等方法与内核空间驱动进行交互。

Binder通信采用了C/S体系结构,从组件的角度来看,它包括客户端、服务器、服务管理器和用于管理系统中各种服务的Binder驱动程序体系结构图如下:

Binder通信的四个角色

Client进程:使用服务的进程。Server进程:提供服务的过程。ServiceManager进程

ServiceManager的作用是将Binder名称作为字符转换为对客户端中的Binder的引用。 这样,客户端可以从Binder名称中检索对服务器中Binder实体的引用。

Binder驱动

负责一系列基本支持,包括在进程之间建立Binder通信、在进程之间传递Binder、Binder引用计数管理以及在进程之间传递和交换包。

3.Binder之间的数据传输过程之间的数据传输需要序列化。 可序列化接口和可并行接口可以序列化,并且必须使用可序列化接口和可并行接口通过Intent和Binder传输数据。

区别和联系:

序列化是Java提供的接口,序列化和序列化需要大量I/O操作,开销很大。 Parcelable是安卓中的串行化方式,效率高。 Parcelable主要用于内存序列化,而Serializable主要用于文件和网络传输。

Binder Binder是安卓的类,实现了IBinder接口。

从 IPC 角度来说

Binder是Android中的进程间通信方式,可以理解为驱动/dev/binder的虚拟物理设备。

从 Framework 的角度:

Binder是服务管理器连接各种管理器(活动管理器、窗口管理器)和管理器服务的桥梁。

从应用层的角度

Binder是客户端与服务端进行通信的介质,bindService会使服务端返回包含服务端业务调用的Binder对象。 此Binder对象允许客户端获取服务端提供的服务和数据,以及常规服务和AIDL服务。

1 .接口的重要方法分析DESCRIPTOR Binder的唯一标识信息,通常用当前Binder的类名进行标识。

asInterface(android.os.IBinder obj)将服务端返回的Binder对象转换为客户端所需

要的 AIDL 接口类型的对象,注意:如果 Client 和 Service 位于统一进程,该方法返回的就是 Service 的 Stub 对象本身,否则返回的是系统封装后的 Stub.proxy 代理的对象。

asBinder 返回当前 Binder 对象
onTransact

这个方法运行在 Service 中的 Binder 线程池中,当 Client 发起跨进程请求时,远程请求会通过系统底层封装后交由该方法类处理。服务端通过 code 来确定 Client 调用的具体是哪个方法,然后从 data 中取出方法对应的入参,然后执行目标方法。当目标方法执行完后,向 reply 中写入执行结果。注意:如果该方法返回false,则 Client 的请求会失败,可以利用这个特征来做权限验证(权限验证失败,返回false)。

小结:

客户端发起远程请求时,由于当前线程会被挂起直至服务端进程返回数据,所以如果一个远程方法是很耗时的,那么不能在 UI 线程中发起次远程请求。

服务端的 Binder 方法时运行在 Binder 线程池中的,所以 Binder 中的方法无论是否耗时都应该采用同步的方式去实现。

2.linkToDeath 和 unLinkToDeath

Binder 运行在服务端进程,如果服务端进程异常终止,会导致远程调用失败。Binder 中提供了两个配对的方法 linkToDeathunLinkToDeath,通过 linkToDeath 可以为 Binder 设置一个死亡代理,当Binder死亡时,会收到通知,这个时候可以重新发起连接请求从而恢复连接。

3.Android中IPC方式 1.使用 Bundle

Bundle 实现了 Parcelable 接口,可以通过 Intent 进行传递。当从一个进程启动另一个进程的 Activity 时,可以在 Bundle 中附加参数,这些数据必须是能够被序列化的。

2.使用文件共享

A进程往文件中写数据,B进程从文件中读数据。在 Windows上,一个文件如果被加了排斥锁将会导致其他线程无法对其进行访问。而 Andorid 是基于 Linux,是的其支持并发 读/写 可以无限制的进行,但是需要注意并发安全问题。

SharedPreferences 是 Android中轻量级的存储方案,通过键值对来存储数据,采用 xml 文件来保存键值对。因为 Android 系统对 读/写 有一定的缓存策略,即在内存中会有一份 SharedPreferences 文件的缓存,在多进程下,系统对它的读写变得不可靠。SharedPreferences 的 get 个 put 方法都是经过 synchronized 修饰的。

3.使用 Messenger

Messenger 也被翻译为信使,通过它可以在不同的进程间传递 Message 对象,在 Message 中放入我们需要传递的数据。它的底层也是常用 AIDL。

服务端通过 Handler 创建一个 Messenger,然后在 Servce 的 onBind 方法中返回这个 Messenger 对象的底层的 Binder即可。客户端通过服务端返回的 IBinder 就可以创建 Messenger来服务端发消息了。

4.使用 AIDL

在 AIDL 接口文件中的方法中有 in,out,inout 三个前缀参数

in 表示输入型参数out 表示输出型参数
inout 表示输入输出型参数

注意:

因为跨进程数据传输是要经过序列化和反序列化的过程,在客户端中注册的 listener 和 服务端中收到的 listener 不是同一个对象,在进行接口反注册的时候,会出现失败(因为它们根本不是同一个对象)。可以系统提供的 RemoteCallbackList 集合。RemoteCallbackList内部有 一个 Map集合。

RemoteCallbackList 在当客户端进程终止掉后,它能自动移除客户端所注册的 listener。另外,RemoteCallbackList 内部自动实现线程同步的功能。当然,也可以采用JUC包下的map结合来管理 listener,key 为客户端进程的 id。

上面讲到 Binder方法时运行在 Binder线程池中的,客户端在远程请求时会挂起,因避免在 UI 线程发起跨进程的远程调用。同理,当服务端调用客户端的 listener 中的方法时候,客户端被调用的方法也运行在 Binder 线程池中,所以尽量避免在服务端中直接调用客户端 listener 中的耗时方法。否则会导致服务端无响应。

5.使用 ContentProvider

​ ContentProvider 是 Android 提供的专门用于不同应用间进行数据共享的方式,它的底层实现也是 Binder。

6.使用 Socket

​ Socket 也被称为 “套接字”,分为流式套接字和用户数据报套接字两种,分别对应于网络传输控制层中的 TCP 和 UDP协议。

IPC各种方式比较

Binder连接池

当业务中需要定义多个 AIDL 接口服务时候,可以考虑用一个服务来关闭。否则为每个 AIDL 接口定义一个服务时非常不理想的。需要将所有的 AIDL 放在同一个 Service 中去管理。

每个业务模块创建自己的 AIDL 接口并实现次接口,不同业务模块之间不能有耦合,所实现的细节要单独开来。然后向服务端提供自己的唯一标识和其对应的 Binder 对象。服务端只需要一个 Service,服务端提供了 queryBinder接口,根据接口的参数返回相应的 Binder 对象,不同的业务模块拿到所需的Binder对象就可以进行远程方法调用了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。