Android IPC

Android 进阶——Binder IPC之Binder IPC架构及原理概述(九) Binder IPC之学习Binder IPC架构及原理。 阅读详情

Android OS的核心设计思想是component,而支持component的基石则是Inter-component-communication/Inter-process-communication,而不同抽象层次的ICC/IPC都是由Binder来实现的。
从概念上来说,Binder采用C/S通信Model。传送的数据存放于Transaction中,为了能把不同结构的数据放入Transaction,传输前后必须进行序列化和反序列化。通过Death Notification能够知道Binder是否还活着。为了让C能找到S,有两种方式:注册service和匿名service,注册service架构类似于Mediator design pattern, 匿名service则是通过Intent。Binder的Security 通过携带双方的PID,UID完成。
从实现上来说,Binder采用分层模型。从上到下分别为:Java app层主要是通过AIDL在client侧生成访问service的proxy,在service侧生成带有remote method实现的stub;Java API层除了封装底层Binder middleware以外,引入了Intent的相关facilities;C++ middleware主要负责管理request working的进程/线程,marshalling/unmarshalling data,与binder driver 交互;Binder driver负责安全可靠的在process之间转发message。

1. Components IPC以及Binder的作用

1.1 Android涉及的4种Component

Android 4种Component 的hierarchical class diagram如下:

这里写图片描述

Activity代表App的一个UI,主要负责显示和接受user输入。由于可能被另一个位于前端的Activity置于睡眠状态,一般不存放persistent data。
Service主要服务于需要长期存在的目的。由于service只有在system 的memory耗尽需要kill app来释放内存时才会被强制停止,所有后台处理的工作都应该放置于此。
ContentProvider一般用于管理persistent data。它提供访问persistent data 的interface,这个接口类似于file/network stream 以及SQL DB。
BroadcastReceiver用于接受系统发送的message。

1.2 Components之间的通信

虽然通信的形式有Intent、ContentProvider、Messager,但基石都是Binder。

1.2.1 Component通信举例
既然Component各有分工,他们之间就需要通信来相互合作。如下图所示,Activity通过Intent来start,同时通过Intent将另一个Activity带到前台;Service能够通过Intent被start/stop/bind,同时也是通过Intent来return; ContentProvider 能够通过CRUD被访问;BroadcastReceiver能够接受订阅的Intent。
这里写图片描述
1.2.2 Component通信的形式
从上节知道,通信的形式有Intent、ContentProvider,其实他们都是对Binder的high-level抽象:
这里写图片描述
Intent是component之间的一种异步通信方式:
Intent支持点对点(Explicit Intent)或者订阅-发布(Implicit Intent)的模式;
Intent可以包含标识具体component的URI,operation 的描述ACTION以及相应的data;

ContentProvider和ContentResolver之间是一种同步的并通过CRUD API联系的通信方式。

另一种通信方式如下图:
这里写图片描述

Messenger作为对Handler的reference通过Intent发送给remote process,当remote process处理messenger时候会callback回local process。

1.3 Binder的作用

Binder最重要的作用是提供类似RPC 的调用。这种调用能提供One-way或者Two-way的方式。借助AIDL,可以只暴露service的接口而隐藏实现。
Link-to-death notification能够通知Binder进程的结束。
Binder都具有唯一标识,所以能作为能在multiple process 之间shared的token。
通过Binder能获取到Caller’s PID/UID。

这里写图片描述

2. Binder涉及的关键概念

2.1 C/S 通信Model

如下图所示,Process A 作为client端持proxy object来实现与Binder driver的通信,driver则负责将message转发到目标object; Process B作为server端会根据进来的request不断spawn新的thread来处理,一直到最大thread数limitation。
这里写图片描述

2.2 Binder Transaction

每次在process之间传递的data叫做transaction data,它的结构如下图。
这里写图片描述
Target:指向目标binder节点;
Cookie:存放内部使用信息;
Sender ID:包含安全相关信息;
Data field:包含一组序列化的data array,array中每个entry包含 command和相应的argument;

2.3 Parcels 和Marshaling

任何一个需要在process间传递的object都必须实现Parcelable接口:在发送端实现序列化该对象,在接受端实现恢复对象。所有对象内的信息都必须转化为原子类型: int、float、boolean、String。
这个序列化的过程叫做marshaling或者flattening。重构对象的过程叫做unmarshaling或者unflattening。

2.4 Death Notification

这是一种oberser pattern:本地Binder object如果希望知道远端Binder object的生命周期结束,就会将其加入一个oberser队列。如果远端Binder宿主process terminaton事件发生,就会通知本地Binder object并作出相应。
这里写图片描述

2.5 Context(service) Manager

这是一种Mediator pattern:Context Manager是一个Binder 号为0的特殊Binder,它为其他Binder提供名字-Binder mapping的服务。
每个作为service来发布的binder,都需要将其name和binder token提交给Context Manager。
Client如果需访问某个service,只需知道service name,然后通过访问Context Manager就可获得需要访问service的Binder token。

2.6 Intent

Intent 位于Java API 层并通过Binder 发送,它是一种对需要执行操作的抽象,即操作的实际执行者并不一定需要在Intent内定义。
Intent通常包含action和data两部分。
常见的Intent分为两类:explicit intent会指向特定的目标component;implicit intent指向的目标component由Android系统决定,如果有多个component目标,系统将选择最合适那个来执行。

2.7 Security相关

Binder保证为通信的两个process提供secure channel,同时通过PID/UID 来识别两端的partners。
Intent filter:是service或者application的声明,标识该service/application能够接受什么样的intent。另外,intent filter会被explicit intent bypass,所以其并不能保证对所有intent都安全。

3. Binder 在Java APP层的实现

4. Binder在Java API层的实现

5. Binder在C++ 层的实现

5.1 Binder class diagram

类IInterface为所有的server端的共同基类,它的子类,比如IServiceManager、IMediaPlayerService等等提供了该服务端所具备的所有功能(一些列API)。
类IBinder是Binder通信协议的接口,为client和server端通信的基础。
类BBinder和类BpBinder均为IBinder的子类:BBinder用于server端,BpBinder用于client端。
类BBinder继承自IBinder,用于server端。各个服务端的service(比如ServiceManager、MediaPlayerService等等)需要创建一个继承BBinder并实现onTransact()函数的class,比如BnXXXService。BBinder通过transact()接收处理client端发过来的请求命令,并调用onTransact()这个虚函数,即调用BnXXXService的onTransact()函数。
类BpRefBase 的作用:client 端通过查询ServiceManager 获取到所需的的 BpBinder 后, BpRefBase 负责管理当前获得的 BpBinder 实例,并保存至成员变量IBinder* const mRemote;
类BpBinder继承自IBinder,负责将client端的请求发送至服务端的BBinder,为服务端在client端所提供的服务代理。客户端必须通过服务代理BpBinder才可以享用服务端所提供的具体服务。
模板类BnInterface(template class BnInterface : public INTERFACE, public BBinder)继承自传入的类INTERFACE和BBinder;
模板类BpInterface(template class BpInterface : public INTERFACE, public BpRefBase)继承自传入的类INTERFACE和BpRefBase。

这里写图片描述

5,2 ProcessState

ProcessState 是以单例模式设计的。每个进程在使用binder 机制通信时,均需要维护一个ProcessState 实例来描述当前进程在binder 通信时的binder 状态。
ProcessState 有如下2 个主要功能:
1. 创建一个thread, 该线程负责与内核中的binder 模块进行通信,称该线程为Pool thread ;
2. 为指定的handle 创建一个BpBinder 对象,并管理该进程中所有的BpBinder 对象。

5.2.1 Pool thread
在Binder IPC 中,所有进程均会启动一个thread 来负责与BD 来直接通信,也就是不停的读写BD ,这个线程的实现主体是一个IPCThreadState 对象,下面会介绍这个类型。

下面是Pool thread 的启动方式:

ProcessState::self()->startThreadPool(); 

5.2.2 BpBinder
获取BpBinder 主要功能是负责client 向BD 发送调用请求的数据。它是client 端binder 通信的核心对象,通过调用transact 函数向BD 发送调用请求的数据,它的构造函数如下:
BpBinder(int32_t handle);
通过BpBinder 的构造函数发现,BpBinder 会将当前通信中server 的handle 记录下来,当有数据发送时,会通知BD 数据的发送目标。
ProcessState 通过如下方式来获取BpBinder 对象:

ProcessState::self()->getContextObject(handle);  

在这个过程中,ProcessState 会维护一个BpBinder 的vector mHandleToObject ,每当ProcessState 创建一个BpBinder 的实例时,回去查询mHandleToObject ,如果对应的handle 已经有binder 指针,那么不再创建,否则创建binder 并插入到mHandleToObject 中。
ProcessState 创建的BpBinder 实例,一般情况下会作为参数构建一个client 端的代理接口,这个代理接口的形式为BpINTERFACE , 例如在与SM 通信时,client 会创建一个代理接口BpServiceManager .

5.3 IPCThreadState

IPCThreadState 也是以单例模式设计的。由于每个进程只维护了一个ProcessState 实例,同时ProcessState 只启动一个Pool thread ,也就是说每一个进程只会启动一个Pool thread ,因此每个进程则只需要一个IPCThreadState 即可。
Pool thread 的实际内容则为:

IPCThreadState::self()->joinThreadPool(); 

ProcessState 中有2 个Parcel 成员,mIn 和mOut ,Pool thread 会不停的查询BD 中是否有数据可读,如果有将其读出并保存到mIn ,同时不停的检查mOut 是否有数据需要向BD 发送,如果有,则将其内容写入到BD 中,总而言之,从BD 中读出的数据保存到mIn ,待写入到BD 中的数据保存在了mOut 。
ProcessState 中生成的BpBinder 实例通过调用IPCThreadState 的transact 函数来向mOut 中写入数据,这样的话这个binder IPC 过程的client 端的调用请求的发送过程就明了了 。

IPCThreadState 有两个重要的函数,talkWithDriver 函数负责从BD 读写数据,executeCommand 函数负责解析并执行mIn 中的数据。

6. Binder在Driver层的实现

Android 中的IPC机制 Android IPC 介绍IPC是 Inter-Proscess Communication的缩写,含义为进程间的通讯或者跨进程通讯,是指两个进程之间进行数据交换的过程。按操作系统的中的描述,线程是CPU调度最小的单元,同时线程是一种有限的系统资源,而进程是指一个执行单元,在PC和移动设备上指一个程序或者一个应用。一个进程可以包含多个线程,因此进程和线程是包含于被包含的关系。IPC的使用场景就必须 阅读详情

相关推荐

Android P的Binder IPC

一直以来,供应商进程都使用 Binder 进程间通信 (IPC) 技术进行通信。在 Android O 中,/dev/binder 设备节点成为了框架进程的专属节点,这意味着供应商进程将无法再访问该节点。供应商进程可以访问 /dev/hwbinder,但必须将其 AIDL 接口转为使用 HIDL。对于想要继续在供应商进程之间使用 AIDL 接口的供应商,Android 会按以下方式支持 Binde...

Vincentywj的博客 895

Android binder学习笔记4 - binder transact流程分析

目录1. 前言2. IPCThreadState::self()->transact|- -writeTransactionData|- -IPCThreadState::waitForResponse|- - -talkWithDriver|- - - -binder_thread_write|- - - -binder_thread_read参考文档 1. 前言 在Android binder学习笔记2 - 获取ServiceManager中defaultServiceManager->Pr

HZero 4889

Android代码-简单易用的安卓进程间通信IPC框架

Hermes A smart, novel and easy-to-use framework for Android Inter-Process Communication (IPC). Chinese Readme 中文文档 Hermes is a smart, novel and easy-to-use framework for Android Inter-Process Communication (IPC). In this framework, you can use IPC even if you do not understand the underneath principle of Android IPC. Please click HERE to see the demo. Also, HermesEventBus is a Hermes-and-EventBus-based library which posts events between processes. Note that maybe you will find that Hermes is sti

深入解析Binder驱动:从BC_TRANSACTION到BR_REPLY的完整通信链路

本文深入解析了Android Binder驱动从BC_TRANSACTION到BR_REPLY的完整通信链路。通过剖析Android 14与Kernel 5.15源码,详细阐述了同步Binder调用的核心流程,包括数据打包、内核缓冲区分配、线程调度、优先级继承及内存管理机制,帮助开发者理解Binder IPC底层原理,优化性能并排查复杂问题。

corn8的博客 470

告别手动画图!用Cadence SKILL写一个参数化电感PCell(附完整代码)

本文详细介绍了如何使用Cadence SKILL语言开发参数化电感PCell,实现电感版图的自动化生成。通过动态调整线宽、圈数等几何参数,自动创建端口并进行工艺规则校验,大幅提升高频电路设计效率。附完整代码示例,帮助工程师快速掌握PCell开发技巧。

weixin_30684743的博客 368

AES-GCM加密认证模式:原理、优势与实战应用

在数据安全领域,加密与认证是保障信息机密性和完整性的两大基石。加密确保数据内容不被窃取,而认证则验证数据来源的真实性和传输过程中是否被篡改。传统的加密后认证方案如AES-CBC+HMAC需要串行处理,性能开销较大。GCM(伽罗瓦/计数器模式)作为一种认证加密(AEAD)方案,巧妙地将AES-CTR加密与基于伽罗瓦域的GHASH认证并行结合,实现了单次数据遍历即可同时完成加密和认证,大幅提升了处理效率。其核心价值在于高性能、支持附加认证数据(AAD)以及标准化程度高,广泛应用于TLS协议、无线网络安全和云存储

weixin_28622215的博客 315

Android Framework跨进程通信IPC之6——Binder框架

Android 从下而上分了内核层、硬件抽象层、系统服务层、Binder IPC 层、应用程序框架层Android 中"应用程序框架层"以 SDK 的形式开放给开发者使用,“系统服务层” 中的核心服务随系统启动而运行,通过应用层序框架层提供的 Manager 实时为应用程序提供服务调用。系统服务层中每一个服务运行在自己独立的进程空间中,应用程序框架层中的 Manager 通过 Binder IPC 的方式调用系统服务层中的服务。简单的说,Binder是Android平台上的一种跨进程通信技术。

Gaga246的博客 5448

WorldQuant Brain Alpha 生成器

一个自动化工具,通过参数优化和回测来挖掘高质量的量化交易 Alpha 因子,并自动提交符合标准的因子。

weixin_37582383的博客 1万+

Android Framework跨进程通信IPC之4——AndroidIPC基础1

进程Process 是程序的一个运行实例,以区别于"程序" 这一个静态概念;而线程(Thread) 则是CPU调度的单位。当前大部分操作系统都是支持多任务运行,这一特性让用户感到计算机好像可以同时处理很多事情。显然在只有一个CPU核心的情况下,这种"同时"是一种假象。它是操作系统先采用分时的方法,为正在运行的多任务分配合理的、单独的CPU来实现的。比如当前系统有5个任务,如果采用"平均分配"法且时间为10ms的话,那么各个任务每隔40ms就能被执行一次。

Gaga246的博客 925

5、自动化代码结构与运维系统的优化

本文探讨了自动化代码结构与运维系统的优化方法,涵盖审批流程的模块化设计、日志记录与工单系统的集成、通知方式的选择、错误处理的策略以及持续改进的实践。同时,深入分析了运维盲目性问题,通过故障案例揭示了关键指标缺失和日志未充分利用的弊端,提出了开发与运维角色转变的必要性。文章还介绍了如何生成有用的系统指标、建立良好的日志习惯以及实施日志聚合,以提升系统的可观测性和可靠性。最终通过总结和流程图展示了优化措施的核心要点,为构建高效、可靠的运维体系提供了指导。

pp12345的博客 71

【AI for Medecine】吴恩达医学图像AI专项课程(诊断、预测、治疗)

近期需要简单了解AI4Science上的一些应用,看到吴恩达大佬的专项课程,于是开始来个“全面”的了解--医学人工智能(诊断、预测、治疗)。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 774

【Android IPC】安卓中常见IPC实现方式

通信方式 1、使用Bundle 其实Intent的putExtro(XXX xxx)方法可以在进程之间的通信(简单的例子如下) (1)简单栗子 两个activity:MainActivity 、SecondActivity(清单文件开启新的进程) MainActivity: Log.i(Tags.TAG, "Main activity pid: " + Process.myPid()...

dev晴天的博客 505

锐捷 MPLS VPN 配置

ISP内部配置 , PE设备和CE设备之间的接口不开启 ( 只在物理接口上配置 , loopback 口不配置 )最后一步关闭 ipv4 单播 , 如果你发现路由奇奇怪怪的 , 可以尝试一下。both --> 同时配置 import export 值。绑定后接口会重置 , 且接口的路由会转到VRF路由表中。这里基本上绑定了 vrf 实例的接口都需要宣告进去。vpnv 4 通道是用来传递 mpls 路由的。先建立邻居管理,建立VPNV4通道。这里要做双向引入 , 才会有路由。export 导出值。

dekangzou的博客 1712

安卓IPC机制

IPC是Inter-Process Communication的缩写,含义是进程间通信,用于两个进程之间进行数据交互的过程,任何操作系统都有IPC机制,但不同的操作系统有着不同的通信方式,Android系统是一种基于Linux内核的移动操作系统,Linux的跨进程通信主要通过管道、共享内存、内存映射等实现的,但Android有自己的进程间通信机制,最具代表性的就是Binder。线程:CPU调度的最小单元,是一种有限的资源。

weixin_50961942的博客 2380

(三十九)Flask 多应用架构(Multiple Apps)与 DispatcherMiddleware 实战解析

(三十九)Flask 多应用架构(Multiple Apps)与 DispatcherMiddleware 实战解析

孤寒者的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Android IPC】IPC基础

Android IPC要点 一、安卓中ipc简介 1、相关概念: 1、 IPC:inter process communication的缩写,进程间的通信,即两个进程间进行数据交换。 2、线程:线程是cpu调度的最小单元,,同时线程是一种有效的系统资源。 3、进程:进程一般指一个执行单元,在pc或者移动设备上一般指一个程序或者一个应用。 2、进程与线程关系: 一个进程可以包含多个线程。最简...

dev晴天的博客 455

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

安卓ipc机制

IPC的含义为进程间通信或者跨进程通信,也就是数据交换,进程和线程的区分从操作系统角度来说,线程是CPU的最小调度单元,同时也是一种有限资源,进程指的是一个执行单元在Android上指一个应用,进程可以包含很多个线程(包含与被包含的关系)通常一个应用也就进程都会包含至少一个线程,就是我们熟悉的UI线程(主线程)如果进程需要执行大量的耗时任务这个时候都在UI线程做就会造成界面无法响应(ANR),就需要我们用子线程去做这些耗时的任务。1. Android中多进程的创建与常见问题。

m0_72431373的博客 144

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

安卓开发之IPC机制详解

IPC(Inter-Process Communication),意为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。前面在学习Handler机制时提到过线程与进程的概念,在安卓中一个进程可以简单理解为一个程序或应用,而线程是CPU调度的最小单元,一个进程可以包含多个线程,也可以只有一个线程即主(UI)线程。 1. 多进程模式 既然是跨进程通信,必然要在多进程模式下进行。 使用多进程的情况分为两种: 由于某些原因,应用自身需要采用多进程模式来实现。可能原因有:应用中某些模块因特殊原因要运行在

iris的博客 1033

安卓IPC机制之Binder详解

IPC(Inter-Process Communication,跨进程通信)是指两个进程之间数据交换的过程,因此我们首先必须了解什么是进程,什么是线程。

(* ̄︶ ̄) 3万+

Android IPC机制

线程:线程是CPU调度的最小单位,是一种有限的系统资源。 进程:进程一般指一个执行单元,在PC或者移动设备上指一个程序或者应用。 一个进程可以包含多个线程,最简单情况下,一个进程只包含一个线程(即主线程)。Android中主线程也叫作UI线程。

xiaokangss的博客 1307

android中IPC机制简介

除了Binder,Android还支持Socket,通过Socket也可以实现任意两个终端之间的通信,当然同一个设备上的两个进程通过Socket通信也自然是可以的。什么是进程,进程和线程是截然不同的概念。按照操作系统中的描述,线程是cpu调度最小的单元,同时线程是一个有限的系统资源。IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程间进行数据交换的过程。最简单情况下,一个进程中可以只有一个线程,即主线程,安卓中为UI线程。

Ueming的博客 1706

安卓IPC机制(一)---基础

吐槽 中午不想起来啊啊啊,但是不起来又不行,唉,坚持坚持,这个世界不会因为我一个人的懒惰而不转的。 参考任玉刚老师的《Android开发艺术探索》 Android IPC简介 IPC是进程间的通信或者跨进程通信,是指两个进程之间的进行数据交换的过程 Bundle、文件共享、AIDL(Android Interface definition language一种android内部进程通信接...

sakurakider的博客 1687

安卓IPC及AIDL的使用

文章目录概述Android中的多进程模式IPC基础概念1.Serializable接口2.Parcelable接口3.Binder及AIDL的使用4.AIDL总结参考资料 概述 IPC即进程间通信,是两个进程间数据交换的过程。AIDL即安卓接口定义语言,它能简化我们实现进程间通信的过程。 **进程和线程:**进程一般指一个执行单元,在PC和移动设备上指一个程序或一个应用;线程是CPU调度的最小单元...

qq_43935080的博客 440

Android的IPC机制

使用Messenger 1、特点:  * (1)Messenger对AIDL做了封装,使得我们可以更简便地进行进程间通信。  * 由于它一次处理一个请求,所以在服务端我们不考虑线程同步的问题,  * 因为服务端中不存在并发执行的情形。  * (2)通过它可以在不同进程中传递Message对象,  * 在Message中仿佛我们需要传递的数据,就可以轻松地实现数据的进程间

我的专栏 1万+

Android中Binder IPC机制

Binder IPC机制,学不动也要学

永琪的博客 3936
上一篇: Android的Graphic System
下一篇: JAVA/Android Concurrency学习笔记
dkphenix
博客等级 码龄19年 11粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值