1.ServiceManager启动流程是怎样的?
2.怎么获取ServiceManager的binder对象?
3.怎么向ServiceManager添加服务?
4.怎么从ServiceManager获取服务?
ServiceManager是单独跑在自己的工作线程里的,写在init.rc配置文件中,所以启动流程就是:
启动进程->启动binder机制->发布自己的服务->等待并响应请求(binder_loop)
以SurfaceFlinger为例,它也是一个单进程的系统服务
通过调用defaultServiceManager函数来获得binder对象
通过ProcessState::self()->getContextObject(NULL)循环获取ServiceManager的binder对象,获取不到是因为SurfaceFlinger和ServiceManager都是被init进程拉起来的,所以获取的时候可能ServiceManager还没来得及向binder驱动注册。
getContextObject()->getStrongProxyForHandle(0)->BpBinder(handle) 所以
ServiceManager它的Proxy对象其实是一个BpBinder对象,这个BpBinder里面对应的handle值是0
IPCThreadState是一个线程内的单例,是负责和binder驱动交互的,注册时虽然传的是一个binder实体对象 ,但ServiceManager收到的只是一个handle值,存的也是一个handle值。
通过向ServiceManager发起binder调用,ServiceManager收到请求后,先拿到服务的名称,然后调用do_find_service函数拿到handle值,再把handle值返回到调用方client方,client方再根据handle值封闭一个BpBinder。
网友评论