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分析的更多相关文章

  1. Android系统--Binder系统具体框架分析(二)Binder驱动情景分析

    Android系统--Binder系统具体框架分析(二)Binder驱动情景分析 1. Binder驱动情景分析 1.1 进程间通信三要素 源 目的:handle表示"服务",即向 ...

  2. Android 内核--Binder架构分析

    一.Binder架构 在Android中,Binder用于完成进程间通信(IPC),即把多个进程关联在一起.比如,普通应用程序可以调用音乐播放服务提供的播放.暂停.停止等功能.Binder工作在Lin ...

  3. Android系统--Binder系统具体框架分析(一)补充

    Android系统--Binder系统具体框架分析(一)补充 补充:对Binder驱动分析一的代码补充,添加saygoobye和saygoodbye_to服务 test_server.h #ifnde ...

  4. Android aidl Binder框架浅析

      转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?B ...

  5. Qualcomm Android display架构分析

    Android display架构分析(一) http://blog.csdn.net/BonderWu/archive/2010/08/12/5805961.aspx http://hi.baidu ...

  6. android usb挂载分析---MountService启动

    android usb挂载分析---MountService启动 分类: android框架 u盘挂载2012-03-27 23:00 11799人阅读 评论(4) 收藏 举报 androidsock ...

  7. 高通Android display架构分析

    目录(?)[-] Kernel Space Display架构介绍 函数和数据结构介绍 函数和数据结构介绍 函数和数据结构介绍 数据流分析 初始化过程分析 User Space display接口 K ...

  8. Android深入源代码分析理解Aidl总体调用流程(雷惊风)

    2017年開始上班的第一天.老不想工作了,假期感觉还没開始就已经结束了,唉,时间就是这样,新的一年開始了,尽管非常不想干正事,没办法,必须干起来.由于后边的路还非常长,距离六十岁还非常远. 刚上班也没 ...

  9. ZT 4.3 android bluetooth hfp分析

    4.3 android bluetooth hfp分析 2013-08-20 20:16 592人阅读 评论(3) 收藏 举报 所有程序执行的代码都是有入口的,在这里我们暂时分析一种情景,蓝牙打开着, ...

随机推荐

  1. 学习materialize

    <div class="container"> <div class="row">   </div> <div cla ...

  2. UVA 11883 Repairing a Road(最短路径+暴力枚举)

    You live in a small town with R bidirectional roads connecting C crossings and you want to go from c ...

  3. Xcode 自动打包之旅【本文摘自智车芯官网】

    由于公司项目很多,作为iOS端的开发工程师,在打包和上传App Store过程中超级费时,而且往往会有频繁更改需求重新打包.上传的情况.这些过程让我不胜其烦.之前有听说过自动打包,一直没有时间尝试,此 ...

  4. poj1094拓扑排序

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29539   Accepted: 10 ...

  5. 【Android入门】——模拟器的创建及常见问题汇总

    [前言] 刚刚接触Android,第一门课我们就来创建一个模拟器.安卓模拟器,简称AVD(Android Virtual Device),是安卓运行的虚拟设备.有了他以后,我们就不需要在连着安卓手机进 ...

  6. 2017 Multi-University Training Contest - Team 3 RXD and dividing(树)

    题解: 其实贪心地算就可以了 一个最优的分配就是每条边权贡献的值为min(k, sz[x]),sz[x]是指子树的大小 然后最后加起来就是答案. #include <iostream> # ...

  7. Codeforces Round #350 (Div. 2) A

    A. Holidays time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  8. VK Cup 2016 - Round 1 (Div. 2 Edition) A Bear and Reverse Radewoosh

    A. Bear and Reverse Radewoosh time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  9. Rem与em的简单理解

    Rem与em的简单理解 Em单位与像素px的转换 所得的像素值 = 当前元素的font-size * em的值 比如:div的font-size:12px 10em等同于120px 12*10 =12 ...

  10. 记另类Request method 'GET' not supported

    一般遇到Request method 'GET' not supported这种问题,大家都会找相应controller下的具体方法,把get改为post之类.但是我这次是在访问静态资源,static ...