Binder整理
1、IPC: 进程间通讯或者夸进程通信
windows ipc方式:剪贴板、管道、邮槽等等
linux pic方式:管道、信号量、共享内容等等
Android是基于linux的,但是android有自己的特有的ipc方式:binder。
2、进程与线程是什么、有什么关系。
3、Android开启多进程的方式:基于四大组件的android:process属性,:remote代表代表该进程的私有进程,其他的应用组件不可以跑入这个进程,没有冒号代表全局进程,其他进程可以共享这个进程。还有一个开始方式通过jni在native层去fork一个新的进场,这个不细研究了。
uid:这个是应用在安装的时候系统给应用分配的唯一的uid,只有uid相同的才可以共享数据,当两个应用的shareId相同并且签名也相同的话,他们就可以跑在一个进程里面,他们可以访问对方的私有数据例如:共享组件信息,data目录,共享内存等,
应用在创建新的进程时会执行新的application初始化工作,系统会给他分配单独的虚拟机,所以对于一些可修改静态的值,在一个应用的两个进场可能会是不同的值,当然他们内存地址也不是同一个。
4、Serializable、Parcelable 数据传递(intent、网咯、binder)是可序列化的,熟悉两种序列化的优缺点。
5、android 实现夸进程的方式:共享文件、sp、Intent传递数据、Messenger、contentProvider、aidl、socket等等。而Intent传递数据、contentProvider、Messenger、aidl主要用的是binder。
intent、bandle本身是实现Parcelable接口的,并且他们也可以携带参数需要熟悉他们能传递的参数,这些参数通过他们可以实现跨进程通信。
aidl:是快速实现binder的语言,在aidl目录创建aidl接口文件,环境会自动生成实现接口的jave binder类。
实现binder不一定要用aidl语言,他有特定的格式只是让你快速实现
binder,对于binder我们完全可以自己仿照他的binder实现自己写出来。
Messenger:底层是由aidl实现的,可快速实现多对一的串行通信,实现起来比较简单,binder一个Service,在service和Activity都创建Messenger 通讯即可。
contentProvider:底层也是binder来实现的数据通信。
6、Binder连接池:实现方式定义一个获取binder方法(queryBinder(int binderCode))的aidl接口文件,开启的服务直接返回该binder,在由该binder里的获取binder的方法获取我们的各个其他的binder。
7、binder使用场景和比较
8,AIDL理解,通信中的几个角色
AIDLIInterface extend android.os.IInterface aidl接口:开发者继承该接口声明自己的业务接口。
Stub extends android.os.Binder implements AIDLIInterface 服务器Binder传输类,服务器bindler要实现的抽象类
Proxy implements AIDLIInterface 客户端Binder传输类,里面封装的服务端IBinder,可作为服务端的在客户端的句柄,通过它来像服务端传输数据。
SSS extend Stub 真正实现AIDLIInterface接口的服务端bindler。
9,bindler通讯数据需要一次拷贝,socket进程通信需要两次拷贝,共享内存无需拷贝用户空间和内核空间(逻辑内存)映射到同一块物理内存。
socket效率低,并且两个应用通信安全性无法保证,应用端通过虚假的pid传输数据安全性无法保证
共享内存直接操纵内存,数据需要同步机制,不好维护,控制复杂
Bindler 为每个APP分配UID 同时支持实名和匿名
binder设计分析https://blog.csdn.net/universus/article/details/6211589