1 ServiceManger 根据name优先从Map中获取IBinder,例如AMS、WMS、PMS;如果Map中没有对应的IBinder,我们获取Serviceanager的代理
ServiceManagerNative.asInterface(BinderInternal.getContextObject());   android_os_BinderInternal_getContextObject(), 位于android_util_Binder.cpp
    sp<IBinder> b = ProcessState::self()->getContextObject(NULL)
      getStrongProxyForHandle(0),获取handle为0的BpBinder,即ServiceManager对应的BpBinder
    javaObjectForIBinder 将IBinder 封装为java对象,如果是BBinder封装为java 类 Binder,如果是BpBinder,封装为BinderProxy,并返回
  这里得到的返回值为BinderProxy对象
然后将BinderProxy封装到ServiceMangerProxy中,并返回。
     2、ServiceManager的启动
system/core/init/init.c 文件中的main方法中启动,通过解析init.rc文件中的配置
如:service servicemanager system/bin/servicemanager
它由Init进程创建,和zygote进程并不是同一个进程,当然和Systemserver(AMS、WMS、PMS) 也不是同一个进程 3、绑定AMS的binder到ServiceManager
Systemserver 启动 AMS,startBootstrapServices-->SystemServiceManager.startService(ActivityManagerService.LifeCycle.class)
同时,调用ActivityManagerService.setSystemProcess-->ServiceManager.addService(Context.Activity_Service, this, true)
然后:ServiceManagerProxy-->addService
      BinderProxy-->transact() 传递AMS
        Parcel-->writeStrongBinder 封装AMS, Java层
          android_os_parcel-->android_os_parcel_writeStrongBinder() 调用本地方法封装AMS
            android_util_Binder-->IBinderForJavaObject, 将AMS映射为对应的JAVABBinder,保存在JavaBBinderHolder中
          Parcel-->writeStrongBinder,封装BBinder,C++
      BpBinder-->transact() 使用ServiceManager对应的BpBinder。
        IPCThreadState-->transact()
          writeTransactData 将数据写入mOut变量中
          waitForResonpse 等待驱动返回数据
            talkWidthDriver()
              ioctl 和驱动交换数据(mOut 写入驱动, mIn读出),将BBinder保存在驱动中 读取:ServiceManager.getService(name)
     ServiceManagerProxy.getService(name)
       BinderProxy.transact()将服务名称传入
         BpBinder-->transact(); BpBinder 的地址保存在BinderProxy 中的 long mObject 变量中,并且以此建立联系。
           IPCThreadState-->transact();
             writeTransactData();
               waitForResponse()
                  talkWidthDriver()
                    ioctl
                    .....
               将服务通过驱动返回的数据写入reply 这个parcel结构中,这里为对应服务的BpBinder 对应的 handle     
     Parcel readStrongBinder 获取 IBinder,Java层Parcel 持有 long mNativePtr 为c层Parcel地址
        JavaObjectForIBinder(IBinder *),将BpBinder 转换为 BinderProxy
          Parcel -->readStrongBinder,将BpBinder 从parcel中读取出来。
   将BinderProxy 封装在ActivityManagerProxy中 处理:AMS服务接受驱动信息的流程:
  IPCThreadState-->talkWithDrive 读取到从驱动传来的数据
    executeCommand 中处理命令
      switch BR_TRANSACT分支,从传来的数据结构中获取BBinder 和Parcel等数据
        BBinder-->transact(), 这里实际为 JavaBBinder,其重写了onTransact方法
          JavaBBinder-->onTransact, 此处的JavaBBinder与AMS绑定
            AMS-->transact(), 此处通过JNI中c调Java的方法,调用AMS中的transact
              AMS-->onTransact()
                       


ServiceManager 小结的更多相关文章

  1. Android开发之漫漫长途 XI——从I到X的小结

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  2. i.mx6 Android5.1.1 servicemanager本地服务

    接在之前的 i.mx6 Android5.1.1 初始化流程之init进程 i.mx6 Android5.1.1 初始化流程之init.rc解析 servicemanager是由init创建的本地服务 ...

  3. 红茶一杯话Binder (ServiceManager篇)

    1.先说一个大概 Android平台的一个基本设计理念是构造一个相对平坦的功能集合,这些功能可能会身处于不同的进程中,然而却可以高效地整合到一起,实现不同的用户需求.这就必须打破过去各个孤立App所形 ...

  4. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  5. Python自然语言处理工具小结

    Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...

  6. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  7. iOS--->微信支付小结

    iOS--->微信支付小结 说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下 ***那么首先还是由公司去创建并申请使用 ...

  8. iOS 之UITextFiled/UITextView小结

    一:编辑被键盘遮挡的问题 参考自:http://blog.csdn.net/windkisshao/article/details/21398521 1.自定方法 ,用于移动视图 -(void)mov ...

  9. K近邻法(KNN)原理小结

    K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...

随机推荐

  1. 15 个很棒的 Bootstrap UI 界面编辑器

    Bootstrap Magic BootSwatchr Bootstrap Live Editor Fancy Boot Style Bootstrap Lavish Bootstrap ThemeR ...

  2. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  3. 大熊君说说JS与设计模式之------中介者模式Mediator

    一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在 ...

  4. MVC4+WebApi+Redis Session共享练习(上)

    这几天生病了,也没有心情写博客,北京医院真心伤不起呀,钱不少花,病没治好,还增加了新病,哎不说了,周末还得去大医院检查一下,趁女盆友还没有回来,把前几天写的东西总结一下.本文也会接触一点webApi的 ...

  5. NABCD需求分析

    1. N 需求    如今的社会,每个公司每个人都有大量的信息需要处理.保管和查询,这就难免会有些信息在个人电脑中保存的位置被遗忘,需要一款简单并且实用的搜索引擎来搜索个人 所需求的信息. 2. A ...

  6. Html5 学习系列(五)Canvas绘图API快速入门(1)

    引言:Canvas绘图API快速入门 在接触HTML5的初学者包括我都在很多地方见到非常炫的一些页面,甚至好多学习HTML5的开发者都是冲着Web端的页游去的,那么HTML5那么绚丽的页面效果以及游戏 ...

  7. Nginx学习笔记(一) Nginx架构

    Nginx架构 Nginx全程是什么? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. ...

  8. [数据库]SQL中Group By 的常见使用方法.

    前言今天逛java吧看到了一个面试题, 于是有了今天这个文章, 回顾下Group By的用法.题目如下:Select name from table group by name having coun ...

  9. atitit.hbnt orm db 新新增更新最佳实践o7

    atitit.hbnt orm db 新新增更新最佳实践o7 1. merge跟个save了. 1 2. POJO对象处于游离态.持久态.托管态.使用merge()的情况. 1 3. @Dynamic ...

  10. paip.提高稳定性---自动检测sleep mysql数据库死连接以及kill

    paip.提高稳定性---自动检测sleep mysql数据库死连接以及kill 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:ht ...