Android binder学习笔记3 - 注册服务(addService)
作者:互联网
1. 前言
本文主要是binder系列文章的总结笔记,主要是理清binder的总体流程和总体架构,期间会对照Android R进行代码重读,也会按照自己的理解对内容进行调整,以加深对binder总体的理解。本文主要以vold服务为例,记录注册服务(addService)的主要过程。
2. 注册服务总体框架
注册 MediaPlayerService 服务端,我们通过 ServiceManager 的 addService() 方法来注册服务。
首先 ServiceManager 向 Binder 驱动发送 BC_TRANSACTION 命令(ioctl 的命令,BC 可以理解为 binder command)携带 ADD_SERVICE_TRANSACTION 命令,同时注册服务的线程进入等待状态 waitForResponse()。 Binder 驱动收到请求命令向 ServiceManager 的 todo 队列里面添加一条注册服务的事务。事务的任务就是创建服务端进程 binder_node 信息并插入到 binder_procs 链表中。
事务处理完之后发送 BR_TRANSACTION 命令,ServiceManager 收到命令后向 svcinfo 列表中添加已经注册的服务。最后发送 BR_REPLY 命令唤醒等待的线程,通知注册成功。
3. vold main
main(int argc, char** argv)
|--VolumeManager* vm;
| NetlinkManager* nm;
|--parse_args(argc, argv);
|--mkdir("/dev/block/vold", 0755);
| //创建VolumeManager实例
|--vm = VolumeManager::Instance()
| //创建NetlinkManager实例
|--nm = NetlinkManager::Instance()
|--android::base::GetBoolProperty("vold.debug", false)
|--vm->start()
|--process_config(vm, &has_adoptable, &has_quota, &has_reserved)
|--android::hardware::configureRpcThreadpool(1, false /* callerWillJoin */);
|--android::vold::VoldNativeService::start()
|--nm->start()
|--android::base::SetProperty("vold.has_adoptable", has_adoptable ? "1" : "0");
| android::base::SetProperty("vold.has_quota", has_quota ? "1" : "0");
| android::base::SetProperty("vold.has_reserved", has_reserved ? "1" : "0");
|--coldboot("/sys/block");
\--android::IPCThreadState::self()->joinThreadPool()
init进程会启动vold守护进程,它会创建VolumeManager,进入main函数入口后,会执行android::vold::VoldNativeService::start(),在此函数中完成了vold服务向service manager的注册。
|- -android::vold::VoldNativeService::start
android::vold::VoldNativeService::start()
|--IPCThreadState::self()->disableBackgroundScheduling(true)
|--BinderService<VoldNativeService>::publish()
|--sp<ProcessState> ps(ProcessState::self());
|--ps->startThreadPool();
\--ps->giveThreadPoolName()
BinderService<VoldNativeService>::publish()
|--sp<IServiceManager> sm(defaultServiceManager());
|-- sm->addService(String16(VoldNativeService::getServiceName()),
new VoldNativeService(), false, DUMP_FLAG_PRIORITY_DEFAULT)
在Android binder学习笔记2 - 获取ServiceManager 节中我们分析了defaultServiceManager,它通过ProcessState::self()获取vold进程的ProcessState对象(也是单例模式),每个进程有且只有一个ProcessState对象,存在则直接返回,不存在则创建,在这个过程中在binder驱动中创建了binder_proc并连入链表,同时通过mmap分配了buffer空间;通过getContextObject()获取BpBinder对象,对于handle=0的BpBinder对象,存在则直接返回,不存在才创建;最终返回gDefaultServiceManager对象,之后将通过其执行addService
status_t ServiceManagerShim::addService(const String16& name, const sp<IBinder>& service,
bool allowIsolated, int dumpsysPriority)
{
Status status = mTheRealServiceManager->addService(
String8(name).c_str(), service, allowIsolated, dumpsysPriority);
return status.exceptionCode();
}
此处的mTheRealServiceManager为BpServiceManager
TODO
参考文档
http://gityuan.com/2015/11/14/binder-add-service/
标签:vold,--,binder,注册,addService,android,Android 来源: https://blog.csdn.net/jasonactions/article/details/119757902