️:binder 机制将业务细分为不同的命令,调用 binder_ioctl() 时传入具体的命令来区分业务,比如有读写数据的 BINDER_WRITE_READ 命令、 Service Manager 专用的注册为 DNS 的命令等等。
BINDER_WRITE_READ 命令最为关键,其细分了一些子命令,比如 BC_TRANSACTION、BC_REPLY 等。BC_TRANSACTION 就是上层最常用的 IPC 调用命令了,AIDL 接口的 transact 方法就是这个命令。
面试官:binder 驱动中要实现这些业务功能,必然要用一些数据结构来存放相关数据,比如你上面说 binder_open() 方法时提到的 binder_proc,你还知道其他的结构体吗?
️:知道一些,比如:
| 结构体 | 说明 |
| — | — |
| binder_proc | 描述使用 binder 的进程,当调用 binder_open 函数时会创建 |
| binder_thread | 描述使用 binder 的线程,当调用 binder_ioctl 函数时会创建 |
| binder_node | 描述 binder 实体节点,对应于一个 serve,即用户态的 BpBinder 对象 |
| binder_ref | 描述对 binder 实体节点的引用,关联到一个 binder_node |
| binder_buffer | 描述 binder 通信过程中存储数据的Buffer |
| binder_work | 描述一个 binder 任务 |
| binder_transaction | 描述一次 binder 任务相关的数据信息 |
| binder_ref_death | 描述 binder_node 即 binder server 的死亡信息 |
其中主要结构体引用关系如下:
面试官:可以,我们再来聊聊别的。
这个问题虽有些 “面试造火箭” 的无奈,可难点就是亮点、价值所在,是筛选面试者的有效手段。如果问你这个问题,你能回答多少呢?
最后
最近整理了一份《Android Binder原理学习笔记》,集合了**「Linux、C/S架构、ServiceManager、ProcessState、系统服务的注册过程、ServiceManager的启动过程、系统服务的获取过程、MediaPlayerService、JNI、Binder类的注册、AMS、JavaBBinder」**等N多技术点。
目录:
一、学习Binder前必须要了解的知识点
二、ServiceManager中的Binder机制
三、系统服务的注册过程
四、ServiceManager的启动过程
五、系统服务的获取过程
六、Java Binder的初始化
七、Java Binder中系统服务的注册过程
1.Linux和Android的IPC机制种类
2.Linux和Binder的IPC通信原理
3.为什么要使用Binder
4.为什么要学习Binder?
1.基于Binder通信的C/S架构
2.MediaServer的main函数
3.每个
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
进程唯一的ProcessState
4.ServiceManager中的Binder机制
1.从调用链角度说明MediaPlayerService是如何注册的
2.从进程角度说明MediaPlayerService是如何注册的
1.ServiceManager的入口函数
1.1 打开binder设备
1.2 注册成为Binder机制的上下文管理者
1.3 循环等待和处理client端发来的请求
1.客户端MediaPlayerService请求获取服务
2.服务端ServiceManager处理请求
1.Java Binder的JNI注册
1.1 Binder类的注册
1.2 BinderInternal类的注册
1.将AMS注册到ServiceManager
1.1 BinderInternal.getContextObject()
1.2 ServiceManagerNative.asInterface()
1.3 getIServiceManager().addService()
2.引出JavaBBinder
3.解析JavaBBinder
4.Java Binder架构
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是浮于表象,这对我们的知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读Android系统源码,还包括各种优秀的开源库。
阅读源码永远是学习最快的方式。
所以这里为大家整理了Android开发相关源码精编解析,其中关于Binder的源码解析内容:
第一节 Binder 系列—开篇
第二节 Binder Driver 初探
第三节 Binder Driver 再探
第四节 Binder 启动 ServiceManager
第五节 获取 ServiceManager
一线企业的app都是多线程和多进程的,而Android进程间通信机制就是Binder,原生的线程间通信则是Handler,Binder和Handler是了解安卓运行机制必须要掌握的一个知识点,更是一线企业面试必问的知识点!
以下几道就是大厂关于和Binder常见的面试真题: