Binder基本知识

news/2024/10/30 9:24:26/

1:IPC 原理

从进程角度来看 IPC 机制

每个 Android 的进程,只能运行在自己进程所拥有的虚拟地址空间。对应一个4GB 的虚拟地址空间,其中 3GB 是用户空间,1GB 是内核空间,当然内核空间的大小是可以通过参数配置调整的。对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。Client 进程向 Server 进程通信,恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的,Client 端与Server 端进程往往采用 ioctl 等方法跟内核空间的驱动进行交互。

如图所示:

2:Binder 原理

Binder 通信采用 C/S 架构,从组件视角来说,包含 Client、Server、ServiceManager 以及 binder 驱动,其中 ServiceManager 用于管理系统中的各种服务。架构图如下所示:

可以看出无论是注册服务和获取服务的过程都需要 ServiceManager,需要注意的是此处的 Service Manager 是指 Native 层的 ServiceManager(C++),并非指 framework 层的 ServiceManager(Java)。

/frameworks/base/core/java/android/os/ServiceManager.java

在这里主要是想查看:ServiceManager.cpp是哪个文件里面的?

public static native IBinder waitForService(@NonNull String name);

在这里注册的:frameworks/base/core/jni/android_os_ServiceManager.cpp

frameworks/native/cmds/servicemanager/ ServiceManager.cpp

ServiceManager 是整个Binder 通信机制的大管家,是 Android 进程间通信机制 Binder 的守护进程,要掌握Binder 机制,首先需要了解系统是如何首次启动 Service Manager。当Service Manager 启动之后,Client 端和 Server 端通信时都需要先获取Service Manager 接口,才能开始通信服务。

图中 Client/Server/ServiceManager 之间的相互通信都是基于Binder 机制。既然基于 Binder 机制通信,那么同样也是 C/S 架构,则图中的3 大步骤都有相应的Client 端与 Server 端。

 1. 注 册 服 务 (addService) : Server 进 程 要先注册Service到ServiceManager。该过程:Server 是客户端,ServiceManager 是服务端。

2. 获 取 服 务 (getService) : Client 进 程 使 用 某个Service 前,须先向ServiceManager 中获取相应的 Service。该过程:Client 是客户端,ServiceManager 是服务端。

3. 使用服务:Client 根据得到的 Service 信息建立与Service 所在的Server 进程通信的通路,然后就可以直接与 Service 交互。该过程:client 是客户端,server 是服务端。

图中的 Client,Server,Service Manager 之间交互都是虚线表示,是由于它们彼此之间不是直接交互的,而是都通过与 Binder 驱动进行交互的,从而实现IPC通信方式。其中 Binder 驱动位于内核空间,Client,Server,Service Manager 位于用户空间。Binder 驱动和 Service Manager 可以看做是Android 平台的基础架构,,而 Client 和 Server 是 Android 的应用层,开发人员只需自定义实现client、Server 端,借助 Android 的基本平台架构便可以直接进行IPC 通信。

3 C/S 模式

BpBinder(客户端)和 BBinder(服务端)都是 Android 中Binder 通信相关的代表,它们都从 IBinder 类中派生而来,关系图如下:

client 端:BpBinder.transact()来发送事务请求;

server 端:BBinder.onTransact()会接收到相应事务。

 

 


http://www.ppmy.cn/news/43950.html

相关文章

Python之拯救Xubuntu22.04误删/usr/bin/python3.10(二十二)

0.首先删除/usr/bin/python3.10,会导致以下错误: <1>.报错1: ModuleNotFoundError: No module named ‘apt_pkg’ <2>.报错2: bash: /usr/lib/command-not-found: /usr/bin/python3: 解释器错误: 没有那个文件或目录 <3>.报错3: 通过亲身操作,以下步骤可…

Go并发(2)

2、Go并发 Go语言的并发模型是CSP&#xff08;Communicating Sequential Processes&#xff09;&#xff0c;提倡通过通信共享内存而不是通过共享内存而实现通信。 如果说goroutine是Go程序并发的执行体&#xff0c;channel就是它们之间的连接。channel是可以让一个goroutine…

《浪潮之巅》读书分享(2):为何改变自己如此困难?

“无意中发现了一个巨牛的人工智能教程&#xff0c;忍不住分享一下给大家。教程不仅是零基础&#xff0c;通俗易懂&#xff0c;而且非常风趣幽默&#xff0c;像看小说一样&#xff01;觉得太牛了&#xff0c;所以分享给大家。点这里可以跳转到教程。” 我们经常听到这些说法&am…

Redis一致性问题

&#xff08;1&#xff09;何为一致性&#xff1f; 1、定义&#xff1a; 指系统中各节点数据保持一致。 分布式系统中&#xff0c;可以理解为多个节点中的数据是一致的。 2、分类&#xff1a; 强一致性&#xff1a;写进去的数据是什么&#xff0c;读出来的数据就是什么。弱一…

JavaEE企业级应用开发教程——第十一章 Spring MVC的核心类和注解(黑马程序员第二版)(SSM)

第十一章 Spring MVC的核心类和注解 11.1 DispatcherServlet DispatcherServlet 是 Spring MVC 框架中的核心组件&#xff0c;它的全限定名是 org.springframework.web.servlet.DispatcherServlet。作为 Spring MVC 的前端控制器&#xff0c;DispatcherServlet 可以拦截客户端…

C++模拟go defer

go defer介绍 在Go语言中,defer语句用于在函数返回之前执行一些代码。这对于释放资源或记录函数执行时间非常有用。当函数中有多个defer语句时,它们将按照后进先出(LIFO)的顺序执行。 以下是一个简单的示例,演示了如何使用defer语句: package mainimport "fmt"…

利用在线Linux内核代码阅读分析网站linux kernel map分析CFS调度器代码调用链路

linux kernel map网址 https://makelinux.github.io/kernel/map/ 源码分析 点击Scheduler标签内的kernel/sched/ 左侧菜单&#xff0c;选择一个内核版本 Search Identifier搜索框输入要搜索的函数&#xff0c;回车执行搜索 结果列出了一处函数定义及两处引用 新窗口打开定义 …

MySQL优化——Explain分析执行计划详解

文章目录前言一. 查看SQL执行频率二. 定位低效率执行SQL三. explain分析执行计划3.1 id3.2 select_type3.3 table3.4 type3.5 key3.6 rows3.7 extra四. show profile分析SQL前言 在应用的的开发过程中&#xff0c;由于初期数据量小&#xff0c;开发人员写 SQL 语句时更重视功能…