zoukankan      html  css  js  c++  java
  • Android中Binder的基础知识点

    Android Binder基础知识点

        一 传统IPC和Binder机制的比较

        传统IPC:

        1)收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份。

        2)接入点开放,无法建立私有通道。

        3)socket, 管道和消息队列需要两次数据拷贝,传输效率差。

        4)共享内存的方式控制复杂,难以使用。

        Binder机制:

        1)为发送方添加UID/PID身份。

        2)既支持实名Binder也支持匿名Binder。

        3)传输过程只需要一次拷贝。

        二 Binder中的面向对象思想

        Binder对象是一个可以跨进程引用的对象,它的实体位于一个进程中,它的引用却遍布与系统的各个进程之中。这个引用和java里的引用一样,可以使强类型也可以使弱类型,而且可以从一个进程传递给其他进程。

        三 Binder的通信模型

        用户空间:Server,Client,ServiceManager;内核空间:Binder驱动。

        Binder驱动:和硬件没有关系,但实现方式和设备驱动一样,工作于内核态,用户通过/dev/binder访问它。

        ServiceManager:和DNS类似,将字符形式的Binder名字转化成Client中对该Binder的引用。

        Server:Server到ServiceManager的通信也是Binder实现,Server通过固定的0引用来获取ServiceManager的Binder引用。

        Client:Client通过名字获取Server注册的Binder引用。这些指向Binder的引用是强类型,从而确保只要有引用Binder实体就不会被释放掉。Client和Server直接还可以通过实名Binder发送匿名Binder,别的进程无法通过穷举或猜测获取匿名Binder的引用。

        四 通过AIDL使用Binder

        Android会将AIDL文件转化成一个IInterface接口,接口内会有一个实现此接口并继承Binder的Stub存根类,Server通过Stub的具体实现类来提供一系列的业务操作。

        Stub的内部会有一个继承Stub的Proxy代理类,Client通过Stub的asInterface方法获取Proxy的实例,来远程访问Server提供的方法。

        这是一个典型的存根-代理模式,使得上层代码不用考虑IPC的底层实现细节。

        另外,AIDL接口除了传递Java基本类型外,还可以传递任何实现Parcelable接口的复杂类型。AIDL接口还可以传递另一个AIDL接口,注意,这本质上就是一个匿名Binder,Server可以通过Client传递的AIDL接口反向调用Client中的方法,在这里要注意内存溢出的问题。

  • 相关阅读:
    自定义ProgressBar
    Anroid开发中常用快捷键
    Intent用法
    IO(Input Output)流
    自定义Dialog
    仿UC点击两次返回键退出程序
    横竖屏切换时Activity的生命周期
    单例模式
    Timer用法
    关于数组
  • 原文地址:https://www.cnblogs.com/yuanchongjie/p/4521375.html
Copyright © 2011-2022 走看看