Android Framework学习之ServiceManag

2020-11-10  本文已影响0人  一只二凡子

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。

上一篇下一篇

猜你喜欢

热点阅读