什么叫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的服务。
//framework层
初始化;安卓系统在开机过程,zygote启动过程会注册虚拟机,调用jni层的AndroidRunTime ::startReg函数注册服务
调用jni的Android_util_binder 获取服务 BinderPorxy
APP层就是AIDL,具体实现代码可以看 https://blog.csdn.net/qq_36237165/article/details/102458074