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/

猜你喜欢

转载自blog.csdn.net/jasonactions/article/details/119757902