什么是framework
Framework定义了客户端组件和服务端组件功能及接口。包含3个主要部分:服务端,客户端和Linux驱动。
(一)服务端
服务端主要包含两个重要类,分别是WindowManagerService(Wms)和ActivityManagerService(Ams)。Wms的作用是为所有的应用程序分配窗口,并管理这些窗口。包括分配窗口大小,调节各窗口的叠放次序,隐藏或显示窗口。Ams的作用是管理所有应用程序中的Activity。
除此之外,在服务端还包括2个消息处理类:
KeyQ类:该类为Wms的内部类,继承于KeyInputQueue类, KeyQ对象一旦创建,就立即启动一个线程,该线程会不断地读取用户的UI操作消息,比如按键、触摸屏、trackball、鼠标等,并把这些消息放到一个消息队列QueueEvent类中。
InputDispatcherThread类:该类的对象一旦创建,也会立即启动一个线程,该线程会不断地从QueueEvent中取出用户消息,并进行一定的过滤(用Wms中相应函数处理),过滤后,再将这些消息发给当前活动的客户端程序中。
(二)客户端
客户端主要包括以下重要类:
ActivityThread类:该类为应用程序的主线程类,所有的Apk程序有且只有一个ActivityThread类,程序的入口为该类中的static main()函数。
Activity类:该类为APK程序的一个最小运行单元,一个APK程序中可以包含多个Activity对象,ActivityThread主类会根据用户操作选择运行哪个Activity对象。
PhoneWindow类:该类继承与Window类,同时,PhoneWindow类内部包含了一个DecorView对象。简而言之,PhoneWindow是把一个FrameLayout进行了一定的包装,并提供了一组通用的窗口操作接口。
Window类: 该类提供了一组通用的窗口(Window)操作API, 这里的窗口仅仅是程序层面上的,Wms所管理的窗口并不是Window类,而是一个View或者ViewGroup类,一般就是指DecorView类,即一个DecorView就是Wms所有管理的一个窗口。Window是一个abstract类型。
DecorView类:该类是一个FrameLayout的子类,并且是PhoneWindow中的一个内部类。Decor的英文是Decoration, 即“修饰”的意思,DecorView就是对普通的FrameLayout进行了一定的修饰,比如添加一个通用的TitleBar, 并响应特定的按键消息等。
ViewRoot类: Wms管理客户端窗口时,需要通知客户端进行某种操作,这些都是通过异步消息完成的,实现方式就是使用Handler, ViewRoot就是继承于Handler,其作用主要是接收Wms的通知。
W类:该类继承于Binder, 并且是ViewRoot的一个内部类。
WindowManager类:客户端要申请创建一个窗口,而具体创建窗口的任务是由Wms完成的,WindowManager类就像是一个部门经理,谁有什么需求就告诉它,由它和Wms进行交互,客户端不能直接和Wms进行交互。
(三)Linux驱动
Linux驱动和Framework相关的主要包含两部分,分别是SurfaceFlingger(SF)和Binder。每一个窗口都对应一个Surface, SF驱动的作用是把各个Surface显示在同一屏幕上。
Binder驱动的作用是提供跨进程(IPC)的消息传递机制。
1.应用程序层
这一层一般我们最为熟悉了,我们平常开发安卓用java编写的app都属于这一层,当然系统自带的程序比如时钟啊,email等都是属于这一层
2.应用程序框架层(Framework)
这一层是核心应用程序所使用的API框架,为应用层提供各种接口API,包括各种组件和服务来支持我们的安卓开发,包括ActivityManager,WindowManager,ViewSystem等我们讲到AndroidFramework时很经常要提到的东西。
3.系统运行库层
从图上就可以看出,这一层有两部分:
一.程序库
Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:
系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。
媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件
编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。
SGL - 底层的2D图形引擎
3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。
FreeType -位图(bitmap)和矢量(vector)字体显示。
SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
二.Android 运行库(Android Runtime)
Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟 机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了 优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
4.Linux内核层
安卓系统基于Linux内核这个我们都知道,Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。接下来我们讲讲Framework框架,框架中包含了3个主要部分:1.服务端 2.客户端 3.Linux驱动
先说一下服务端一些重要的东西:
1.ActivityManagerService(Ams):管理所有应用程序中的Activity,他掌握所有Activity的情况,所有具有调度Activity生命周期的能力,简而言之,它就是管理和掌控所有的Activity.
2.WindowManagerService(Wms):控制窗口的显示与隐藏以及窗口的层序,简而言之,就是它是管理窗口的,可以知道大多数和View有关系的都要跟他打交道。
3.KeyQ类:它是Wms的一个内部类,一旦创建就会启动一个新线程,这个线程会不断的接收读取用户的UI操作消息,并把这些消息放到消息队列QueueEvent中。
4.InputDispatcherThread类:该类也是一旦创建就会启动一个线程,这个线程会不断的从上面的QueueEvent中取出用户的消息,进行一定的过滤,再讲这些消息发送给当前活动的客户端程序中。
再说一些客户端比较重要的东西:
1.ActivityThread类:主线程类,即UI线程类,我们程序的入口就是从他的main()函数入口的。也是客户端与AMS交互的一个最主要的类:内部有ApplicationThread类(继承IBinder)负责与AMS跨进程通信,又有H类(继承自Handler类),负责接收ApplicationThread发来的消息,实现把消息传到主线程。
2.ViewRoot类:很重要的一个类,负责客户端与WMS的交互:内部有W类,W类继承于Binder,所以他与ApplicationThread的角色是差不多的,只不过他对应的是Wms,当Wms想与客户端进行通信的时候,Wms就调用这个类。内部又有ViewRootHandler类继承于Handler,所以他能在W类接收到Wms的消息后,把这个消息传送到UI线程中。同时界面绘制的发起点也是在这里面:performTraversals()。
3.Activity类:这个我们再熟悉不过了,APK运行的最小单位。
4.PhoneWindow类:继承自Window类,它里面会放一个DecorView,它提供了一组统一窗口操作的API.
5.DecorView类:这是我们所能看到的View的所有,它继承自FrameLayout,我们写的布局view就是放在他这个里面。
6.ApplicationThread类:继承于Binder,当Ams想与客户端通信时(即调用客户端的方法),Ams调用的就是这个类。
- Instrumentation类:负责直接与Ams对话,比如当客户端想与Ams进行通信时(即调用Ams服务里的方法),都是他去实现单项调用Ams,即他相当于于一个管家,所有想调Ams的操作都集中到他这儿,他负责单向调用Ams.
Android Framework的三大核心功能:
1、View.java: View工作原理,实现包括绘制view、处理触摸、按键事件等。
2、ActivityManagerService.java :Ams 管理所有应用程序的Activity 等 。
3、WindowManagerService.java :Wms 为所有应用程序分配窗口,并管理这些窗口。
最后,因为每个Binder都会对应一个线程,所以一个含Activity的程序最少也有3个线程,分别是:1.UI主线程 2.ApplicationThread(Binder) 3.ViewRoot.W(Binder).
总结:FramWork是给上层应用app层提供api方法和服务的应用框架层,可以称Framework层才真正是Java语言实现的层,包括三大核心功能viewsystem,ActivityManagerService.java,WindowManagerService.java ,正式因为framwork层里面的jni(java本地服务)和系统运行层里面的c++库的交互,所以才会从C/C++的底层慢慢向上变成了JAVA的开发语言
最后
需要Android相关学习资料的可以在我的gitee里面免费获取