Android Framework 基础理解

文章目录

  • Android 四层框架
  • Framework 基础理解
    • 服务端
    • 客户端
    • Linux驱动

Android 四层框架

Android 经典的四层框架,其中包括:Application 应用程序层,Application Framework 应用程序框架层,Libraries 系统运行库层,Linux Kernel Linux核心层
Android Framework 基础理解_第1张图片

  1. Application系统应用层

  2. Application Framework:为应用程序框架层。为应用层的开发者提供API各种服务。

  3. Libraries系统运行库层:可以分成两部分,分别是Android运行时和系统库

  • Android Runtime:Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。

  • 系统库:Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:

    • Surface Manager:对显示子系统的管理,执行多个应用程序时候,负责管理显示与存取操作间的互动,并且为多个应用程序提供了2D和3D图层的无缝融合
    • Media Framework:多媒体库,基于PacketVideo OpenCore,支持多种常用的音频、视频格式录制和回放,编码格式包括MPEG4、MP3、H.264、AAC、ARM
    • SQLite:一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
    • OpenGL|ES:根据OpenGLES 1.0API标准实现的3D绘图函数库
    • FreeType:位图(bitmap)和矢量(vector)字体显示,提供点阵字与向量字的描绘与显示
    • WebKit:一套网页浏览器的软件引擎
    • SGL:底层的2D图形渲染引擎
    • SSL:在Andorid上通信过程中实现握手
    • Libc:从BSD继承来的标准C系统函数库( libc ),专门为基于embedded linux的设备定制的
  1. Linux Kernel:Linux核心层,Android 的核心系统服务依赖于 Linux 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。

Framework 基础理解

平时学习 Android 开发的第一步就是去学习各种各样的 API,如 Activity,Service,Notification 等。其实这些都是 Framework 提供给我们的。Framework 层为开发应用程序提供了非常多的API,我们通过调用这些 API 构造 APP,从而满足业务上的需求。因此 Framework 其实可以简单的理解为一些 API 的库房,开发人员将一些基本功能实现,通过接口提供给上层调用。

我们可以称 Framework 层才真正是 Java 语言实现的层,在这层里定义的 API 都是用 Java 语言编写。但是又因为它包含了 JNI 的方法,JNI 用 C/C++ 编写接口,根据函数表查询调用核心库层里的底层方法,最终访问到 Linux 内核。那么Framework层的作用就有2个。

  1. 用Java语言编写一些规范化的模块封装成框架,供APP层开发者调用开发出具有特殊业务的手机应用。
  2. 用Java Native Interface调用core lib层的本地方法,JNI的库是在Dalvik虚拟机启动时加载进去的,Dalvik会直接去寻址这个JNI方法,然后去调用。

Framework框架包含了3个主要部分:服务端、客户端、Linux驱动。

服务端

SystemServer是Framework中非常重要的一个进程,它是在虚拟机启动后运行的第一个Java进程,SystemServer启动其他系统服务,这些系统服务都是以一个线程的方式存在于SystemServer进程中。

Framework 框架采用了这种 Manager 机制,即:服务端有很多各种各样的系统服务,当客户端每次想要调用这些服务事(IPC)如果每次都是想要哪一个服务就直接去调用哪一个服务的话,会显得比较乱而且拓展性较差,所以Android采用了这种Manager机制,即设置一个类似经理的东西,也就是Manager,它自身也是一个服务,并且它管理着所有其他的服务,也就是说,我们需要哪个服务都要先经过它,它负责为我们去调用这个服务,所以这样就只给我们暴露的一个经理这个服务,其他的服务被他屏蔽了。这与Java的封装类似。

这些系统服务,其中包括一些核心服务:

  1. ActivityManagerService(Ams):负责管理所有应用程序中的Activity,它掌握所有Activity的情况,具有所有调度Activity生命周期的能力,简单来说,ActivityManagerService是管理和掌控所有的Activity,是应用进程的管理服务端,直接的控制了应用程序的各个行为,保证了系统中不同的应用程序之间能够和谐的合理的进行调度运行。
    对进程的管理包括:进程的创建与销毁、进程的优先级调整。
    对组件的管理包括:Activity的调度管理、Service的管理、Broadcast的分发、以及ContentProvider管理。

  2. WindowManagerService(Wms):对系统中所有窗口进行管理,控制窗口的显示、隐藏以及窗口的层序,动画处理 ,Input分发、处理,Display管理(多屏显示)。大多数和View有关系的都要和它打交道。

  3. KeyQ类:它是Wms的一个内部类,一旦创建就会启动一个新线程,这个线程会不断地接收和读取用户的UI操作消息,并把这些消息放到消息队列QueueEvent中。

  4. InputDispatcherThread类:该类也是一旦创建就会启动一个新线程,这个线程会不断地从上面的QueueEvent中取出用户的消息进行一定的过滤,再将这些消息发送给当前活动的客户端程序中。

  5. PackageManagerService类:负责Package的管理,应用程序的安装 、卸载、信息查询等。
    Android Framework 基础理解_第2张图片

客户端

  • Content Providers:使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据。
  • View System:可以用来构建应用程序, 它包括列表(Lists),网格(Grids),文本框(Text boxes),按钮(Buttons), 甚至可嵌入的web浏览器。
  • Notification Manager:使得应用程序可以在状态栏中显示自定义的提示信息。
  • Package Manager:提供对系统的安装包的访问。包括安装、卸载应用,查询permission相关信息,查询Application相关信息等。
  • Telephony Manager:主要提供了一系列用于访问与手机通讯相关的状态和信息的方法,查询电信网络状态信息,sim卡的信息等。
  • Resource Manager:提供非代码资源的访问,如本地字符串,图形,和布局文件(Layout files )。
  • Location Manager:提供设备的地址位置的获取方式。很显然,GPS导航肯定能用到位置服务。
  • XMPP:可扩展通讯和表示协议。前身为Jabber,提供即时通信服务。例如推送功能,Google Talk。

其中有一些重要的类:

  • ActivityThread类:主线程类,即UI线程类,我们的程序入口就是从 ActivityThread 的 main() 函数入口的。它根据Ams的要求(通过IApplicationThread接口,Ams为Client,ActivityThread.ApplicationThread为Server)负责调度和执行activities、broadcasts和其他操作。
  • ViewRoot类:很重要的一个类,负责客户端与Wms的交互,内部类有W类,W类继承与Binder,所以他与ApplicationThread的角色差不多,只不过它对应的是Wms,当Wms想与客户端进行通信的时候,Wms就调用这个类。内部又有ViewRootHandler类继承于Handler,所以他能在W类接收到Wms的消息后把这个消息传送到UI线程中。同时界面绘制的发起点也是在这里面:performTraversals()
  • W类:ViewRoot的帮手,继承与Binder,是ViewRoot内部类。主要帮助ViewRoot实现把Wms的IPC(进程间通信)调用转换为本地的一个异步调用。
  • Activity类:这个类我们比较熟悉,APK运行的最小单位。
  • PhoneWindow类:继承自Window类,它里面会放一个DecorView,它提供了一组统一窗口操作的API。
  • Window类:提供一些通用的窗口操作API.
  • DecorView类:这是我们所能看到的View的所有,它继承自FrameLayout,我们写的布局view就是放在它这个里面。
  • ApplicationThread类:继承Binder,当Ams想与客户端通信时(即调用客户端的方法时),Ams调用的就是这个类。
  • Instrumentation类:负责直接与Ams对话,比如当客户端想与Ams进行通信时(即调用Ams服务里的方法),都是它去实现单项调用Ams,所有想调用Ams的操作都集中到它这里,它负责单向调用Ams。
  • WindowManager:客户端如果想创建一个窗口得先告诉WindowManager一声,然后它再和WindowManagerService交流一下看看能不能创建,客户端不能直接和WMS交互。

Linux驱动

Linux驱动和Framework相关的主要是两个部分:画家SurfaceFlingger和快递员Binder
每一个窗口都对应一个Surface,SurfaceFlingger主要是把各个Surface显示到同一屏幕上。
Binder是提供跨进程的消息传递。
12
如下是Android的图形管理系统,其中,SurfaceFlingger负责Layer的合成(composer),创建surface,管理surface。
Android Framework 基础理解_第3张图片

从apk程序的运行过程去看看上面各个组件的运行过程:

  • ActivityThread从main()函数中就开始动起来,然后调用prepareMainLooper()为UI线程创建一个消息快递通道即MessageQueue。
  • 接着创建ActivityThread对象,创建过程会创建一个消息装卸工Handler对象和一个快递员Binder对象,其中Binder负责接收远程Ams的IPC调用,接收到调用后让Handler把消息装到消息快递队列,UI线程很忙的都是异步的从消息快递队列中取出消息并执行相应操作,比如 start、stop、pause。
  • 然后UI线程让队列调用Looper.loop()方法进入消息循环体,进入后就会不断地从消息队列中读取并处理消息。
  • 当ActivityThread接收到Ams发送start某个Activity的快递后就会创建指定的Activity对象。Activity会先按窗户再去按玻璃和贴窗花,所以先创建PhoneWindow->DecorView->创建相应的View或ViewGroup。创建完成后就可以让大家欣赏了,调用WindowManager把界面显示到屏幕上,然后创建ViewRoot,然后调用Wms提供的远程接口添加一个窗口并显示到屏幕上。
  • 接下来就是用户的操作,事件线程不断的把消息快递发到事件队列中去,然后事件分发线程秘书逐个取出消息,然后调用Wms中的相应函数处理该消息。

那么安卓程序中都有哪些线程:
客户端小伙伴至少包含三个线程小弟,Activity启动后会创建一个ViewRoot.W对象,同时ActivityThread会创建一个ApplicationThread对象,这两个对象继承消息总管Binder,每个Binder对应一个线程,负责接收Linux Binder驱动发送的IPC调用。还有一个是UI线程。

你可能感兴趣的:(Android)