这里写一些关于Android Framework比较重要的知识点,这些东西对于之后理解和研究Android Framework有很大好处,就是让我们脑子里先有一个大概的模型,以及认识一点之后经常会碰见的角色。
首先贴一张图,刚学安卓的时候看书籍或者看视频教程的时候通常第一篇就会祭出这张图,但是当时你可能就是一瞥而过,毕竟初学时一般只关心应用层功能的实现啊,或者如何布局啊这些,现在来复习一下这张很重要的图:
图上分的很清楚,分为四层,分别为:
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调用的就是这个类。
7. Instrumentation类:负责直接与Ams对话,比如当客户端想与Ams进行通信时(即调用Ams服务里的方法),都是他去实现单项调用Ams,即他相当于于一个管家,所有想调Ams的操作都集中到他这儿,他负责单向调用Ams.
Manager机制:
服务端有很多各种各样的系统服务,当我们客户端每次想调用这些服务时(IPC)如果每次都是想要哪一个服务就直接去调用哪一个服务的话,显然显得比较杂乱且拓展性较差,所以安卓采用了这种Manager机制,即设置一个类似经理的东西,也就是Manager,他本身也是一个服务,他管理着所有其他的服务,也就是说我们需要哪个服务要先经过他,他负责为我们去调用这个服务,所以这样就只给我们暴露一个经理这个服务,其他的服务被他屏蔽了,对我们来说是透明的,这和java的封装很像。
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的开发语言
来源:oschina
链接:https://my.oschina.net/u/920274/blog/3059139