美文网首页
Android Framework学习之ServiceManag

Android Framework学习之ServiceManag

作者: 一只二凡子 | 来源:发表于2020-11-10 01:21 被阅读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。

    相关文章

      网友评论

          本文标题:Android Framework学习之ServiceManag

          本文链接:https://www.haomeiwen.com/subject/mqylbktx.html