【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处理后再通过驱动返回结果。
相关推荐
Doro再努力4 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
Daniel李华5 小时前
echarts使用案例
android·javascript·echarts
做人不要太理性6 小时前
CANN Runtime 运行时组件深度解析:任务调度机制、存储管理策略与维测体系构建逻辑
android·运维·魔珐星云
山岚的运维笔记6 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
我命由我123456 小时前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
朗迹 - 张伟7 小时前
Tauri2 导出 Android 详细教程
android
鸽芷咕7 小时前
为什么越来越多开发者转向 CANN 仓库中的 Python 自动化方案?
python·microsoft·自动化·cann
lpruoyu7 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习
独自破碎E8 小时前
【BISHI15】小红的夹吃棋
android·java·开发语言
模型时代11 小时前
Anthropic明确拒绝在Claude中加入广告功能
人工智能·microsoft