zoukankan      html  css  js  c++  java
  • ServiceManager 小结

    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()
                

              
    
    
    
    
  • 相关阅读:
    使用 Eclipse PhoneGap 构建 Android 应用程序入门
    SSAS系列——【01】准备知识
    HDU 5763 Another Meaning 2016多校第四场1001 KMP+DP
    HDU 5794 A Simple Nim 2016多校第六场1003
    HDU 5758 Explorer Bo 2016多校第三场1007 树上DP
    HDU 5755 Gambler Bo 2016多校第三场1004
    HDU 5754 Life Winner Bo 2016多校第三场1003
    vue2.0引入腾讯地图
    MVC Razor模板引擎输出HTML或者生产HTML文件
    慎把“DataContext”静态化 或则单例
  • 原文地址:https://www.cnblogs.com/lipeil/p/5982893.html
Copyright © 2011-2022 走看看