Android源码(8)-Binder理解篇

搬砖

Binder

1. 理解”上下文”

system_server

* zygote fork 出来的一个进程。

ServiceManager

* 在system_server进程中new的对象
* 核心作用 ServiceManager.addService -> ServiceManagerProxy.addService -> IServiceManager.stub.asInterface(binder).addService
* 上面的binder = this.getNativeServiceManager(),跟踪代码 -> ProcessState::self()->getContextObject(nullptr);。找到了 hander = 0 的,第一个使用 /dev/binder 的Ibinder对象. 
* 跟踪 hander=0 的第一个binder 。原来是servicemanager进程(frameworks/native/cmds/servicemanager/main.cpp)将servicemanager.CPP 先是通过 manager->addService("manager" 添加到内存map中,方便其他其地方获取service,然后通过 IPCThreadState::self()->setTheContextObject(manager); 将这个进程标记为 “上下文管理器”(context manager)

ContextManager

* 调用 ioctl(mDriverFD, BINDER_SET_CONTEXT_MGR_EXT, &obj); 

client

* aidl 文件自动编译生成java类;
* IServiceManager.stub.asInterface() 更具所在进程判断是否返回 remote(是一个proxy)
* virtual BpBinder* remoteBinder();
* proxy 会装箱拆箱,执行mRemote.transact远端调用 -> BpBinder::transact -> ioctl -> binder_ioctl (内核)-> copy_from_user -> 查找进程,唤醒线程 -> void IPCThreadState::joinThreadPool(bool isMain) 循环读取执行回调 -> onTransact -> BBinder.onTransact -> remote

remote

* virtual BBinder*        localBinder();