BInder源码分析

什么叫Binder,从不角度理解有不同含义:

从IPC层:binder是安卓跨进程通信的方式。

从安卓driver层:binder是虚拟的物理设备。

从安卓native层:binder是创建 service manager 以及BpBinder和BBinder模型,搭建binder驱动层的桥梁。

从安卓framework层: binder是activitymanager,windmanager等些manager对应的activitymanagerservice,windmanagerservice等service;他们之间的桥梁。

从APP层:binder是客服端和服务端进行通信的媒介,当客服端通过bindservice的时候,服务端返回有个包含服务端业务的binder对象,通过binder对象可以获取服务端的服务或者数据,即AIDL。

 

//binder在不同层扮演角色不同,我们先从driver层源码分析

//driver层版本:kernel_3.18

通过源码分析核心方法知道binder在驱动层的工作流程

例如通过   binder_init 方法  初始化binder;

                  binder_open 方法 打开binder设备;

                  binder_mmap 方法 数据映射;

                  binder_ioctl 方法  binder数据操作;

 

在线代码地址http://androidxref.com/kernel_3.18/xref/drivers/staging/android/binder.c

 

//native层

说道native层就不得不分析下service manager了,作为binder的大管家,在整个binder中起到中心枢纽作用

service manger的源码我可以从四个方面分析

启动:   service manager    通过调用binder_open打开binder设备,

                                            调用binder_become_context_manager 把service manager提升为binder大管家

                                            调用binder_loop 无限循环, 处理客户端发来的消息。

 

源码:http://androidxref.com/9.0.0_r3/xref/frameworks/native/cmds/servicemanager/service_manager.c

 

获取: 通过调用IServiceManager 的defaultServiceManager函数 获取service manger

 

源码:    http://androidxref.com/9.0.0_r3/xref/frameworks/native/libs/binder/IServiceManager.cpp

 

 

注册服务 :调用do_add_service 注册服务

源码:http://androidxref.com/9.0.0_r3/xref/frameworks/native/cmds/servicemanager/service_manager.c

 

查询服务 :调用do_find_service 查询服务

源码:http://androidxref.com/9.0.0_r3/xref/frameworks/native/cmds/servicemanager/service_manager.c

 

 

BBinder负责把service注册到service manager;BPBinder负责从service manager获取需要的service ,调用service的服务。

BInder源码分析_第1张图片

 

 

//framework层

初始化;安卓系统在开机过程,zygote启动过程会注册虚拟机,调用jni层的AndroidRunTime ::startReg函数注册服务

调用jni的Android_util_binder 获取服务 BinderPorxy

 

 

 

 

 

BInder源码分析_第2张图片

 

APP层就是AIDL,具体实现代码可以看 https://blog.csdn.net/qq_36237165/article/details/102458074

你可能感兴趣的:(工具,控件)