Zygote进程通信为什么用Socket而不是Binder?( 二 )


Binder机制介绍Binder是Android操作系统中的一种进程间通信(IPC)机制 。它是一种高效的、基于消息传递的IPC机制,用于在Android系统中不同进程之间进行通信 。
Binder的核心是一个驱动程序 , 它负责在不同进程之间传递消息 。在Android系统中 , 每个应用程序运行在独立的进程中 , 而Binder机制允许这些进程之间进行通信,以实现数据共享和功能调用 。
Binder机制的基本原理是通过Binder驱动程序提供的接口 , 将消息从一个进程发送到另一个进程 。每个进程都有一个Binder对象,用于接收和处理来自其他进程的消息 。当一个进程想要与另一个进程通信时,它可以通过Binder对象发送消息,并等待接收方的响应 。
在Android系统中,Binder机制被广泛应用于各种场景,例如Activity与Service之间的通信、进程间共享数据等 。它提供了一种安全可靠的IPC机制,能够有效地解决进程间通信的问题 。
Socket与Binder对比Socket和Binder是Android系统中常用的通信机制,它们在实现方式和使用场景上有一些区别 。

  1. 实现方式:
    • Socket是一种基于网络协议的通信机制 , 通过网络套接字实现进程间通信 。它使用TCP或UDP协议进行数据传输,可以在不同设备或同一设备的不同进程之间进行通信 。Zygote进程通信为什么用Socket而不是Binder? 。小编来告诉你更多相关信息 。
      Zygote进程通信为什么用Socket而不是Binder
    • Binder是一种基于内核驱动的进程间通信机制,它通过驱动程序实现进程间的数据传输 。Binder使用C/S架构,包括服务端和客户端,通过Binder驱动在内核空间中进行通信 。
  2. 使用场景:
    • Socket适用于网络通信场景,可以在不同设备或同一设备的不同进程之间进行通信 。常见的应用包括网络传输、远程过程调用(RPC)等 。
    • Binder适用于Android系统内部的进程间通信场景,主要用于应用程序组件之间的通信 , 如Activity与Service之间的通信、跨进程的数据共享等 。
  3. 性能和安全性:
    • Socket通信的性能相对较高,但在跨设备通信时需要考虑网络延迟和带宽等因素 。同时,Socket通信需要进行网络权限的申请和管理,可能存在一定的安全风险 。
    • Binder通信的性能相对较低,但在同一设备内部的进程间通信时具有较高的效率 。同时,Binder通信在Android系统中有较好的安全性,可以通过权限控制和进程隔离来保护系统的安全性 。
综上所述,Socket适用于网络通信场景,而Binder适用于Android系统内部的进程间通信场景 。在选择通信机制时 , 需要根据具体的应用场景和需求进行选择 。
Zygote进程为什么用Socket而不是Binder?
  1. 先后时序问题:Binder驱动是早于init进程加载的 。而init进程是安卓系统启动的第一个进程 。安卓中一般使用的Binder引用,都是保存在ServiceManager进程中的 , 而如果想从ServiceManager中获取到对应的Binder引用 , 前提是需要注册 。init进程是先创建ServiceManager,后创建Zygote进程的 。虽然Zygote更晚创建,但是也不能保证Zygote进程去注册binder的时候,ServiceManager已经初始化好了 。注册时间点无法保证,AMS无法获取到Zygote的binder引用 。
  2. 多线程问题:Linux中fork进程是不推荐fork一个多线程的进程的,因为如果存在锁的情况下,会导致锁异常 。而如果自身作为Binder机制的接收者,就会创建一个额外的线程来进行处理(发送者进程是无影响的) 。所以,如果使用Binder机制,就会导致去fork一个多线程的进程 。
  3. 效率问题:AMS和Zygote之间使用的LocalSocket,相对于网络Socket,减少了数据验证等环节,所以其实效率相对于正常的网络Socket会大幅的提升 。虽然还是要经过两次拷贝,但是由于数据量并不大,所以其实影响并不明显 。
  4. Binder拷贝问题:如果使用Binder机制的话,从Zygote中fork出子进程会拷贝Zygote中Binder对象 。从而多占用了一块无用的内存区域 。而Binder对象不能释放 。Binder的特殊性在于其是成对存在的,其分为Client端对象和Server端对象 。假设我们使用Binder,如果要释放掉Server端Binder引用对象 , 就必须释放掉AMS中的Client端Binder对象,那这样就会导致AMS失去Binder从而无法正常向Zygote发送消息 。而使用Socket通讯的话,fork出APP进程之后 , APP进程会去主动的关闭掉这个Socket,从而释放这块区域 。使用Binder会造成额外的内存占用 。Zygote进程通信为什么用Socket而不是Binder? 。小编来告诉你更多相关信息 。