Android之BInder分析
MediaService的诞生:
nt main(int argc, char** argv)
{
//FT,就这么简单??
//获得一个ProcessState实例
sp<ProcessState> proc(ProcessState::self());//这里获得一个Process的实例,因为这个实例是单例结构的因此也就是说PorcessState在整个MediaServer这个ServiceManager真个进程里是唯一的共享的
//得到一个ServiceManager对象
sp<IServiceManager> sm = defaultServiceManager();//这里实际上就是使用BINDER_SET_CONTEXT_MGR命令把自己注册成ServiceManger,当Bunder驱动手动这个命令后,就会在驱动内存中实例化一个Binder实体就是BpBInder,事实上每个ServiceManger在刚执行的时候都会向驱动注册ServiceManger
MediaPlayerService::instantiate();//初始化MediaPlayerService服务
//对于在代码里就向MangerService注册好的Service,自然会在ServiceManger差不多准备好的时候就实例化(其实也是实例化BnBinder),这个实例化后就会放入一个查询表中,同样当服务器端调用addService的时候,Binder驱动也会实例化一个BnBinder并把这个Bnbinder的名字和引用一起放在查询表中。这样Cilent端就能够根据getService来获得服务器的引用,因为在执行getService的时候就是在根据名字查询这个表。
ProcessState::self()->startThreadPool();//看名字,启动Process的线程池?
//ProcessState是操作/dev/binder设备的,因为ServiceManger会为很多的Service和Cilent服务就会很多次的操作/dev/binder设备,所以启动线程池来访问binder设备也能加快访问速度(也说明binder设别是支持多线程的)
IPCThreadState::self()->joinThreadPool();//将自己加入到刚才的线程池?
//Service接受客户端的数据并不是直接接受的而是通过IPCThreadState来调用BnBinder的transact方法,由transact方法来调用Service的onTransact方法实现远程功能的调用的。
//事实上ServiceMangerAndroid基于BInder C/S结构的守护进程,就是这是一直在监听客户端请求的一端,并能接受的客户端的请求后立即打开一个线程IPCThreadState来为客户端服务,ServieManger打开IPCThreadState后会根据客户端传过来的服务的名字(java端的调用形式为getSystemService(Context.LAYOUT_INFLATER_SERVICE))来查询对应的BnBInder(就是Service在这里注册BInder),然后调用BnBinder的onTranstact来实现。
}
ProcessState:
sp<ProcessState> ProcessState::self()
{
if (gProcess != NULL) return gProcess;---->第一次进来肯定不走这儿
AutoMutex _l(gProcessMutex);--->锁保护
if (gProcess == NULL) gProcess = new ProcessState;--->创建一个ProcessState对象
return gProcess;--->看见没,这里返回的是指针,但是函数返回的是sp<xxx>,所以
//把sp<xxx>看成是XXX*是可以的
}
ProcessState::ProcessState()
: mDriverFD(open_driver())----->Android很多代码都是这么写的,稍不留神就没看见这里调用了一个很重要的函数
, mVMStart(MAP_FAILED)//映射内存的起始地址
, mManagesContexts(false)
, mBinderContextCheckFunc(NULL)
, mBinderContextUserData(NULL)
, mThreadPoolStarted(false)
, mThreadPoolSeq(1)
{
if (mDriverFD >= 0) {
//BIDNER_VM_SIZE定义为(1*1024*1024) - (4096 *2) 1M-8K
mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE,
mDriverFD, 0);//这个需要你自己去man mmap的用法了,不过大概意思就是
//将fd映射为内存,这样内存的memcpy等操作就相当于write/read(fd)了
}
...
}
Android之BInder分析的更多相关文章
- Android系统--Binder系统具体框架分析(二)Binder驱动情景分析
Android系统--Binder系统具体框架分析(二)Binder驱动情景分析 1. Binder驱动情景分析 1.1 进程间通信三要素 源 目的:handle表示"服务",即向 ...
- Android 内核--Binder架构分析
一.Binder架构 在Android中,Binder用于完成进程间通信(IPC),即把多个进程关联在一起.比如,普通应用程序可以调用音乐播放服务提供的播放.暂停.停止等功能.Binder工作在Lin ...
- Android系统--Binder系统具体框架分析(一)补充
Android系统--Binder系统具体框架分析(一)补充 补充:对Binder驱动分析一的代码补充,添加saygoobye和saygoodbye_to服务 test_server.h #ifnde ...
- Android aidl Binder框架浅析
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?B ...
- Qualcomm Android display架构分析
Android display架构分析(一) http://blog.csdn.net/BonderWu/archive/2010/08/12/5805961.aspx http://hi.baidu ...
- android usb挂载分析---MountService启动
android usb挂载分析---MountService启动 分类: android框架 u盘挂载2012-03-27 23:00 11799人阅读 评论(4) 收藏 举报 androidsock ...
- 高通Android display架构分析
目录(?)[-] Kernel Space Display架构介绍 函数和数据结构介绍 函数和数据结构介绍 函数和数据结构介绍 数据流分析 初始化过程分析 User Space display接口 K ...
- Android深入源代码分析理解Aidl总体调用流程(雷惊风)
2017年開始上班的第一天.老不想工作了,假期感觉还没開始就已经结束了,唉,时间就是这样,新的一年開始了,尽管非常不想干正事,没办法,必须干起来.由于后边的路还非常长,距离六十岁还非常远. 刚上班也没 ...
- ZT 4.3 android bluetooth hfp分析
4.3 android bluetooth hfp分析 2013-08-20 20:16 592人阅读 评论(3) 收藏 举报 所有程序执行的代码都是有入口的,在这里我们暂时分析一种情景,蓝牙打开着, ...
随机推荐
- LeetCode 82 ——删除排序链表中的重复元素 II
1. 题目 2. 解答 新建一个链表,并添加一个哨兵结点,从前向后开始遍历链表. 如果下一个结点的值和当前结点的值相等,则循环向后遍历直到找到一个和当前结点值不相等的结点: 反之,如果下一个结点的值和 ...
- Unity UGUI 图片 轴对称效果 减少资源
制作UI的过程中,为了节省资源,对称的图一般美术切一半给我们 手动拼图 有时会出现拼接处出现裂缝或重叠 调整大小时也不方便 得一块一块调整 所以就用BaseMeshEffect 的ModifyMesh ...
- 【iOS开发】字典的快速赋值 setValuesForKeysWithDictionary
前言 在学习解析数据的时候,我们经常是这么写的:PersonModel.h文件中 @property (nonatomic,copy)NSString *name; @property (nonato ...
- beta版本冲刺四
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组 ...
- Linux e1000e网卡驱动
目录 识别网卡 命令行参数 附加配置 技术支持 一.识别网卡e1000e驱动支持Intel所有的GbE PCIe网卡,除了82575,82576,基于82580系列的网卡.提示:Intel(R) PR ...
- $this是什么意思-成员变量和局部变量的调用
关键字$this代表其所在的当前对象 使用当前对象的属性和方法 $this->取值 方法内的局部变量 不能用$this 关键字取值 /* 和java,c++相比 方法体内想访问调用者的属性,必须 ...
- eclipse安装问题
eclipse安装之前需要安装JDK. 注意:eclipse和JDK需要一致,如都是64位或者都是32位. 不然会报错.
- Good Time 冲刺 三
第三天 日期:2018.6.16 一.今日完成任务情况及遇到的问题 王怡镔:继续在学习微信小程序的设计,完善设计发现页面,开始编写发现页面 于鑫宇:配合黄鹤的工作,学习端口相关知 胡雅馨:继续改进优化 ...
- PAT 1089 狼人杀-简单版
https://pintia.cn/problem-sets/994805260223102976/problems/1038429385296453632 以下文字摘自<灵机一动·好玩的数学& ...
- red入门学习笔记
删除以name开头的所有键值. 查找开头和结尾相同,中间字符不同