1 android 进程间通信的主要机制: binder
2 binder 实现一次memcpy:
3 binder 的memory 封装出来了统一类:Parcel
4 IINTERFACE是接口封装,定义Proxy端和server端的接口形式
5 BpInterFace 其实是BpBinder的代理类,内部的mRemote指的就是BpBinder
6 asInterFace的接口在android 内部已经定义了一个宏,内部实现是new BpInterFace(BpBinder)
7 BpBinder 在调用IPCThreadState 调用到binder driver
8 IPCThreadState是一个thread 单例,
使用pthread_getspecific/ pthread_setspecific 方式实现线程单例
9 IPCThreadState是ioctol的形式与binder driver 通信,
将parcel的data 存放到driver的数据协议中
binder driver 可以创建server的thread,去处理binder消息
10 BpInterFace端封装出来的接口是APIName -> mRemote.transact -> BpBinder.transact -> IPCThreadState.transact -> writeTransactionData> waitForResponse > talkWithDriver >
11 ProcessState 是进程的单例,将构造函数变成了private,开发了self API。
构造函数时打开binder driver fd。
12 ProcessState mmap memory,server端执行该动作,将自己的memory与driver memory 共享,这样client端调用时,只需要将memory 从client process的 userspace,copy到kernerl 层的binder driver。这样kernel driver的memroy已经与server process 共享了,所以server也就能访问了
copy_from_user/ copy_to_user
13 ProcessState负责创建thread--IPCThreadState, driver 可以通过ioctl command 创建thread--IPCThreadState
ProcessState.spawnPooledThread > IPCThreadState.joinThreadPool 有参数isMain:
False--BC_REGISTER_LOOPER: 由binder request创建,创建thread后再将该binder注册到driver中
True---BC_ENTER_LOOPER:由用户层触发,告诉binder driver该thread就绪可以接受信息
14 IPCThreadState与Binder driver通信是通过handle, BpBinder内部存储该Handle, handle的意义是binder driver中内部维护的一个int 值,存储的是binder server端在该进程中的引用值。
15 binder driver 内部维护了process 对应的结构体, 包括thread 信息,binder server信息,binder client 引用等。