1.为什么需要了解多进程呢?
其实一般项目我们都接触不到这个,我现在项目也接触不到,但是作为一个小咸鱼还是得有点小梦想,毕竟大公司的大项目不少都是多进程,所以基于此我们还是要了解的。(下面的图都是网上找来的)
2.进程间通信方式
进程间通信方式有蛮多种,比如通过共享内存、Socket、管道啊等等,但是我们作为安卓开发并不会采用这些(而且这块我也不懂,后续如果需要再研究呗),安卓中使用的是binder。至于区别,如下图。
用binder的优势:
1.拷贝只需要一次,虽然有不需要拷贝的通信机制,但是就会涉及到信息资源时刻同步,这个是很耗性能的,而且控制极其复杂,易用性也差
2.安全,因为为每个app分配UID(可以看作是应用的身份证)。
3.内存划分
想知道怎么传输数据的,需要先了解内存划分
4.Binder与传统IPC如何传输数据的呢?
binder与传统ipc(进程间通信机制)对比
传统ipc传输数据流程
一次拷贝:服务端一块空间(虚拟内存)跟内核空间(虚拟内存)通过MMP映射到同一块物理内存
无需拷贝:发送端、接收端、共享区域映射到同一块物理内存.(会涉及到各种信息资源同步,导致控制复杂、易用性差)
5.上层通过AIDL、底层通过Binder实现安卓端的进程通信,AIDL实现进程间通信流程
目录:
一、学习Binder前必须要了解的知识点
二、ServiceManager中的Binder机制
三、系统服务的注册过程
四、ServiceManager的启动过程
五、系统服务的获取过程
六、Java Binder的初始化
七、Java Binder中系统服务的注册过程
一、学习Binder前必须要了解的知识点
1.Linux和Android的IPC机制种类
2.Linux和Binder的IPC通信原理
3.为什么要使用Binder
4.为什么要学习Binder?
二、ServiceManager中的Binder机制
1.基于Binder通信的C/S架构
2.MediaServer的main函数
3.每个进程唯一的ProcessState
4.ServiceManager中的Binder机制
三、系统服务的注册过程
1.从调用链角度说明MediaPlayerService是如何注册的
2.从进程角度说明MediaPlayerService是如何注册的
四、ServiceManager的启动过程
1.ServiceManager的入口函数
1.1 打开binder设备
1.2 注册成为Binder机制的上下文管理者
1.3 循环等待和处理client端发来的请求
五、系统服务的获取过程
1.客户端MediaPlayerService请求获取服务
2.服务端ServiceManager处理请求
六、Java Binder的初始化
1.Java Binder的JNI注册
1.1 Binder类的注册
1.2 BinderInternal类的注册
七、Java Binder中系统服务的注册过程
1.将AMS注册到ServiceManager
1.1 BinderInternal.getContextObject()
1.2 ServiceManagerNative.asInterface()
1.3 getIServiceManager().addService()
2.引出JavaBBinder
3.解析JavaBBinder
4.Java Binder架构
深入解析Binder源码
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是浮于表象,这对我们的知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读Android系统源码,还包括各种优秀的开源库。
所以这里为大家整理了Android开发相关源码精编解析,其中关于Binder的源码解析内容:
第一节 Binder 系列—开篇
第二节 Binder Driver 初探
第三节 Binder Driver 再探
第四节 Binder 启动 ServiceManager
第五节 获取 ServiceManager
相关面试题解答
1、你是否了解Binder机制?
从手机启动过程中的一些进程阐述
Binder分层架构图
Binder的oneway和非oneway数据传递图
Binder的优缺点: 性能(拷贝一次)、安全(校验UID、PID)
2、Binder这么好用,那为什么Zygote的IPC通信机制用Socket而不用Binder?
如果用了binder,zygote要先启动binder机制,打开binder驱动,获得描述符,mmap进程内存映射,注册binder线程,还要创建一个binder对象注册到serviceManager,另外AMS要想zygote发起创建应用进程请求的话,要先从serviceManager查询zygote的binder对象,再发起binder调用,非常繁琐。
相比之下,zygote和systemserver本就是父子关系,对于简单的消息通信,用管道或者socket非常方便。
如果zygote用了binder机制,再fork systemServer,那systemServer就继承了zygote的描述符和映射的内存,这两个进程在binder驱动层就会共用一套数据结构,这肯定是不行的。那还得把旧的描述符关掉,再重新启动一遍binder机制,自找麻烦。
3、为什么说Binder是安全的?
在数据传输过程中有身份的校验,通过UID、PID进行校验
4、Intent跨进程传大图为什么会崩溃?
常规的intent传递数据,在startActivity时将Bundle的 allowFds 设置成了false, 然后就会将 Bitmap直接写到 Parcel 缓冲区。如果通过 bundle.putBinder形式传递Bitmap,会开辟一个块共享匿名内存用来存Bitmap的数据,而Parcel 缓冲区只是存储 FD 。
5、AIDL的oneWay和非oneway有什么区别?
oneway和非oneway的架构图,oneway server端是串行处理,异步调用,Client端不用休眠等待驱动返回数据。
更多Android可以查看我的个人介绍!!!