Android系统架构

文章以前写的文章中的引用来源当时没记,如有侵权或注明出处请联系。
Android官方6层架构
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
应用层

应用框架层 java代码层 Framework API+JNI方法 服务端、客户端、Linux驱动。

在这层里定义的 API 都是用 Java 语言编写。但是又因为它包含了 JNI 的方法,JNI (Java Native Interface)用 C/C++ 编写接口,根据函数表查询调用核心库层里的底层方法,最终访问到 Linux 内核。

系统运行库层 本地代码层C和C++ Android Runtime:核心库+Dalvik 系统库

linux内核层 C语言

各层之间的联系:

  • Android的第一层是有C语言实现,第二层由C和C++实现,第3、4层主要是有java实现的。
  • 第1、2层之间,从linux的操作系统的角度来看,是由内核和用户空间的分界线,
  • 第2、3层之间是本地代码层和java代码层的接口。
  • 第3、4层之间,是android的系统API的接口。
  • 第一层运行与内核空间,第2、3、4运行与用户空间。
Framework层
服务端

ActivityManagerService(AMS): 不同应用程序合理调度 进程的创建与销毁、优先级调整 四大组件管理

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

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

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

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

**PackageManagerService类:**负责Package的管理,应用程序的安装 、卸载、信息查询等。
在这里插入图片描述

客户端

**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是提供跨进程的消息传递。

如下是Android的图形管理系统,其中,SurfaceFlingger负责Layer的合成(composer),创建surface,管理surface。
在这里插入图片描述

在这里插入图片描述
从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中的相应函数处理该消息。
系统运行库层

Android Runtime:一个应用程序一ART

基于寄存器 类都经由JAVA编译器编译 ->SDk(dx 工具)转化成.dex格式(内存优化)由虚拟机执行(依赖linux内核功能,线程内存)

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的设备定制的

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隔壁de小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值