binder

android binder

血红的双手。 提交于 2021-01-16 01:59:46
android 实现binder机制的server进程学习 进程开始会打开binder设备,谁打开的呢?就是ProcessState:self,再加一句,这个对象是单例的。它还会创建一个接收数据的共享内存,返回fd,每个进程只会打开一次binder设备。 server要想跟服务管理器注册服务,就需要一个代理,跟服务管理器交互,即IServiceManager,defaultServiceManager返回在服务管理器的代理端,这个interface_cast需要一个BpBinder作为参数,先探讨参数BpBinder的产生过程;ProcessState::self->getContextObject需要传递一个参数Handler 0(0就是服务管理器,其余的服务是别的),根据Handler查询返回代理端IBinder(BpBinder(0)),这中间的过程呢,根据两个宏定义,一个声明方法,一个实现方法,来生成了一个Bp** BpBinder 是客户端用来与server交互的代理类,p即Proxy的意思;BBinder则是与proxy相对的一端,他是proxy交互的目的端,如果说Proxy代表客户端,那么BBinder则代表服务端。 IServiceManager、BpServiceManager和BnServiceManager都与业务逻辑相关

Binder进程间通信系统第五篇-----Binder进程间通信实例

☆樱花仙子☆ 提交于 2020-04-08 09:21:17
注意1 class IFregService: public IInterface 服务接口是为 class BnFregService: public BnInterface 服务的,如下声明和定义的服务接口,是为FregService服务提供的接口,这是Binder进程间通信的基本要求,Binder进程间通信机制要求提供服务的一方必须提供一个跨进程访问能力的服务接口,以便使用服务的一方可以通过该接口来访问服务。接口名就是 descriptor : " hr.ma.IFregService " 。客户进程可以在 service manager中通过该 名称 获取服务的接口,然后访问服务。 DECLARE_META_INTERFACE(FregService); /* * 0. 使用宏 IMPLEMENT_META_INTERFACE 来实现IFregService类的元接口 * 1. 将 IFregService类的静态成员变量 descriptor 设置为 " hr.ma.IFregService " * 2. 实现了 IFregService类的构造函数和析构函数,是空函数 * 3. 实现了成员函数 getInterfaceDescriptor() ,用来获取一个IFregService类的描述符,即 descriptor * 4. 实现了 asInterface()

Binder

丶灬走出姿态 提交于 2020-03-23 09:33:11
3 月,跳不动了?>>> Binder是IPC(进程间通信)方式的一种 为啥要用多进程呢? 每个应用占有单独的进程,虚拟机给每个应用分配的内存的有限的,也就是分配给每个进程的内存是有限的,如果我们把所有功能都放在一个进程中,向下载,加载大图片等很消耗内存,很容易造成主进程的内存耗尽,导致oom,所以可以另起一个进程来处理这些操作,并且在新的进程中,即便这些操作出bug了,也不会影响主进程运行 进程间如何通信的? 首先进程间是不能直接通信的,每个应用也就是进程分为用户空间和内核空间,用户空间之间是隔离的,但是内核空间是相通的,所以我们就可以将数据从用户空间A先传到内核空间,然后从内核空间再把数据传递到用户空间B进行接收,这样就形成了进程间的数据传递,也就是通信了 在binderservice时候,传递的第二个参数ServiceConnection中,asInterface, 这时候会调系统给生产的aidl文件中Proxy 这个Proxy类就是传递数据的,进入这个类里,就会看到我们自己写的aidl中的方法,我这里是addinfo 而通过Proxy中transcat方法将数据传递进binder,在binder中又会调用ontranscat中addinfo ,一调用这个方法这时候就会进入到服务端的stub中,stub是接收数据 一调这个addInfo就会调服务端的 这就形成了通信

Android Framework:Binder(5)-Native Service的跨进程调用

丶灬走出姿态 提交于 2020-03-11 00:19:00
Android Framework:Binder(5)-Native Service的跨进程调用 一、Native Service调用概述   在上一篇Native service的注册就已经可以看到Client端请求Server端的过程,Native Service是Client端,ServiceManager是Server端。   本篇从Native Service调用的角度来学习Client端是如何通过Binder驱动跨进程调用Server端的方法的。还是以Camera Service作为案例分析。   废话不说先上图:    上图主要有以下几个重点:   1. Client端跨进程调用Service端需要先跨进程向ServiceManager进程查询该Service,并获取到该包含该Service的handle值的扁平的binder对象,进而在Client端构造出Service的代理对象,通过该Service代理对象调用Service的方法。   2. Service在初始化时需要跨进程向ServiceManager注册自己,之后搭建了自己的线程池机制不断访问binder驱动查看是否有发向自己的Client端请求。   3. Client,Service,ServiceManager是运行在用户空间的独立进程,binder驱动运行在内核空间

使用AIDL

 ̄綄美尐妖づ 提交于 2020-03-07 21:06:52
copy from: https://www.jianshu.com/p/8a188d1d973a 1.服务端 服务端首先要创建一个Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在Service中实现这个AIDL接口即可。 2.客户端 首先绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。需要注意的是,AIDL的包结构在服务端和客户端要保持一致,否则运行会出错,这是因为客户端需要反序列化服务端中和AIDL接口相关的所有类,如果类的完整路径不一样的话,就无法成功反序列化,程序也就无法正常运行。 步骤一:创建Book.java类、Book.aidl类、IBookManager.aidl类 详见: IPC机制(二) 步骤二:创建Service并重写IBookManager类 服务端 不要忘了在AndroidManifest.xml中注册: 清单文件注册 步骤三:在客户端中启动Service 客户端 运行结果: AIDL使用运行结果 假设有一种需求:用户不想时不时地去查阅图书馆列表了,于是他去问图书馆,“当有新书时能不能把新书的信息告诉我呢?”这是一种典型的观察者模式,每个感兴趣的用户都观察新书,当新书到的时候

自定义SimpleAdapter

时光毁灭记忆、已成空白 提交于 2020-03-06 18:59:32
SimpleAdapter,跟名字一样,一个简单的适配器,既为简单,就只是被设计来做简单的应用的,比如静态数据的绑定,不过仍然有自定义的空间,比如说在每一个ListItem中加一个按钮并添加响应事件.首先还是先看一下SimpleAdapter的定义吧,直接翻译下SDK doc 吧:   这是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图。你可以指定由Map组成的List(比如ArrayList)类型的数据。在ArrayList中的每个条目对应List中的一行。Maps包含每一行的数据。你可以指定一个XML布局以指定每一行的视图,根据Map中的数据映射关键字到指定的视图。绑定数据到视图分两个阶段,首先,如果设置了SimpleAdapter.ViewBinder,那么这个设置的ViewBinder的setViewValue(android.view.View, Object, String)将被调用。如果setViewValue的返回值是true,则表示绑定已经完成,将不再调用系统默认的绑定实现。如果返回值为false,视图将按以下顺序绑定数据: 如果View实现了Checkable(例如CheckBox),期望绑定值是一个布尔类型。 TextView.期望绑定值是一个字符串类型,通过调用setViewText(TextView, String)绑定。

Android深入浅出之Binder机制

旧城冷巷雨未停 提交于 2020-02-29 17:07:08
Android 深入浅出之 Binder 机制 一 说明 Android 系统最常见也是初学者最难搞明白的就是 Binder 了,很多很多的 Service 就是通过 Binder 机制来和客户端通讯交互的。所以搞明白 Binder 的话,在很大程度上就能理解程序运行的流程。 我们这里将以 MediaService 的例子来分析 Binder 的使用: <!--[if !supportLists]--> l <!--[endif]--> ServiceManager ,这是 Android OS 的整个服务的管理程序 <!--[if !supportLists]--> l <!--[endif]--> MediaService ,这个程序里边注册了提供媒体播放的服务程序 MediaPlayerService ,我们最后只分析这个 <!--[if !supportLists]--> l <!--[endif]--> MediaPlayerClient ,这个是与 MediaPlayerService 交互的客户端程序 下面先讲讲 MediaService 应用程序。 二 MediaService 的诞生 MediaService 是一个应用程序,虽然 Android 搞了七七八八的 JAVA 之类的东西,但是在本质上,它还是一个完整的 Linux 操作系统

自定义SimpleAdapter

江枫思渺然 提交于 2020-02-29 16:46:23
SimpleAdapter,跟名字一样,一个简单的适配器,既为简单,就只是被设计来做简单的应用的,比如静态数据的绑定,不过仍然有自定义的空间,比如说在每一个ListItem中加一个按钮并添加响应事件.首先还是先看一下SimpleAdapter的定义吧,直接翻译下SDK doc 吧:   这是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图。你可以指定由Map组成的List(比如ArrayList)类型的数据。在ArrayList中的每个条目对应List中的一行。Maps包含每一行的数据。你可以指定一个XML布局以指定每一行的视图,根据Map中的数据映射关键字到指定的视图。绑定数据到视图分两个阶段,首先,如果设置了SimpleAdapter.ViewBinder,那么这个设置的ViewBinder的setViewValue(android.view.View, Object, String)将被调用。如果setViewValue的返回值是true,则表示绑定已经完成,将不再调用系统默认的绑定实现。如果返回值为false,视图将按以下顺序绑定数据: 如果View实现了Checkable(例如CheckBox),期望绑定值是一个布尔类型。 TextView.期望绑定值是一个字符串类型,通过调用setViewText(TextView, String)绑定。

Binder进程间通信(六)---- Binder进程间通信库

老子叫甜甜 提交于 2020-02-29 11:11:48
基本知识 android系统应用层使用Binder进程间通信的时候并不是直接和binder驱动程序互动,而是通过了一个封装库,我们称之为Binder进程间通信库。 我们之前说到了Client组件和Servicr组件,分别对应Binder驱动程序中的Binder实体对象(binder_node)和Binder引用对象(binder_ref)。在Binder通信库中也有两个类和之对应,分别是Binder本地对象BnInterface 表示Service和 Binder代理对象 BpInterface 表示client 这两个接口都定义在/ frameworks / native / include / binder / IInterface.h 文件中。 // ---------------------------------------------------------------------- template<typename INTERFACE> class BnInterface : public INTERFACE, public BBinder { public: virtual sp<IInterface> queryLocalInterface(const String16& _descriptor); virtual const String16&