AIDL机制

来源:互联网 发布:正版bim软件多少钱 编辑:程序博客网 时间:2024/06/06 08:57
Binder详解: http://blog.csdn.net/yangzhiloveyou/article/details/14043801
Android深入浅出之Binder机制: http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html
Android的IPC机制Binder的各个部分: http://blog.chinaunix.net/uid-9185047-id-3281772.html

Android实战技术:理解Binder机制: http://blog.csdn.net/hitlion2008/article/details/9842289

Android系统篇之----Binder机制和远程服务调用机制分析-- http://blog.csdn.net/jiangwei0910410003/article/details/52467919


在Android系统的虚拟机中,每一个app运行都是在一个独立的沙箱里面的,这样的话,一个应用崩溃也不会影响到其他应用,这样我们就提出了一个问题,跨进程如如何进行通讯?如何传递数据?其实两个进程是不能直接通讯的,他需要Android系统底层的帮助来进行通讯!那就是我们每个人都知道的四大组件

如果您不需要执行并发IPC在不同的应用程序中 你就用Binder ,或者如果你想执行IPC,但不需要处理多线程,实现你的接口Messenger,无论如何,确保你了解实现AIDL之前绑定服务。

AIDL/IPC/多应用/多线程;AIDL(以及Binder);Binder/IBinder ; Messenger

 代理实现/存根通信

1.基本数据类型 2.String 3.CharSequence 4.List 5.Map 6.Parcelable(序列化)

关于AIDL的介绍在文档:docs/guide/developing/tools/aidl.html
关于IBinder的介绍在文档:docs/reference/android/os/IBinder.html
以及Binder:docs/reference/android/os/Binder.html

android进程间通信:使用AIDL-- http://blog.csdn.net/saintswordsman/article/details/5130947

COM的一个概念---------Proxy/Stub结构(代理/存根结构) 
 Android就是在传统的C/S架构中加入了一层,实现IPC。我们下面来详细介绍一下android的aidl实现原理 
    AIDL(Android接口定义语言)是类似于其他你遇到过的IDL。它允许您定义的编程接口,客户端和服务达成一致,以互相交流使用进程间通信(IPC)。在Android上,一个进程无法正常访问另一个进程的内存,而AIDL可以为你实现。
-----------------------
Binder实现的是RPC,它与具体语言无关,所以理论上,基于Binder可以让Native的进程与Android Java层的应用程序通讯。最关键的,也是最麻烦点就在于客户端如何获取服务端的Service的IBinder对象,但也非不可能,要通过JNI和ClassLoader等一系列方式可以获得Java层的对象,其实Java层API的实现也是以这样子的方式

  Binder是什么?它可以叫作:IPC、RPC、线程迁移、远程对象访问,本文中理解它为远程对象访问更贴切些,简而言之就是一个进程能访问另一个进程中的对象,调用该对象的方法,就好像对象在自己的进程中一样,这种访问是同步的访问,当然Binder也能实现异步的通信。

  Binder分为Java和C++两套实现,分别用于Java应用和Native应用开发,Java Binder实际上也是基于C++ Binder的一个封装,因此本文只分析C++ Binder。
服务分为2种:Native Service、Android Service。
Native Service:是在系统init阶段通过init.rc脚本建立的服务,完全在C++空间完成的服务。
Androids service:是系统二阶段(init2)初始化时建立的服务,是指在JVM空间完成的服务,虽然也要使用Navite上的框架,但是服务主体存在于Android空间,所有的Androids service都运行在一个进程中:systemsever进程。

实现原理
Binder本质上说就是一种数据传输方式,当通过服务代理调用服务对象的方法时,服务代理把参数序列化进行传输,服务对象反序列化取出参数,然后调用服务对象的方法。
进程间的通信是通过Android专门为Linux增加的一个设备(/dev/binder)来实现的。

本质上是使用了共享内存来进行通信,但该共享内存和我们平常理解会有一点不一样。
我们平常使用的共享内存是两个进程之间,即点到点的,如果有N个进程要两两通信而又不相互干扰,那么就必须有N*N个共享内存。Binder使用的共享内存是进程与binder设备之间,即binder做为一个中间者进行传递,类似会议电视的MCU。
使用了共享内存,在驱动中还是会有一次拷贝的,进程A向进程B传递数据时,数据会被驱动从进程A中拷贝到binder和进程B之间的共享内存中,然后进程B就可以直接读了。
0 0
原创粉丝点击