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) 收藏 举报 所有程序执行的代码都是有入口的,在这里我们暂时分析一种情景,蓝牙打开着, ...
随机推荐
- kaldi解码及特征提取详解
目录 1. 注意事项 2. 流程图: 3. 具体流程指令: 1. 注意事项 首先要训练好模型,用到3个文件,分别是: final.mdl(训练模型得到的模型文件) final.mat(用来特征转换) ...
- 【Python】Python内置函数dir详解
1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码代码如下: >>> help(dir)Help on built-in function ...
- 进程id
我们知道怎么通过fork函数创建(或者说是复制)一个进程,但是我们要怎么样操作这个被创建出来的进程呢?那就需要用到他的进程id,所以就要获取进程id,一下提供一些获取进程id的函数和其使用方法. 1) ...
- LevelDB速记
LevelDb的基本结构如下: 由六大部分组成: 一.MemTable,用户写入和读取的直接对象, 二.Immutable MemTable,用户状态写入的对象写满的MemTable之后会转为Immu ...
- thinkphp include处理加载重复出现的html页面
在网站设计经常用大量使用的html模板,例如header(一般是menu层甚至还带有图片轮播).left(后台管理页面比较常见的导航).footer(结尾层,一般也是小型的menu),使用includ ...
- 玩Vim
1)我一个脚本中粘贴的都是当年在vim下粘的东西,都是带行号的,我现在想把所有的行号都换成回车键,要怎么办呢? %s/[0-9]/^M/g 注:其中回车在vim的输入方法是ctrl+V,会得到^,此时 ...
- JDBC数据源的驱动问题
classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle ...
- Configuring Dojo with dojoConfig - The Dojo Toolkit
转载自Dojo官网 Configuring Dojo with dojoConfig The dojoConfig object (formerly djConfig) allows you to s ...
- 【bzoj2384】[Ceoi2011]Match 特殊匹配条件的KMP+树状数组
题目描述 给出两个长度分别为n.m的序列A.B,求出B的所有长度为n的连续子序列(子串),满足:序列中第i小的数在序列的Ai位置. 输入 第一行包含两个整数n, m (2≤n≤m≤1000000). ...
- FAQ: SNMP on NetScaler Appliance
FAQ: SNMP on NetScaler Appliance https://support.citrix.com/article/CTX122436 https://docs.citrix.co ...