【Android FrameWork】第十八天:Binder服务

在Android的跨进程通信(IPC)体系中,Binder是核心机制,而ServiceManager则是Binder世界的"服务中介"------它负责管理系统中所有公开的Binder服务,让客户端(Client)能精准定位到对应的服务端(Server)。

核心角色

在Binder服务交互中,有4个不可替代的角色:

  1. ServiceManager :独立运行在servicemanager进程,是系统级"服务注册表",负责存储"服务名-Binder代理"的映射关系。
  2. Server:服务提供者(如ActivityManagerService、WindowManagerService),通过Binder对外暴露功能。
  3. Client:服务调用者(如普通应用进程),需要通过Binder调用Server的功能。
  4. Binder驱动 :内核层组件,是跨进程通信的"中转桥梁",负责进程间的数据转发、资源管理。

Server端

Client能查到Server,前提是Server已经把自己"注册"到ServiceManager中,流程如下:

  1. Server获取ServiceManager的代理

    ServiceManager本身是系统中第一个Binder服务,其Binder实体在Binder驱动中的标识(handle)固定为0

    Server通过defaultServiceManager()方法,借助Binder驱动(以handle 0为标识),获取到ServiceManager的Binder代理对象(Client/Server与ServiceManager通信,都依赖这个代理)。

  2. Server向ServiceManager注册服务

    Server调用ServiceManager代理的addService(String serviceName, IBinder service)方法,传入两个关键信息:

    • serviceName:服务的唯一标识(如AMS对应"activity",WMS对应"window");
    • IBinder service:Server自身的Binder实体(即提供服务的实际对象)。
  3. Binder驱动与ServiceManager的存储

    Binder驱动会为Server的Binder实体分配一个唯一的handle(进程内唯一标识),然后ServiceManager将"服务名-该Binder实体的代理(包含handle)"存入自身的服务注册表。

Client端

当Server完成注册后,Client就能通过ServiceManager查询到对应的服务,流程如下:

  1. Client同样获取ServiceManager代理

    和Server逻辑一致:Client通过defaultServiceManager()方法,借助Binder驱动(handle 0),拿到ServiceManager的Binder代理。

  2. Client发起服务查询

    Client调用ServiceManager代理的getService(String serviceName)方法,传入要找的服务名(比如要调用AMS,就传"activity")。

  3. ServiceManager返回Binder代理

    ServiceManager从自己的注册表中,找到该服务名对应的Binder代理(包含Server的Binder实体handle),并通过Binder驱动将这个代理传递给Client。

  4. Client用代理与Server通信

    Client拿到的Binder代理,本质是Server的"远程引用"------后续Client调用服务方法(比如startActivity())时,这个代理会把调用请求交给Binder驱动,驱动根据handle找到对应的Server进程和Binder实体,完成跨进程调用的转发。

底层关键

Client、Server、ServiceManager分属不同进程,能完成交互全靠Binder驱动的核心能力:

  • 突破进程隔离:Binder驱动是内核组件,可直接访问各进程地址空间,采用"一次内存拷贝"优化(比传统IPC更高效),实现跨进程数据传递。
  • handle映射管理:每个进程维护自己的handle表,Binder驱动负责将不同进程的handle,映射到同一个Binder实体。
  • 调用转发:当Client通过代理调用方法时,驱动会根据handle定位到Server进程的Binder实体,将调用请求转发过去,并把返回结果带回Client。

实际例子

当普通应用要启动Activity时,Client(应用进程)的操作是:

  1. 调用defaultServiceManager().getService("activity"),从ServiceManager拿到AMS的Binder代理;
  2. 通过该代理调用startActivity()方法;
  3. Binder驱动将调用转发到AMS进程(Server),AMS处理后再通过驱动返回结果。
相关推荐
HLC++12 小时前
Linux的进程间通信
android·linux·服务器
爱笑鱼16 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
爱笑鱼16 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android
壮哥_icon17 小时前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
用户693717500138418 小时前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端
蝉蜕日记19 小时前
AccumuPDF高级版 v2.57 | 视图文转换PDF,合并分割压缩
android·智能手机·pdf·生活·软件需求
吐了啊取名字太难19 小时前
美颜系统AI修图本地跑并支持Mac、win、安卓、iOS不卡顿
android·人工智能·windows·数码相机·mac·ai编程
阿pin20 小时前
Android随笔-Retrofit
android·retrofit
想取一个与众不同的名字好难20 小时前
安卓自定义颜色选择器
android
我命由我1234521 小时前
Android 开发问题:java.lang.NoSuchMethodError:No virtual method readAllBytes()
android·java·java-ee·kotlin·android studio·android-studio·android runtime