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()
ServiceManager 小结的更多相关文章
- Android开发之漫漫长途 XI——从I到X的小结
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- i.mx6 Android5.1.1 servicemanager本地服务
接在之前的 i.mx6 Android5.1.1 初始化流程之init进程 i.mx6 Android5.1.1 初始化流程之init.rc解析 servicemanager是由init创建的本地服务 ...
- 红茶一杯话Binder (ServiceManager篇)
1.先说一个大概 Android平台的一个基本设计理念是构造一个相对平坦的功能集合,这些功能可能会身处于不同的进程中,然而却可以高效地整合到一起,实现不同的用户需求.这就必须打破过去各个孤立App所形 ...
- 从零开始编写自己的C#框架(26)——小结
一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...
- Python自然语言处理工具小结
Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- iOS--->微信支付小结
iOS--->微信支付小结 说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下 ***那么首先还是由公司去创建并申请使用 ...
- iOS 之UITextFiled/UITextView小结
一:编辑被键盘遮挡的问题 参考自:http://blog.csdn.net/windkisshao/article/details/21398521 1.自定方法 ,用于移动视图 -(void)mov ...
- K近邻法(KNN)原理小结
K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...
随机推荐
- C# 正则表达式测试工具与分享窗体自适应类
放假刚回来,自己打算写一个正则表达式的测试工具,因为上次在网上用的一个在线正则表示测试工具就 没有很好的服务自己的,所以才有了现在的想法,想写一个C#开发者用的正则表达式测试工具!期间由于最大化时控件 ...
- bootstrap中的Tooltips工具提示的使用问题
在使用bootstrap中的Tooltips时,官方文档中的实例代码若直接放在.container 或 .container-fluid类中时,四个button悬停之后会把button之间的margi ...
- 第45讲:Scala中Context Bounds代码实战及其在Spark中的应用源码解析
今天学业习了上下文界定的内容,看下这段代码 class Pair_Ordering[T:Ordering](val first : T,val second : T){ def bigger(imp ...
- 人脸识别经典算法一:特征脸方法(Eigenface)
这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新.特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eig ...
- plsql基础
语法:declare-->声明变量 begin-->执行部分 exception-->异常 end-->结束 / 最简单的程序:begin null; end; 输出语句:DB ...
- 基于OWIN WebAPI 使用OAUTH2授权服务【授权码模式(Authorization Code)】
之前已经简单实现了OAUTH2的授权码模式(Authorization Code),但是基于JAVA的,今天花了点时间调试了OWIN的实现,基本就把基于OWIN的OAUHT2的四种模式实现完了.官方推 ...
- Chrome以https访问gitlab的问题:Your connection is not private
在Chrome中以https访问自己搭建的gitlab站点时经常出现下面的错误: Attackers might be trying to steal your information from xx ...
- 降龙十八掌之一:(亢龙有悔)SQL Server Profiler和数据库引擎优化顾问
简介 说到Sql的[性能工具]真是强大,SQL Server Profiler的中文意思是SQL Server事件探查,这个到底是做什么用的呢?我们都知道探查的意思大多是和监视有关,其实这个SQL S ...
- 连接oracle jdbc
我使用的是精简版的oracle. 1 导入oracle驱动包 oracle下路径 D:\oracle\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6 ...
- 相对路径获取项目文件 及报错 No mapping found for HTTP request with URI XXX in DispatcherServlet with name ‘springmvc’解决方法
首先一点,WebRoot目录下的文件是都可以通过浏览器输入路径,直接读取到的 例如这样: 而WebRoot下面WEB-INF是无法浏览器输入路径直接读取的. 因为是受保护的. 如果jsp读取一个图片的 ...