Binder对象的流转(系统服务的调用过程、AIDL的使用过程)

news/2025/3/7 6:00:18/

零、Binder的传递

Android系统中,存在大量的 IPC 交互,同时也使用了大量的 Binder,那么Binder是怎么在各进程中进行对象的传递?

一、调用系统服务时,Binder的传递

请添加图片描述

回忆一下,Android系统的启动流程:Kernel——>Init进程——>Zygote——>SystemServer,在SystemServer启动时,会启动大量的系统级服务:AMS,PMS,WMS,InputManagerService等。
这些系统服务会注册到ServiceManager上,客户端是从ServiceManger中拿到要使用的系统服务对象,再调用服务的方法。

SystemServer 想要把服务注册到 ServiceManger 上:先拿到 IServiceManager 的proxy引用,调用 addService 方法将服务注册到 ServiceManager 的。

当客户端想调用系统服务时,通常会有以下写法:

LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

往getSystemService方法传入一个字符串,返回服务的一个对象,然后就可以使用了。
客户端与 ServiceManager 处于两个进程中,想从 ServiceManager 中拿到服务对象,就涉及到 IPC 调用。其实也是客户端首先拿到 IServiceManager的proxy对象,调用getService() 方法取得服务对象的。

总结一下:

  1. SystemServer 中运行的服务要注册到 ServiceManager上。即 IPC1
  2. 客户端从 ServiceManager 中获取服务对象。即 IPC2
  3. 客户端拿到服务对象,在调用的时候,客户端使用的是 Binder对象的 proxy,实际运行的 Binder 在 SystemServer 进程中。即 IPC3

二、AIDL使用时的Binder传递

回忆下AIDL的使用:

  1. 定义AIDL 文件
  2. 编译生成 Stub 模板代码
  3. 定义服务端 Service,公布 Binder对象
  4. 定义客户端 使用bindService方法,在回调中拿到 Binder的 proxy对象

问题就在于,服务端 return的 Binder 对象是怎么传到 客户端的?
请添加图片描述
具体的代码调用流程就不贴了,画了一张图,使流程简化些讲解。

bindService(serviceIntent, new ServiceConnection() ...

客户端调用 bindService,传入一个 ServiceConnection 对象,在 ContextImpl.bindServiceCommon 中,传入到 ServiceDispather,伪代码如下:

class ServiceDispather {ServiceConnection conn;InnerConnection innerConn; // 为AMS回调,埋下伏笔
}class InnerConnection extends IServiceConnection.Stub

InnerConnection 继承自IServiceConnection.Stub,为AMS回调 Binder 预留接口,AMS为客户端,InnerConnection是服务端。
最终客户端收 Binder对象时,也就是AMS调用 onConnected 时,将 Binder 通过 InnerConnection 传到客户端,再转发到 ServiceConnection中。

AMS收到bindService() 请求,调 requestBinding 将请求传到 服务端,在服务端的 onBind() 方法中 return Binder对象,委托AMS发布此Binder,AMS中存有 InnerConnect的代理对象,将Binder传到客户端去,ServiceDispather 调用 ServiceConnection 暴露 Binder对象给上层应用。

文章来源:https://blog.csdn.net/jx0260/article/details/131203823
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/news/382612.html

相关文章

仿神庙逃亡

跑酷游戏仿神庙逃亡 链接:https://pan.baidu.com/s/12Pj8KQl1eWKWDbWO3OxtZQ 提取码:283a

安卓手机软键盘弹起的问题

现如今很多API对于安卓系统,iOS系统有些会兼容,有些不兼容。就拿软键盘弹起的问题来说吧,如果一个系统上面有一个输入框,底部有个按钮(前提按钮用了position:fixed),当我用安卓手机点击输入框的时候,底部的…

安卓手机里能否安装钢琴键盘模拟器APP呢?

可以在手机里直接安装使用。对于我们模拟练习钢琴非常有用。首先我们先启动手机,然后进入手机里的应用市场,搜索【钢琴键盘模拟器】安装到手机桌面上。  然后我们点 击【钢琴键盘模拟器】的图标,进入可操作界面。这时候会制动跳转到手机横屏…

分享安卓手机里的钢琴键盘模拟器给大家

安卓手机里的钢琴键盘模拟器,对于我们模拟练习钢琴非常有用。我们先打开手机,然后启动手机桌面上的【钢琴键盘模拟器】今天就和大家分享一下。 点 击【钢琴键盘模拟器】的图标,进入可操作界面。这时候会制动跳转到手机横屏界面。我们可以看到…

【LeetCode】HOT 100(11)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

乐曲软件APP,钢琴键盘模拟器分享

手机里有可以弹奏出钢琴乐曲的软件钢琴键盘模拟器,非常受年轻的朋友喜欢。今天我就在这里和大家分享一下,使用钢琴键盘模拟器弹奏钢琴乐曲的软件。 先启动手机,运行钢琴键盘模拟器软件APP,点 击【钢琴键盘模拟器】图标进入可操作…

解密神庙逃亡类跑酷游戏地图无限的原因

解密神庙逃亡类跑酷游戏地图无限的原因 1.无限之谜 众所周知,跑酷类游戏像神庙逃亡给玩家的一种感觉就是地图无限多。有人说神庙逃亡跑1亿分就结束了,但这些其实都是假象,在程序猿眼中,这些人都是无知的。 这是一个最简单的跑酷…

pygame 神庙逃亡

游戏规则 用pygame动画实现神庙逃亡类似的小游戏,当玩家移动的时候躲避子弹,如果子弹命中玩家或者名字龙都会减速,玩家躲避子弹使更多的子弹打在龙上,当玩家被龙抓到,则游戏输,如果龙被子弹减少速度&#…