[002]Binder整体框架的介绍

前言

我一直在想是从上往下讲Binder架构,还是从下往上讲,最后还是决定从下往上讲,那我们先来聊聊Binder驱动,这里不和你讲太多的源码,比如用户空间拷贝数据到内核空间具体实现,Binder线程池的具体实现。我们从宏观角度来分析一下Binder驱动要怎么设计。

如何找到两个进程可以数据共享的区域?

在第一章中,我们设计的Binder是通过SD卡来实现数据共享区域,但是有一个几个问题,第一SD卡的读写速度太慢,第二SD卡的文件安全性不够。所以Binder驱动采用了内核空间共享内存的方式。什么是内核空间,一个4G的手机,在运行的时候3G是给用户空间,1G是给内核空间,所有进程对内核空间是共享的,所以Binder用内核空间来共享数据。

Binder驱动要做的几件事?

1.提供一个设备节点(dev/binder),让用户空间进程可以操作内核空间。
2.提供接口给用户空间进程,开辟一块内核空间作为共享内存区域,将内核空间的物理内存地址和用户空间的虚拟内存地址映射,这样子用户空间的进程就可以对这个内核空间进行读写了。
2.提供接口给用户空间进程往这个共享区域读写数据。

用一个图简单解释一下


屏幕快照 2018-11-14 下午1.56.14.png

Binder驱动提供的接口有哪些?

1.最底层的接口:open,mmap,ioctl,大家有个印象就好,一般人不会直接使用

open:打开设备节点
mmap:分配共享区域
ioctl:对共享内存读写数据,并且是一些binder调用的事务管理。

2.中层的接口:这也是用的比较多的,尤其是native的服务,我们来分析开机动画,因为它最简单:
int main()
{
    setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);

    bool noBootAnimation = bootAnimationDisabled();
    ALOGI_IF(noBootAnimation,  "boot animation disabled");
    if (!noBootAnimation) {

        sp<ProcessState> proc(ProcessState::self());
        ProcessState::self()->startThreadPool();

        waitForSurfaceFlinger();

        // create the boot animation object
        sp<BootAnimation> boot = new BootAnimation(new AudioAnimationCallbacks());
        ALOGV("Boot animation set up. Joining pool.");

        IPCThreadState::self()->joinThreadPool();
    }
    ALOGV("Boot animation exit");
    return 0;
}

注意上面的几个代码
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();

两个重要的对象ProcessState和IPCThreadState

ProcessState是一个singleton类,每个进程只有一个对象,这个对象负责打开Binder驱动,开辟一个共享空间,建立线程池,让其进程里面的所有线程都能通过Binder通信

每个线程都有一个IPCThreadState实例登记在Linux线程的上下文附属数据中,主要负责Binder的读取,写入和请求处理框架。

3.最上层的接口BpBinder(客户端)和BBinder(服务端),以及BinderProxy.java(客户端)和Binder.java(服务端):

对象ProcessState和IPCThreadState,可能会有人比较难理解,说白了就是对Binder驱动最底层的封装接口,方便Native的进程来使用。所以如果你是native的进程完全可以只通过ProcessState和IPCThreadState来进行Binder通信,但是程序员就是喜欢偷懒,Binder又提供了BpBinder和BBinder来封装ProcessState和IPCThreadState,但是BpBinder和BBinder不是java的接口,所以上层有提供了BinderProxy.java和Binder.java通过JNI封装BpBinder和BBinder给Java层使用。

用以下的图来标识(可惜图中没有显示ProcessState和IPCThreadState,其实他们都在Native IPC层的BpBinder和BBinder都在这一层)

屏幕快照 2018-11-14 下午2.46.03.png

小结

对于普通的工程师来说,基本不会去改Binder驱动的代码,源码中的各色各样的服务,都是去继承BpBinder和BBinder,或者BinderProxy和Binder来实现跨进程通信,最后当然会调用到Binder驱动中。我们来简单描述一下一次跨进程的通信,我们以最简单的BinderProxy和Binder为例。

1.在应用A中new 一个BinderA对象继承于Binder,调用ServiceManager的addService方法,将BinderA对象的存储到SM中,把BinderA对象的唯一标识(int值)存下来,其实这一步已经有一个Binder IPC通信了,就是上图中的1.注册服务
这个过程中应用A是client端,SM是server端

2.在应用B中调用ServiceManager的getService的方法,拿到了BinderA对象的唯一标识(int值)。这一步也是跨进程通信,就是上图中的2.获取服务。并根据这个BinderA对象的唯一标识,创建的BinderProxyA对象

3.应用B中用BinderProxyA对象去通过Binder驱动调用BinderA对象的接口,就是上图中的3.使用服务。

思考

1.目前是通过IBinder定义的接口来IPC通信,说白了需要以下几个参数,那我们如何做到RPC呢,说白了就是看起来直接调用方法一样容易,这个我就会在第三章《AIDL到底是什么》给各位解释。
handle-binder的唯一标识符
code-方法名
date -方法的参数
reply-方法的返回值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容