本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMangerService和ActivityManagerService(注意非控件,而是指一类服务)以及其他一些东西,对底层做一个更为全面的认识。而很早以前,写过一篇文章,来简述Android系统-" Android高级之系统介绍",同样今天我们在讲Framework层时也会再对系统做一个回顾;下图是我对本节内容的一个基本介绍。

PS:W类是ViewRoot的一个内部类,ViewRoot最大作用就是把IPC调用转为本地调用。

HistoryRecord-每个Acitivty都会有一个,用来管理和记录Activity,是一个Binder对象

ViewRoot-实现View和WindowManger之间的协议,是View Hierarchy的最顶层

PhoneWindow-其中有autoManger和keyguardManager的实现对象

一、窗口

就着上图,我们会对每一条做进一步的解说(注意上图大多是包含关系,少数是关联关系,请区别对待),上图对Framework简单做了描述;同时科普一下什么叫窗口,窗口非指window类,而是指所有使用windowmanger将

其展示在用户面前的控件,如toast、activity、menu等,而这些界面通过设置window的callback来监听到wms传给view对象的信息,如手势操作。而窗口类型基本可以分为3种:

1、系统窗口,不需要父窗口-可以指定2000-2999层

2、子窗口,依赖父窗口-1000-1999层 如Toast

3、应用窗口,对应activity-小于99层 如Activity

窗口可以说是View,而wms不直接跟view沟通,而是通过实现IWindow的ViewRoot.W类,然后再传给view。

关于Context,上下文引用,项目中使用的还比较多,是一个场景,用来配合上下文操作;一个应用中context的数量=service个数+activity个数+application个数,原因它们都继承自ContextWraper,而它继承自context。

二、linux文件系统

由于android系统基于linux,就先讲一下linux基础,文件系统通常有3个特点:

1、由文件和目录组成,占据一定存储空间

2、具有读、写、执行权限,可以复制和移动

3、多个文件系统可以并列,且类型可以不同,如FAT16和NTFS

主要的文件目录有以下几种-与android系统类比:

1、bin,存放用户级二进制工具-相当于android系统的acct目录

2、boot,内核镜像文件,由bootloader装载-firmware

3、dev,各种文件系统如打印机等-相当于android系统的dev目录+storage+mnt/sdcard

4、etc,配置文件区-相当于android系统的config目录

5、home,用户工作目录-data/user

6、lib,系统运行时库的存放地-data/app-lib

7、opt,存放系统程序-data/app-private

8、proc,系统级如内核和进程所在文件-proc目录

9、root,管理员工作目录-root目录

10、sbin,管理员的二进制工具-sbin目录

11、sys,驱动对应的系统文件如固件、内核、电量等-sys目录+system目录

12、usr,应用程序安装区-data/app

13、var,调试信息等-data/anr等

因此从上面来以看出,其实操作系统都是由文件组成,外加一些硬件感应设备。但上面介绍的依然不全面,因为android是一层套一层,资源是总体一致,大体分散的结构。同时上面会涉及到进程pid,值为100以内是系统进程,1000以内是root进程,1000以上是用户进程。讲完目录,咱们再讲讲命令:

1、man,查询某命令的意思

2、ls,列出当前目录下所有文件及文件夹信息

3、find,用名字查找文件信息

4、grep,查询文件中的字符串信息

5、cat,打开文件

6、chmod,指定权限,ugo指user(自身)、group(组)、other(其他),权限有r(读1)w(写2)x(执行4),指定权限有两种方式如chmod ug+x(给予当前用户和某群组执行的权限),chmod 777(给予三者所有权限,原因请看上一行)

7、ps和kill,ps列出当前所有进程,kill杀死某进程

8、export,用于设置变量作用于全局

9、mount和unmount,加载和卸载文件系统

好在用过linux操作系统工作过一段时间,对后来做Android开发,起到很大的帮助,上面介绍的是一些常用命令,有兴趣的可以安装一个linux系统来用,之前有一个同事使用ubuntu来编译so,而我当年用的是小红帽rethat。

三、linux启动过程

下面简单讲一个linux启动过程,其实Dalvik虚拟机也是类似

上图少说一点,在CPU运行之前,要把磁盘和其他内存启动,这样才能保证系统正式开始,因为所有系统均为文件,加载文件的硬盘不启,系统如何能被启动?

四、异步信息系统

在Android系统中,用的最多的设计模式就是handler+looper+messageQueue,无论在系统层还是在应用层,

之后我们会再讲到都被用烂了,异步线程表现为:开启后无限循环,遍历数据,如果为空则等待,直到下次数据不

为空时,使用场景有二

1、任务要常驻

2、任务需要根据消息来做不同操作

使用方法如上,解释几点,上面的数据指messegeQueue属于队列LILO,读/写数据时会加锁;如何应用呢,

Handler handler =new Handler(); 首先创建handler时,一般需要在UI线程中(一般你也没必要在子线程重写

handler),获得一个UI线程的looper对象;looper对象通过prepare方法(仅一次)准备一个MessageQueue(系统唯一),

调用loop方法一直分发消息;MessageQueue可以定义消息处理时刻,否则先进先出,通过next和enquenceMessage

方法来取和加入消息,处于wait状态则唤醒,若无消息则挂起。

五、Binder

再讲一个知识点Binder,然后结束本篇。

Binder工作在linux层面,是一小段内存,属于驱动,主要用来解决IPC调用,应用框架包括3部分

1、服务端接口-Binder对象,收到消息即启动隐藏线程,执行onTransact函数初始化

向客户端发送消息时,挂起当前线程,

2、Binder驱动-创造mRemote的Binder对象,重载以下方法

1)以线程间消息通信模式,向服务端发送参数

2)挂起客户端线程,等待服务端返回处理结果,并通知客户端

3)接收服务端通知,继续执行客户端线程

3、客户端接口-向客户端发送消息,挂起当前线程。

Binder服务的设计原则是,开放ServiceManger接口给外界,关于具体的操作由底层去统一执行,不暴露出来,

这也是保证框架稳定、逻辑正确的重要方式,使不同管理类与底层实现可以分离解耦。

下面这篇文章底层就是使用binder进行通信

Android高级第十讲之AIDL与JNI

六、token

token原意指口令,在这里指“身份证”,代表唯一性和代理性;一般token为IBind的实现类,即使View.Attach

Info中也是用IBind实现类来进行IPC调用。应用窗口一般都有token,而window可能没有,为什么?window可以不

对应此窗口存在。

应用窗口的token:一般最初跟window一样最终指向DecorView的W类,初始值是window的mAppToken,指应用

HistoryRecord。Activity的token起始是HistoryRecord,最终指向此W类即mAppToken,与window相同。

子窗口的token:是父窗口view的W类,即mPanelParentWindowToken

系统窗口无token

因此view中会有window的token,也会有父窗口的token,而每个应用窗口随activity诞生,均会有一个Activity

Thread陪伴。

Android源码剖析之Framework层基础版(窗口、linux、token、Binder)的更多相关文章

  1. Android源码剖析之Framework层升级版(窗口、系统启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...

  2. Android源码剖析之Framework层进阶版(Wms窗口管理)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 上一篇我们主要讲了Ams,篇幅有限,本篇再讲讲Wms,即WindowManagerService,管 ...

  3. Android源码剖析之Framework层实战版(Ams管理Activity启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 讲到实战,就不得不拿两个例子来说明,本篇想拿的是应用最广泛的两个:Ams和Wms,一个管理activ ...

  4. Android源码剖析之Framwork层后记篇(硬件消息传递、apk管理、输入法框架、编译过程)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 既然写到后记篇,就代表本系列到此为止,暂时告一段落:其他一些Manager随后有时间再补,就像源码的 ...

  5. Android源码剖析之Framwork层消息传递(Wms到View)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 前面讲过Wms.Ams与Activity的一系列交互,包括创建过程.消息传递.窗口展示等,紧接上篇介 ...

  6. Android源码浅析(六)——SecureCRT远程连接Linux,配置端点和字节码

    Android源码浅析(六)--SecureCRT远程连接Linux,配置端点和字节码 需要编译源码的同学,一般都是win+虚拟机吧,但是再虚拟机里体验并不是很好,所有市面上有很多的软件能够做到在wi ...

  7. 编译android源码官方教程(2)建立编译环境「linux & mac osx」

    https://source.android.com/source/initializing.html Establishing a Build Environment IN THIS DOCUMEN ...

  8. android 源码编译及其运行模拟器相关问题记录

    最近一直在看android源码相关的文档,包括编译源码,还有framework层的代码,本人很懒,一直没有写博客,今天想自己在编译一下源码,并且运行在模拟器中. 源码的版本不同,需要的jdk可能也有所 ...

  9. Android源码、内核编译

    Android源码和内核的编译就是一场马拉松,每一个节点都耗时漫长,下载源码.编译源码.下载内核.编译内核,下载中途会断掉,编译中间会失败,求解再重来,又是一轮马拉松,于是每一步都要做好备份和记录,可 ...

随机推荐

  1. Selenium介绍

    基于selenium的自动化测试,华为已经做了两代了,目前是做到SmartGUI2.0,基于他们自己的AutoSpace平台.不过目前支持的貌似只有IE和火狐(火狐3.6).控件录制支持ID,Name ...

  2. poj 1611 The Suspects 并查集

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 30522   Accepted: 14836 De ...

  3. BZOJ3495 : PA2010 Riddle

    2-SAT. 建立n个变量,其中第i个变量表示第i个城市是否是首都. 对于边(x,y),连边x->y',y->x'. 对于一个有y个城市的国家,新建2y个变量,分别表示前i个城市和后i个城 ...

  4. HDU 2612 (BFS搜索+多终点)

    题目链接: http://poj.org/problem?id=1947 题目大意:两人选择图中一个kfc约会.问两人到达时间之和的最小值. 解题思路: 对于一个KFC,两人的BFS目标必须一致. 于 ...

  5. JS生成随机的由字母数字组合的字符串

    前言 最近有个需求,是需要生成3-32位长度的字母数字组合的随机字符串,另一个是生成43位随机字符串. 方法一 奇妙的写法   1 Math.random().toString(36).substr( ...

  6. COJ990 WZJ的数据结构(负十)

    DFS序(带入栈出栈标记): 对于一个节点,我们用L[i]和R[i]表示它入栈和出栈的时间.这样[L[i],R[i]]就表示了以i为根的区间. 我们还要将入栈的符号为+,出栈的符号为-,那么令V[i] ...

  7. 获取枚举类型Description特性的描述信息

    C#中可以对枚举类型用Description特性描述. 如果需要对Description信息获取,那么可以定义一个扩展方法来实现.代码如下: public static class EnumExten ...

  8. PTS PCR DTS 详解

    一.引言 MPEG-2系统用于视音频同步以及系统时钟恢复的时间标签分别在ES,PES和TS这3个层次中.在ES层,与同步有关的主要是视频缓冲验证VBV(Video Buffer Verifier),用 ...

  9. CustomValidator验证的使用方法

    <asp:TextBox ID="txtNum" runat="server" Width="400px" ></asp: ...

  10. 使用Objective-C的文档生成工具:appledoc

    使用Objective-C的文档生成工具:appledoc 前言 做项目的人多了,就需要文档了.今天开始尝试写一些项目文档.但是就源代码来说,文档最好和源码在一起,这样更新起来更加方便和顺手.象 Ja ...