博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ServiceManager 小结
阅读量:6983 次
发布时间:2019-06-27

本文共 2743 字,大约阅读时间需要 9 分钟。

 

1 ServiceManger 根据name优先从Map中获取IBinder,例如AMS、WMS、PMS;如果Map中没有对应的IBinder,我们获取Serviceanager的代理 ServiceManagerNative.asInterface(BinderInternal.getContextObject());   android_os_BinderInternal_getContextObject(), 位于android_util_Binder.cpp     sp
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()                        
 
 

 

转载地址:http://zdtpl.baihongyu.com/

你可能感兴趣的文章
SCCM 2007 R2部署、操作详解系列之部署篇
查看>>
hystrix thread pool Metrics
查看>>
MDT2012部署问题,MDT中的驱动是如何工作的
查看>>
注意;
查看>>
Selenium 使用要点记录<二>
查看>>
Windows与Linux系统拷贝文件之pscp的使用
查看>>
_xmlXPathNewContext", referenced from
查看>>
Netty3之ServerBootstrap分析
查看>>
小木木的Python学习笔记
查看>>
用SQL语句添加删除修改字段
查看>>
查md5或者sha1值
查看>>
spring MVC(2)--注解Hello World
查看>>
httpclient 小例子编写
查看>>
我的友情链接
查看>>
修改了系统时间后,myeclipse 和tomcat下的代码不同步了
查看>>
IDEA 一直不停的scanning files to index解决办法
查看>>
运维少年系列 python and cisco (1)
查看>>
c#时间转换
查看>>
调度器Quartz的简述与使用总结
查看>>
smokeping 安装
查看>>