Android Binder设计与实现 – 设计篇

合集下载

安卓binder原理

安卓binder原理

安卓binder原理安卓Binder原理一、引言在安卓系统中,进程间通信(IPC)是非常重要的,而Binder作为安卓系统中的进程间通信机制,扮演着关键的角色。

本文将介绍安卓Binder的原理及其相关概念,以便更好地理解安卓系统的工作原理。

二、安卓Binder的概述Binder是安卓系统中一种轻量级的IPC机制,其设计目标是为了提供高效的进程间通信能力。

Binder主要由Binder驱动、Binder服务和Binder代理组成。

1. Binder驱动Binder驱动是位于内核空间的模块,负责处理进程间通信的底层操作。

它提供了一组接口供用户空间进程使用,用于创建Binder节点、发送和接收Binder消息等操作。

2. Binder服务Binder服务是安卓系统中的后台服务,它可以通过Binder驱动与其他进程进行通信。

每个Binder服务都有一个唯一的标识符,称为Binder引用。

通过Binder引用,其他进程可以找到并与该服务通信。

3. Binder代理Binder代理是位于用户空间的模块,负责将进程间通信的请求转发给相应的Binder服务。

它通过Binder驱动与Binder服务进行交互,并将结果返回给请求方。

三、Binder的工作原理Binder的工作原理可以分为三个步骤:注册服务、获取引用和发起调用。

1. 注册服务Binder服务首先需要在系统中注册自己,以便其他进程可以找到并与之通信。

注册服务时,Binder服务会创建一个Binder节点,并向Binder驱动注册该节点。

注册成功后,Binder服务会获得一个唯一的Binder引用。

2. 获取引用其他进程想要与已注册的Binder服务通信,就需要获取该服务的Binder引用。

获取引用的过程是通过Binder代理完成的。

Binder 代理首先通过Binder驱动找到对应的Binder节点,然后获取该节点的引用,并将引用返回给请求方。

3. 发起调用一旦获取到Binder引用,请求方可以通过Binder代理向对应的Binder服务发起调用。

Android进程间通信机制(Binder)介绍

Android进程间通信机制(Binder)介绍

先看下 Binder 相关的一个简单类图
以一个简单的 binder 应用示例来看 Android 中 binder 这一进程间通信机制,文件结构: ~/MyFolder/ans/packages/apps/bitest$ tree . . |-- Android.mk // 同时生成 libdxyhservice.so、dxyh_service、dxyh_client 的.mk |-- dxyhclient // 一可执行程序与 service 通信(当然也可是 java 通过 jni 来与服务通信) | `-- DxyhClient.cpp |-- dxyhservice // 服务程序(类似于 mediaserver 这一可执行程序) | |-- DxyhService.cpp | |-- DxyhService.h | `-- main_dxyhservice.cpp |-- include // 头文件 | `-- IDxyhService.h `-- libdxyhservice // 动态库 `-- IDxyhService.cpp 示例相关类图:
//! Flags for onIncStrongAttempted() enum { FIRST_INC_STRONG = 0x0001 }; virtual virtual virtual virtual void void bool void onFirstRef(); onLastStrongRef(const void* id); onIncStrongAttempted(uint32_t flags, const void* id); onLastWeakRef(const void* id);
//! DEBUGGING ONLY: Print references held on object. inline void printRefs() const { getWeakRefs()->printRefs(); } //! DEBUGGING ONLY: Enable tracking of object. inline void trackMe(bool enable, bool retain) { getWeakRefs()->trackMe(enable, retain); } // used to override the RefBase destruction. class Destroyer { friend class RefBase; public: virtual ~Destroyer(); private: virtual void destroy(RefBase const* base) = 0; }; // Make sure to never acquire a strong reference from this function. The // same restrictions than for destructors apply. void setDestroyer(Destroyer* destroyer); protected: RefBase(); virtual ~RefBase(); //! Flags for extendObjectLifetime() enum { OBJECT_LIFETIME_WEAK = 0x0001, OBJECT_LIFETIME_FOREVER = 0x0003 }; void extendObjectLifetime(int32_t mode);

Android图文详解Binder进程通信底层原理

Android图文详解Binder进程通信底层原理

Android图⽂详解Binder进程通信底层原理⽬录什么是进程间通信什么是 BinderAndroid 中 IPC 的⽅式Binder 优势Linux 传统的 IPC 原理基本概念进程隔离进程空间划分系统调⽤传统 IPC 通信原理Binder IPC原理Binder 采⽤分层架构设计Binder 驱动Binder IPC 内存映射Android Binder 原理图Bind 原理图Bind 原理图交互Bind 原理图交互路线之前了解到进程与多进程,涉及多进程不可避免的遇到了进程间通信,说到进程间通信,Binder 成了⼀道绕不过的坎。

接下来咱们逐⼀了解。

什么是进程间通信进程间通信(IPC,Inner Process Comunication),就是指不同进程之间的信息传递。

进程是系统进⾏资源分配和调度的基本单位,是操作系统的结构的基础;⼀个应⽤⾄少有⼀个进程,⼀个进程中有包含了多个线程(线程是CPU调度的最⼩单位),进程相当于是线程的ViewGroup,线程相当于操作系统分配个进程的View。

什么是 BinderBinder 是 Android 系统中进程间通信机制(IPC)的⼀种⽅式,它是这些进程间通讯的桥梁。

正如其名"粘合剂"⼀样,它把系统中各个组件粘合到了⼀起,是各个组件的桥梁。

应⽤层:是⼀个能发起通信的Java类。

Client:是对 Binder 代理对象,是 Binder 实体对象的⼀个远程代理。

Server:是 Server 中的 Binder 实体对象。

机制:是⼀种进程间通信机制。

驱动:是⼀个虚拟物理设备驱动;如startActivity的简图:这⾥就⽤到了 Binder 通信,你会发现这⾥还有 Socker 通信,那我为什么要⽤ Binder ⽽不⽤ Socket。

Android 中 IPC 的⽅式名称特点使⽤场景Bundle只能传输实现了序列化或者⼀些Android⽀持的特殊对象适合⽤于四⼤组件之间的进程交互⽂件不能做到进程间的即时通信,并且不适合⽤于⾼并发的场景适合⽤于SharedPreference以及IO操作ContentProvider可以访问较多的数据,⽀持⼀对多的⾼并发访问,因为ContentProvider已经⾃动做好了关于并发的机制适合⽤于⼀对多的数据共享并且需要对数据进⾏频繁的CRUD操作Socket通过⽹络传输字节流,⽀持⼀对多的实时通信,但是实现起来⽐较复杂适合⽤于⽹络数据共享Messenger底层原理是AIDL,只是对其做了封装,但是不能很好的处理⾼并发的场景,并且传输的数据只能⽀持Bundle类型多进程、单线程且线程安全AIDL功能强⼤,使⽤Binder机制,⽀持⼀对多的⾼并发实时通信,但是需要处理好线程同步⼀对多并且有远程进程通信的场景Binder 优势出发点Binder共享内存Socket性能拷贝⼀次⽆需拷贝拷贝两次特点基于C/S架构,易⽤性⾼控制复杂,易⽤性差基于C/S架构,通⽤接⼝,传输效率低、开销⼤安全每个APP分配UID,同时⽀持实名和匿名依赖上层协议,访问接⼊点是开放的不安全依赖上层协议,访问接⼊点是开放的不安全通过以上对⽐,Android 最终选择了⾃建⼀套兼顾好⽤、⾼效、安全的 Binder。

[IT计算机]androidbinder机制

[IT计算机]androidbinder机制

Android进程间通信-Binder机制目录一.简要介绍和学习计划二.Service Manager成为Binder守护进程之路三.Server和Client获得Service Manager接口之路四.Server启动过程源代码分析五.Client获得Server远程接口过程源代码分析六.应用程序框架层的Java接口源代码分析一、Android进程间通信(IPC)机制Binder 简要介绍和学习计划我们知道,在Android系统中,每一个应用程序都是由一些Activity和Service组成的,一般Service 运行在独立的进程中,而 不同的Activity有可能运行在同一个进程中,也可能运行在不同的进程中。

这很自然地想到,不在同一个进程的Activity和Service是如何 通信的呢?毕竟它们要协作在一起来完成一个完整的应用程序功能。

这就是本文中要介绍的Android系统进程间通信机制Binder了。

我们知道,Android系统是基于Linux内核的,而Linux内核继承和兼容了丰富的Unix系统进程间通信(IPC)机制。

有传统的管道 (Pipe)、信号(Signal)和跟踪(Trace),这三项通信手段只能用于父进程与子进程之间,或者兄弟进程之间;后来又增加了命令管道 (Named Pipe),使得进程间通信不再局限于父子进程或者兄弟进程之间;为了更好地支持商业应用中的事务处理,在AT&T的Unix 系统V中,又增加了 三种称为“System V IPC”的进程间通信机制,分别是报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore);后来BSD Unix对“System V IPC”机制进行了重要的扩充,提供了一种称为插口(Socket)的进程间通信机制。

若想进一步详细了解这些进程间通信机制,建议参考Android学习启动篇一文中提到《Linux内核源代码情景分析》一书。

android系统进程间通信binder机制在应用程序框架层的java接口源代码.docx

android系统进程间通信binder机制在应用程序框架层的java接口源代码.docx

在前面几篇文章中,我们详细介绍了Android系统进程间通信机制Binder的原理,并且深入分析了系统提供的Binder运行库和驱动程序的源代码。

细心的读者会发现,这几篇文章分析的Binder接口都是基于C/C++语言来实现的,但是我们在编写应用程序都是基于Java语言的,那么,我们如何使用Java语言来使用系统的Binder机制来进行进程间通信呢?这就是本文要介绍的Android系统应用程序框架层的用Java语言来实现的Binder接口了。

熟悉Android系统的读者,应该能想到应用程序框架中的基于Java语言的Binder接口是通过JNI来调用基于C/C++语言的Binder运行库来为Java应用程序提供进程间通信服务的了。

JNI在Android系统中用得相当普遍,SDK中的Java 接口API很多只是简单地通过JNI来调用底层的C/C++运行库从而为应用程序服务的。

这里,我们仍然是通过具体的例子来说明Binder机制在应用程序框架层中的Java接口,主要就是Service Manager、Server和Client这三个角色的实现了。

通常,在应用程序中,我们都是把Server实现为Service的形式,并且通过IServiceManager.addService接口来把这个Service添加到Service Manager,Client也是通过IServiceManager.getService接口来获得Service接口,接着就可以使用这个Service提供的功能了,这个与运行时库的Binder接口是一致的。

前面我们学习Android硬件抽象层时,曾经在应用程序框架层中提供了一个硬件访问服务HelloService,这个Service运行在一个独立的进程中充当Server的角色,使用这个Service的Client运行在另一个进程中,它们之间就是通过Binder机制来通信的了。

这里,我们就使用HelloService这个例子来分析Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码。

androidbinder机制原理

androidbinder机制原理

androidbinder机制原理Android Binder 机制原理什么是 Android Binder 机制?Android Binder 机制是 Android 系统中用于进行进程间通信(IPC)的核心机制之一。

它负责在不同的 Android 组件之间传递数据和进行远程方法调用。

为什么 Android 需要 Binder 机制?Android 系统的设计中,每个应用程序运行在独立的进程中,它们之间需要进行信息交换和协作。

而 Binder 机制提供了一种高效、安全和可靠的方式来实现进程间通信。

Binder 机制的关键组件Binder 机制主要由以下几个关键组件组成:1. 服务端(Server)服务端是提供服务的组件,它通过继承Binder类并实现对应的接口,将服务提供给客户端使用。

2. 客户端(Client)客户端是使用服务的组件,它通过 Binder 机制与服务端进行通信,获取所需的数据或调用对应的方法。

3. Binder 驱动(Binder Driver)Binder 驱动是位于 Linux 内核中的模块,负责处理进程间通信的底层操作,如进程注册、线程管理、进程间通信等。

4. Binder 通信线程(Binder Communication Thread)Binder 通信线程是运行在客户端和服务端进程中的线程,负责处理进程间通信的具体细节,如数据传输、对象序列化等。

5. Binder 编译器(Binder Compiler)Binder 编译器是将服务端定义的接口文件生成对应的 Java 接口和代理类,用于客户端与服务端的通信。

Binder 机制的工作流程Android Binder 机制的工作流程可以简要描述如下:1.客户端通过绑定机制连接到服务端,获取服务的引用。

2.客户端通过服务的引用调用远程方法,并传递相应的参数。

3.客户端的请求通过 Binder 通信线程封装成消息并发送给服务端。

binder的上层设计

binder的上层设计
class IInterface : public virtual RefBase { public: IInterface(); sp<IBinder> asBinder(); sp<const IBinder> asBinder() const; protected: virtual ~IInterface(); virtual IBinder* onAsBinder() = 0; };
class IBinder : public virtual RefBase { public: ... virtual sp<IInterface> queryLocalInterface(const String16& descriptor); // 返回一个 IInterface 对象 ... virtual const String16& getInterfaceDescriptor() const = 0; virtual bool isBinderAlive() const = 0; virtual status_t pingB_t dump(int fd, const Vector<String16>& args) = 0; virtual status_t transact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) = 0; virtual status_t linkToDeath(const sp<DeathRecipient>& recipient, void* cookie = NULL, uint32_t flags = 0) = 0; virtual status_t unlinkToDeath( const wp<DeathRecipient>& recipient, void* cookie = NULL, uint32_t flags = 0, wp<DeathRecipient>* outRecipient = NULL) = 0;

Android进程间通信Binder扩展模型的设计与实现

Android进程间通信Binder扩展模型的设计与实现

通过分析 B i n d e r 机 制, 借助 网络套接字技术 , 在服务 端的 B i n d e r 框架之上增加 一个用于监 听的守护进程 , 达 到 分 发 服务 请 求 的 目的 , 从 而 在不 改变 原 生 服 务 调 用 机 制 下 实 现 跨 网 络 平 台 的 服 务 。试 验 结 果 表 明 , 相 比原 模 型 , 扩 展 模 型 的服 务 执 行 效 率 并 没 有 明 显 的 降低 , 达 到 了设 计 要 求 。
t o o r i g i n a l mo d e wi t h o u t d i s t u r b i n g t h e o r i g i n a l s y s t e m s e r v i c e c a l 1 . Ex p e r i me n t s s h o w t ha t t h e n e w mo d e l i s a s e f f i c i e n t a s t he o r i g i n a l o n e i n a s p e c t o f s e r v i c e e x e c u t i v e e f f i c i e n c y .
CHEN Li j u n, ZHANG Ch a o
( S c h o o l o f C omp ut e r S c i e n c e a n d Te c h n o l o g y ,Xi ’ a n Un i v e r s i t y o f Po s t s a n d Te l e c o mm u ni c a t i o n s,Xi ’ a n 71 0 1 2 1,Ch i n a )
Ke y wo r d s:A n dr o i d,t he mo b i l e I nt e r ne t ,Bi nd e r ,d a e mon

Android深入浅出之Binder机制

Android深入浅出之Binder机制

Android深⼊浅出之Binder机制Android深⼊浅出之Binder机制⼀说明Android系统最常见也是初学者最难搞明⽩的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的。

所以搞明⽩Binder的话,在很⼤程度上就能理解程序运⾏的流程。

我们这⾥将以MediaService的例⼦来分析Binder的使⽤:l ServiceManager,这是Android OS的整个服务的管理程序l MediaService,这个程序⾥边注册了提供媒体播放的服务程序MediaPlayerService,我们最后只分析这个l MediaPlayerClient,这个是与MediaPlayerService交互的客户端程序下⾯先讲讲MediaService应⽤程序。

⼆ MediaService的诞⽣MediaService是⼀个应⽤程序,虽然Android搞了七七⼋⼋的JAVA之类的东西,但是在本质上,它还是⼀个完整的Linux操作系统,也还没有⽜到什么应⽤程序都是JAVA写。

所以,MS(MediaService)就是⼀个和普通的C++应⽤程序⼀样的东西。

MediaService的源码⽂件在:framework\base\Media\MediaServer\Main_mediaserver.cpp中。

让我们看看到底是个什么玩意⼉!int main(int argc, char** argv){//FT,就这么简单??//获得⼀个ProcessState实例sp<ProcessState> proc(ProcessState::self());//得到⼀个ServiceManager对象sp<IServiceManager> sm = defaultServiceManager();MediaPlayerService::instantiate();//初始化MediaPlayerService服务ProcessState::self()->startThreadPool();//看名字,启动Process的线程池?IPCThreadState::self()->joinThreadPool();//将⾃⼰加⼊到刚才的线程池?}其中,我们只分析MediaPlayerService。

初探Android中的binder机制

初探Android中的binder机制

初探Android中的binder机制Binder机制是Android系统中最主要的进程间通信机制。

虽然Android底层使用的是linux内核,但是除了匿名管道,socket外,Android并没有使用linux 中的命名管道,信号量,消息队列等传统的IPC通信方式。

Binder犹如一张大网,将Android整个系统中的组件,跨进程的组织在一起。

淡化进程,强化组件是Android的一个设计理念。

在这个过程中,Binder发挥了巨大作用。

binder 的作用binder的作用可以概括为两点:IPC:是一种跨进程通信手段,但是传输数据的大小受限制,不建议传输较大数据。

RPC:是一种远程过程调用手段,即一个进程中可以透明的调用另外一个进程中的方法。

两者经常相互伴随,例如跨进程调用的时候,参数的传递以及结果的传递等。

binder机制简述binder实体对象:就是binder服务的提供者,一个提供binder服务的类必须继承BBinder类(native层),因此binder实体对象又叫做BBinder对象。

binder引用对象:是binder服务提供者在客户端进程的代表,每个引用对象类型必须继承BpBinder类(native层),因此binder引用对象有叫做BpBinder对象。

binder代理对象:代理对象简单理解为内聚了一个binder引用对象,因此可以通过这个内聚的引用对象发起RPC调用。

可以有多个不同的代理对象,但却内聚了同一个引用对象。

IBinder对象:BBinder和BpBinder都是继承自IBinder.因此binder实体对象和binder引用对象都可以称为IBinder对象。

可以通过IBinder.queryLocalInterface()方法来判断到底是binder实体对象还是binder引用对象。

binder跨进程传输的数据类型是Parcel。

以RPC为例的示意图如下:android_binder-1.png通过一个运行在内核空间的binder驱动进程,将两个用户空间的进程联系了起来。

安卓进程间通信的四种方式(含案例)

安卓进程间通信的四种方式(含案例)

安卓进程间通信的四种方式(含案例)1. BinderBinder是Android系统中的一种轻量级的进程间通信机制。

它基于C++语言实现,允许多个进程共享数据和调用彼此的方法。

Binder有三个角色:服务端、客户端和服务管理器。

服务端提供服务并注册到服务管理器,客户端通过服务管理器获取服务对象并进行通信。

例如,一个应用可能需要使用另一个应用提供的服务,通过Binder可以跨进程访问服务的方法。

服务端可以实现一个抽象类,并将其注册到服务管理器,客户端通过服务管理器获取服务对象,并调用其方法。

2. ContentProviderContentProvider是Android提供的一种数据共享机制,能够使一个应用程序的数据集对其他应用程序可见。

ContentProvider提供了一系列的方法,允许其他应用程序通过URI进行数据的访问、插入、更新和删除。

例如,一个应用程序有一个存储用户信息的数据库,通过将ContentProvider暴露给其他应用程序,其他应用程序可以通过URI查询、插入、更新和删除用户信息。

3.广播广播是Android提供的进程间通信的一种方式。

广播通过Intent传递消息,发送广播的应用程序将消息发送给其他应用程序,并且其他应用程序可以通过注册广播接收器来接收这些消息。

例如,一个应用程序可能发送一个自定义广播来通知其他应用程序有关一些事件的发生,其他应用程序可以注册广播接收器来接收这个广播并执行相应的操作。

4. MessengerMessenger是一种轻量级的IPC机制,它是基于Binder实现的。

Messenger可以在不同的进程间发送Message对象,通过Message对象传递数据。

例如,一个应用程序可以创建一个Messenger实例,并将其传递给另一个应用程序,另一个应用程序可以通过Messenger向第一个应用程序发送消息,并通过消息携带数据。

以上是安卓进程间通信的四种方式,每种方式都有自己的特点和适用场景。

Android Binder机制总结

Android Binder机制总结

Android Binder机制总结1Android组件化思想Android应用的体系结构是基于分布式组件模型。

Android应用中的组件之间是松耦合,具有模块化以及可扩展的特性。

这些组件可以同时运行在同一个进程中,也可以在不同的进程中。

如你编写的应用程序需要显示一个可以滚动的图片列表,如果其它某个应用程序已经开发了具有此功能的组件,并对外发布了此组件以使其它应用程序能够使用此组件,因此你可以直接调用这个组件来显示图片,而不需要重新开发一个具有此功能的组件。

另外一些系统服务如联系人列表、拍照、打电话等公共功能都能够在其它的应用程序中被调用。

2常见的进程通信方式(IPC)IPC是Inter-process communication的缩写形式,主要用于多进程间通信和数据交互。

a) Pipes(管道): Pipes are unidirectional byte-streams that connect the standard output from one process with the standard input of another process.b) Message Queues(消息队列): maintains a queue of messages to which processes can read to and write from, thereby achieving IPC.c) Shared Memory(共享内存): A common memory location which is accessible by all communicating processes. IPC is achieved by writing to and reading from the shared memory location.d) Semaphores(信号量): A semaphore is a shared variable on which processes can signal and wait thereby achieving IPC.e) Signals(信号): A process can send signals to processes with the same uid and gid or in the same process group.f) Sockets: Sockets are bidirectional communication streams. Two processes can communicate with byte-streams by opening the same socket.3Android中进程通信方式Android中的Binder机制源于OpenBinder,它的创造者是Dianne Kyra Hackborn,但是已经不再维护。

(原创)AndroidBinder设计与实现-实现篇(1)

(原创)AndroidBinder设计与实现-实现篇(1)

(原创)AndroidBinder设计与实现-实现篇(1)本⽂属于原创作品,转载请注明出处并放于明显位置,原⽂地址:前⾔在学习Android的Binder机制时,看了/universus/article/details/6211589这篇⽂章(读本⽂前最好读⼀下),觉得写得⾮常棒,可惜只有设计篇,都⼏年了还没有实现篇,就想尝试完成这个⼯作,虽然可能没有写得那么好,但也希望能对同在学习Android的Binder机制的⼈有所帮助。

同时如果⽂中如果有什么理解错误请及时指出,欢迎⼤家交流。

可以参考的资料:杨丰盛⽼师的《Android技术内幕》,邓平凡⽼师的《深⼊理解Android》以及罗升阳⽼师的相关博客或书籍(/luoshengyang/article)中关于Binder的部分。

1、概述Android中基于binder的IPC,其本质都是通过⽂件操作与binder驱动交互实现的。

在通信过程中,每个参与通信的进程都会在内核存在对应的数据,这些数据是进程在和驱动打交道,如执⾏fopen或者ioctl时,由binder驱动创建与维护。

当然,与binder驱动直接交互实现IPC ⽐较⿇烦,故Android帮我们封装成了Binder Adapter,主要包括IPCThreadState和ProcessState相关的部分。

我们平时的Service都是通过Binder Adapter层间接操作驱动的。

我们⾸先抛开Binder Adapter层,看直接与binder驱动交互需要怎么做,然后在这个基础上分析Android 是怎么通过Binder Adapter层帮我们封装的。

同时,我们说binder通信是⼀种⽀持CS架构的IPC,是因为binder从驱动级别就保存有⼀个进程是否处于循环监听状态,因为CS架构的基本逻辑就是Server处于循环监听状态,等待Client的请求并响应其请求,另外在Binder中还有类似于“会话”的概念,实现同步通信,在驱动层对⼀次会话进⾏了⽀持,这也是⼀种对CS架构的⽀持。

Android的IPC机制——Binder

Android的IPC机制——Binder

8. binder_init
(代码清单略)
binder_init是Binder驱动的初始化函数,初始化函数一般需要设备驱动接口来 调用。Andriod Binder设备驱动接口函数是device_initcall。Binder选择使用 device_initcall的目的就是不让Binder驱动支持动态编译,而且需要在内核做镜像。
binder_p BINDER_WRITE_READ arse() 读写数据
解析
进程
数据
Cmd
Binder_ioctl 交换数据
进程
请求
区 分
请求的发送与结果的返回
Binder_t hread_re ad
调 用 Binder_thread _write
Binder_tr ansactio n
3.Binder对象
它在源码中使用 flat_binder_object结构体来表示
struct flat_binder_object{ unsigned long type; unsigned long flage;//表示传输方式 union{ void *binder; signed long handle; }; void *cookie;//保存数据 };
该结构体中type就是描述binder的类型,传输的数据是一个复用数据联合体。 对于Binder类型,数据就是一个Binder本地对象;Handle类型,就是一个远程的 handle句柄。例如: O O是 handle O是 binder A B
(A,B都是访问对象O,但方式不同)
4.binder_write_read
什么是IPC机制以及IPC机制的种类
在Linux中,是以进程为单位分配和管理资源的。出于保护机制,一个进 程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭。但是, 一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项任务, 因此要求进程之间必须能够互相通信,从而共享资源和信息。所以,操作系 统内核必须提供进程间的通信机制(IPC)。

binder原理和实现机制

binder原理和实现机制

binder原理和实现机制Binder是Android系统中的一个重要组件,它不仅用于进程间通信,同时还承担了Android系统中各种管理任务,如权限管理、服务管理等。

本文将围绕Binder原理和实现机制进行详细讲解。

一、Binder原理Binder原理主要由Binder驱动、Binder进程间通信机制和Binder对象管理系统三部分组成。

1. Binder驱动Binder驱动作为Android系统内核的一部分,它是Binder通信的核心组成部分。

其主要作用是与内核中的线程调度器以及内存管理器无缝协作,将进程间通信的数据从一个进程传递到另外一个进程。

被称为Binder通信的进程被称为Server端(或者binder服务进程),负责处理来自其他客户端进程的请求。

被称为Client端(或者binder客户端进程),则通过Binder接口来调用Server端的服务。

2. Binder进程间通信机制Binder进程间通信机制基于C/S(Client/Server)架构,具有一下特点:① Client进程向Server进程请求Binder服务;② Server进程响应Client进程请求;③ Server进程提供一个或者多个Binder对象,Client进程通过Binder对象来访问服务;④ Client进程通过ServiceManager来获取Binder对象,ServiceManger在Server进程中需要提供相关的服务注册操作。

3. Binder对象管理系统每个Binder对象在系统中都有一个唯一的标识符,称之为Binder引用。

Binder对象管理系统负责管理Binder引用,每个Binder引用对应一个Binder对象,并保存在进程的Binder引用表中。

Client进程向ServiceManager请求获取Binder对象时,实际上是请求ServiceManager返回Binder引用。

Client进程获取到Binder引用后,可以通过Binder引用从Binder对象管理系统中获取到Server端提供的Binder对象。

Android平台——Binder机制

Android平台——Binder机制

Android平台——Binder机制由代码来补充部分:int main(int argc, char** argv){sp<ProcessState> proc(ProcessState::self());sp<IServiceManager> sm = defaultServiceManager();LOGI("ServiceManager: %p", sm.get());AudioFlinger::instantiate();MediaPlayerService::instantiate();CameraService::instantiate();ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();}sp<ProcessState> proc(ProcessState::self()),这一行代码会建立ProcessState对象,一个进程只有唯一的一个ProcessState对象,而ProcessState类的作用是来打开/dev/binder设备。

这也就说明了一个问题,一个进程只不可能同时存在多个对/dev/binder的操作。

sp<IServiceManager> s m = defaultServiceManager(),这一行代码要做的事情参见上图。

1、创建一个BpBinder。

2、由BpBinder对象创建BpServiceManger对象。

(为什么要采取如此不自然的方式,可以看一下这两个对象继承的基类)。

完成这一步骤的最重要的作用在于以后对于IServiceManager对象的方法的调用,都将会由其子类BpServiceManger的方法来实现(这样做的意义何在?这样的作用仅仅在于我们可以重用IServiceManager的代码,别忘了我们还有一个类似的继承自IServiceManager的类,它叫做BnServiceManger)。

android binder机制原理

android binder机制原理

android binder机制原理Android Binder机制原理在Android系统中,不同进程间的通信是非常常见的,例如应用程序之间或系统服务之间的通信。

为了保证通信的稳定和效率,Android系统采用了一种名为Binder机制的进程间通信(IPC)方案。

本文将介绍Android Binder机制的原理以及它的工作模式。

一、Android Binder机制的原理Android Binder机制是基于C++语言和Linux内核的,在Binder 机制中最重要的概念是“Binder对象”。

Binder对象是一个可以跨进程使用的对象,它通过进程间共享内存的方式进行通信,以提高性能和效率。

Binder机制通过Binder驱动程序在内核空间和用户空间之间建立虚拟连接。

具体来说,Binder机制的原理是:当一个进程请求访问另一个进程中的对象时,它会通过Binder驱动程序向目标进程发送一个请求消息。

进程B在收到请求消息后,将生成一个Binder对象,并将其返回给进程A。

之后,进程A通过这个Binder对象与进程B进行通信,这样就完成了进程间的通信。

二、Android Binder机制的工作模式1. Binder通信基本框架Android Binder机制的基本框架可以描述如下:(1) Binder驱动程序在内核空间中负责处理进程A和进程B之间的通信。

(2) 进程A通过Binder通信建立一个客户端,与进程B建立连接。

(3) 进程B在客户端连接上创建一个Binder服务对象,以提供服务。

(4) 进程A和进程B基于客户端与服务对象进行通信。

2. Binder服务Binder服务是Android Binder机制的核心,它是一种用于提供跨进程通信服务的对象。

在Binder服务中,最为重要的是“Binder对象”。

每个Binder服务都会生成一个唯一的Binder对象,这个对象代表了这个服务的身份标识。

安卓binder工作原理

安卓binder工作原理

安卓binder工作原理【实用版】目录1.Binder 的产生背景2.Binder 的定义和作用3.Binder 的工作原理4.Binder 的优势和应用场景5.总结正文一、Binder 的产生背景在 Android 系统中,由于应用程序需要实现各种各样的 IPC(进程间通信)需求,例如启动一个 Activity、与 System Services 交互等,因此亟需一种可靠的 IPC 解决方案。

在 Android 系统中,Binder 应运而生,它成为了 Android 系统中进程间通信的主要方式。

二、Binder 的定义和作用Binder 是一种实现了 IBinder 接口的类,主要用来实现跨进程通信。

从 Android 框架角度来说,Binder 是 ServerManager 连接各种Manager 和 ManagerService 的桥梁。

简而言之,Binder 是一种在Android 设备上进行 IPC 的主要方式,它主要用于实现跨进程通信。

三、Binder 的工作原理1.Binder 的创建:当一个进程需要与另一个进程通信时,会创建一个 Binder 对象。

在创建过程中,会通过 IPC 机制将请求发送到目标进程,目标进程收到请求后,会创建一个对应的 Binder 对象。

2.Binder 的通信:Binder 对象之间通过消息传递进行通信。

发送方将消息封装成一个 Parcel 对象,然后将 Parcel 对象发送给接收方。

接收方收到 Parcel 对象后,会将其解析为消息,然后进行相应的处理。

3.Binder 的安全性:Binder 通信过程中,会受到 Android 权限系统的监控。

只有在权限允许的情况下,Binder 通信才能进行。

这保证了Binder 通信的安全可靠。

四、Binder 的优势和应用场景Binder 的优势主要体现在其安全性和易用性。

由于 Binder 通信过程受到权限系统的监控,因此可以确保通信的安全性。

AndroidBinder机制(超级详尽)

AndroidBinder机制(超级详尽)

AndroidBinder机制(超级详尽)1.binder通信概述binder通信是⼀种client-server的通信结构,1.从表⾯上来看,是client通过获得⼀个server的代理接⼝,对server进⾏直接调⽤;2.实际上,代理接⼝中定义的⽅法与server中定义的⽅法是⼀⼀对应的;3.client调⽤某个代理接⼝中的⽅法时,代理接⼝的⽅法会将client传递的参数打包成为Parcel 对象;4.代理接⼝将该Parcel发送给内核中的binder driver.5.server会读取binder driver中的请求数据,如果是发送给⾃⼰的,解包Parcel对象,处理并将结果返回;6.整个的调⽤过程是⼀个同步过程,在server处理的时候,client会block住。

2.service managerService Manager是⼀个linux级的进程,顾名思义,就是service的管理器。

这⾥的service是什么概念呢?这⾥的service的概念和init过程中init.rc中的service是不同,init.rc中的service是都是linux进程,但是这⾥的service它并不⼀定是⼀个进程,也就是说可能⼀个或多个service属于同⼀个linux进程。

在这篇⽂章中不加特殊说明均指android native端的service。

任何service在被使⽤之前,均要向SM(Service Manager)注册,同时客户端需要访问某个service时,应该⾸先向SM查询是否存在该服务。

如果SM存在这个service,那么会将该service 的handle返回给client,handle是每个service的唯⼀标识符。

SM的⼊⼝函数在service_manager.c中,下⾯是SM的代码部分int main(int argc, char **argv){struct binder_state *bs;void *svcmgr = BINDER_SERVICE_MANAGER;bs = binder_open(128*1024);if (binder_become_context_manager(bs)) {LOGE("cannot become context manager (%s)/n", strerror(errno));return -1;}svcmgr_handle = svcmgr;binder_loop(bs, svcmgr_handler);return 0;}这个进程的主要⼯作如下:1.初始化binder,打开/dev/binder设备;在内存中为binder映射128K字节空间;2.指定SM对应的代理binder的handle为0,当client尝试与SM通信时,需要创建⼀个handle为0的代理binder,这⾥的代理binder其实就是第⼀节中描述的那个代理接⼝;3.通知binder driver(BD)使SM成为BD的context manager;4.维护⼀个死循环,在这个死循环中,不停地去读内核中binder driver,查看是否有可读的内容;即是否有对service的操作要求, 如果有,则调⽤svcmgr_handler回调来处理请求的操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android Binder设计与实现–设计篇摘要Binder是Android系统进程间通信(IPC)方式之一。

Linux已经拥有管道、system V IPC、socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具有无可比拟的优势。

深入了解Binder并将之与传统 IPC做对比有助于我们深入领会进程间通信的实现和性能优化。

本文将对Binder的设计细节做一个全面的阐述,首先通过介绍Binder通信模型和Binder通信协议了解Binder的设计需求;然后分别阐述Binder在系统不同部分的表述方式和起的作用;最后还会解释Binder在数据接收端的设计考虑,包括线程池管理,内存映射和等待队列管理等。

通过本文对Binder的详细介绍以及与其它IPC通信方式的对比,读者将对Binder的优势和使用Binder 作为Android主要IPC方式的原因有深入了解。

1.引言基于Client-Server的通信方式广泛应用于从互联网和数据库访问到嵌入式手持设备内部通信等各个领域。

智能手机平台特别是Android 系统中,为了向应用开发者提供丰富多样的功能,这种通信方式更是无处不在,诸如媒体播放,视音频捕获,到各种让手机更智能的传感器(加速度、方位、温度、光亮度等)都由不同的Server负责管理,应用程序只需作为Client与这些Server建立连接便可以使用这些服务,花很少的时间和精力就能开发出令人眩目的功能。

Client-Server方式的广泛采用对进程间通信(IPC)机制是一个挑战。

目前linux 支持的IPC包括传统的管道、System V IPC、即消息队列/共享内存/信号量,以及socket中只有socket支持Client-Server的通信方式。

当然也可以在这些底层机制上架设一套协议来实现Client-Server通信,但这样增加了系统的复杂性,在手机这种条件复杂,资源稀缺的环境下可靠性也难以保证。

另一方面是传输性能。

socket作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。

消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。

共享内存虽然无需拷贝,但控制复杂,难以使用。

表 1 各种IPC方式数据拷贝次数还有一点是出于安全性考虑。

Android作为一个开放式,拥有众多开发者的平台,应用程序的来源广泛,确保智能终端的安全是非常重要的。

终端用户不希望从网上下载的程序在不知情的情况下偷窥隐私数据,连接无线网络,长期操作底层设备导致电池很快耗尽等等。

传统IPC没有任何安全措施,完全依赖上层协议来确保。

首先传统IPC的接收方无法获得对方进程可靠的UID/PID(用户ID/进程ID),从而无法鉴别对方身份。

Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。

使用传统IPC只能由用户在数据包里填入UID/PID,但这样不可靠,容易被恶意程序利用。

可靠的身份标记只有由IPC机制本身在内核中添加。

其次传统IPC访问接入点是开放的,无法建立私有通道。

比如命名管道的名称、system V的键值、socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。

基于以上原因,Android需要建立一套新的IPC机制来满足系统对通信方式,传输性能和安全性的要求,这就是Binder。

Binder基于 Client-Server通信模式,传输过程只需一次拷贝,为发送发添加UID/PID身份,既支持实名Binder 也支持匿名Binder,安全性高。

2.面向对象的 Binder IPCBinder使用Client-Server通信方式:一个进程作为Server提供诸如视频/音频解码,视频捕获,地址本查询,网络连接等服务;多个进程作为Client 向Server发起服务请求,获得所需要的服务。

要想实现Client-Server通信必须实现以下两点:一是server 必须有确定的访问接入点或者说地址来接受Client的请求,并且Client可以通过某种途径获知Server的地址;二是制定Command- Reply协议来传输数据。

例如在网络通信中Server的访问接入点就是Server主机的IP地址+端口号,传输协议为TCP协议。

对Binder而言,Binder 可以看成Server提供的实现某个特定服务的访问接入点, Client通过这个‘地址’向Server发送请求来使用该服务;对Client而言,Binder可以看成是通向Server的管道入口,要想和某个 Server通信首先必须建立这个管道并获得管道入口。

与其它IPC不同,Binder使用了面向对象的思想来描述作为访问接入点的Binder及其在Client中的入口:Binder是一个实体位于Server中的对象,该对象提供了一套方法用以实现对服务的请求,就像类的成员函数。

遍布于client 中的入口可以看成指向这个binder对象的‘指针’,一旦获得了这个‘指针’就可以调用该对象的方法访问server。

在Client看来,通过Binder‘指针’调用其提供的方法和通过指针调用其它任何本地对象的方法并无区别,尽管前者的实体位于远端Server中,而后者实体位于本地内存中。

‘指针’是C++的术语,而更通常的说法是引用,即Client通过Binder的引用访问Server。

而软件领域另一个术语‘句柄’也可以用来表述Binder在Client中的存在方式。

从通信的角度看,Client中的Binder也可以看作是Server Binder的‘代理’,在本地代表远端Server为Client提供服务。

本文中会使用‘引用’或‘句柄’这个两个广泛使用的术语。

面向对象思想的引入将进程间通信转化为通过对某个Binder对象的引用调用该对象的方法,而其独特之处在于Binder对象是一个可以跨进程引用的对象,它的实体位于一个进程中,而它的引用却遍布于系统的各个进程之中。

最诱人的是,这个引用和java里引用一样既可以是强类型,也可以是弱类型,而且可以从一个进程传给其它进程,让大家都能访问同一Server,就像将一个对象或引用赋值给另一个引用一样。

Binder模糊了进程边界,淡化了进程间通信过程,整个系统仿佛运行于同一个面向对象的程序之中。

形形色色的Binder对象以及星罗棋布的引用仿佛粘接各个应用程序的胶水,这也是Binder 在英文里的原意。

当然面向对象只是针对应用程序而言,对于Binder驱动和内核其它模块一样使用C语言实现,没有类和对象的概念。

Binder驱动为面向对象的进程间通信提供底层支持。

3.Binder 通信模型Binder框架定义了四个角色:Server,Client,ServiceManager(以后简称SMgr)以及驱动。

其中 Server,Client,SMgr运行于用户空间,驱动运行于内核空间。

这四个角色的关系和互联网类似:Server是服务器,Client是客户终端,SMgr是域名服务器(DNS),驱动是路由器。

3.1 Binder 驱动和路由器一样,Binder驱动虽然默默无闻,却是通信的核心。

尽管名叫“驱动”,实际上和硬件设备没有任何关系,只是实现方式和设备驱动程序是一样的:它工作于内核态,提供open(),mmap(),poll(),ioctl()等标准文件操作,以字符驱动设备中的misc设备注册在设备目录 /dev下,用户通过/dev/binder 访问该它。

驱动负责进程之间Binder通信的建立,Binder在进程之间的传递,Binder引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。

驱动和应用程序之间定义了一套接口协议,主要功能由ioctl()接口实现,不提供read(),write()接口,因为ioctl()灵活方便,且能够一次调用实现先写后读以满足同步交互,而不必分别调用write()和 read()。

3.2 ServiceManager 与实名Binder和DNS类似,SMgr的作用是将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder 名字获得对Server中Binder 实体的引用。

注册了名字的Binder叫实名Binder,就像每个网站除了有IP地址外都有自己的网址。

Server创建了Binder实体,为其取一个字符形式,可读易记的名字,将这个Binder连同名字以数据包的形式通过Binder驱动发送给SMgr,通知SMgr注册一个名叫张三的Binder,它位于某个Server中。

驱动为这个穿过进程边界的Binder创建位于内核中的实体节点以及 SMgr对实体的引用,将名字及新建的引用传递给SMgr。

SMgr收数据包后,从中取出名字和引用填入一张查找表中。

细心的读者可能会发现其中的蹊跷:SMgr是一个进程,Server是另一个进程,Server向SMgr注册Binder必然会涉及进程间通信。

当前实现的是进程间通信却又要用到进程间通信,这就好像蛋可以孵出鸡前提却是要找只鸡来孵蛋。

Binder的实现比较巧妙:预先创造一只鸡来孵蛋。

SMgr和其它进程同样采用Binder通信,SMgr是Server端,有自己的Binder实体,其它进程都是Client,需要通过这个 Binder的引用来实现Binder的注册,查询和获取。

SMgr提供的Binder比较特殊,它没有名字也不需要注册,当一个进程使用BINDER_SET_CONTEXT_MGR命令将自己注册成SMgr时Binder驱动会自动为它创建Binder实体(这就是那只预先造好的鸡)。

其次这个Binder的引用在所有Client中都固定为0而无须通过其它手段获得。

也就是说,一个Server若要向SMgr注册自己Binder就必需通过0这个引用和SMgr的Binder通信。

类比网络通信,0号引用就好比域名服务器的地址,你必须手工或动态配置好。

要注意这里说的Client是相对SMgr而言的,一个应用程序是个提供服务的Server,但对SMgr来说它仍然是个Client。

3.3 Client 获得实名Binder的引用Server向SMgr注册了Binder实体及其名字后,Client就可以通过名字获得该Binder的引用了。

Client也利用保留的0号引用向SMgr请求访问某个Binder:我申请获得名字叫张三的Binder的引用。

相关文档
最新文档