


// BpBindere 会直接用 server handle 调用 IPCThreadState::transact() 与 binder driver 进行通讯
BpBinder::transact
--IPCThreadState::self()->transact(binderHandle() /* 0 */, code, data, reply, flags)
----IPCThreadState::writeTransactionData(BC_TRANSACTION, flags, handle, code, data, nullptr)
----IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult)
------IPCThreadState::talkWithDriver(bool doReceive)
--------ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr)
BpBinder client native proxy,客户端 native 层的 binder ipc 代理(IBinder),它最重要的是持有 server 端句柄 handle,handle == 0 表示 service manager,其他的需要通过 service manager 查询得到,参看 AMS的例子
BinderProxy client java proxy,客户端 java 层的 binder ipc 代理(IBinder),是 BpBinder 在 java 层的体现,参看 AMS的例子
IActivityManager.Stub.asInterface(IBinder) client 通过此方法获得一个实现了 IActivityManager 的代理,IBinder 可以是 Stub 子类(本地),也可以是 BinderProxy(IPC)
IServiceManager.Stub.Proxy 它实现了契约接口 IServiceManager,需要一个 BinderProxy 作为底层实现,它将参数打包为 Parcel 交由 BinderProxy 处理,并从 BinderProxy 返回的 Parcel 里读取返回值,参看 AMS的例子
IActivityManager.Stub extends android.os.Binder server java impl,server 端对契约接口的实现继承自 Stub 类(IBinder),实现约定好的业务方法(java 层)
BBinder & JavaBBinder server native ref,server 端的业务实现 Stub 类在 native 层的体现(IBinder),Binder.mObject 指向 native 层的 JavaBBinderHolder,从 holder 可以获取 JavaBBinder(BBinder 的子类),binder ipc 序列化 IBInder 时,如果是 BpBinder 则写入 handle 即可,如果是 BBinder 则写入此对象的地址,那么 server 端在收到 RPC 请求时就可以通过对象地址找到 BBinder -> JavaBBinder -> Stub 类 -> 调用指定的方法,参看 AMS的例子
IActivityManager 约定了 client 与 server 之间数据交互(RPC)的契约(contract)的 java interface
ServiceManager server 通过它进行服务注册 addService(String name, IBinder service),client 通过他获得通讯句柄 getService(String name)
ProcessState 进程内单例,负责打开 binder driver 文件描述符,并进行 mmap 操作
IPCThreadState 线程私有(ThreadLocal),负责与 binder driver 通讯,实现了 binder ipc 大部分的底层逻辑,它有很多种使用方式:
1,IPCThreadState::transact(int32_t handle, uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
最简单、最常用的方式,需要一个从 service manager 获取的 server 端句柄,直接向 server 端发送请求并等待响应
2,IPCThreadState::handlePolledCommands()
当 binder fd 上有事件发生时调用此方法让 IPCThreadState 处理 binder driver 过来的数据,参见 service manager 处理 binder 消息的循环
3,IPCThreadState::joinThreadPool(bool isMain)