Android 工具之系统四层体系结构详解

本文深入解析Android系统五层架构:应用程序层、应用框架层、本地库与运行时环境、Linux内核与驱动层,以及HAL层。详述各层功能与核心组件,如DalvikVM、Binder机制和YAFFS2文件系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是常见安卓系统体系结构图,还有一种是在C库与底层中间加了一个HAL层,《Android 工具之系统五层框架体系结构详解》。这篇主要说这种四层结构体系:

Android系统架构图
很明显四层:接下来一一讲解:

Java应用程序层:

Android会同一系列核心应用程序包一起发布,该应用程序包包括客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。

这些应用程序都是调用应用程序框架层的接口写的,显然你自己也可以使用Java通过Java原生接口JNI(Java Native Interface)的方式,配合Android NDK来开发原生程序,它允许Java代码和其他语言写的代码(通常为 C和C++ ,形成的代码称为本地代码)进行交互.使用Java与本地已编译的代码交互,通常会丧失平台可移植性.但有些情况下这样做是可以接受的,甚至是必须的。

Java应用程序层是你可以看得见的一层,那些捆绑的应用你可以通过虚拟机打开,也可以通过相应的API在自己的应用中直接调用。

Java应用程序框架层

这一层刚刚已经提到了一下,他其实就是隐藏在每个应用后面的是一系列的服务和系统。

应用框架层为应用开发者提供了用以访问核心功能的API框架.在遵循框架安全性限制的前提下,任何一个应用都可以调用这些核心功能 API来发布自己的功能组件.应用框架层提供了各种服务和管理工具,包括了应用开发所需的界面管理、数据访问、应用层的消息传递、应用包的管理、电话管理、定位管理以及 Google Talk服务等功能。

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

【服务端:

  1. ActivityManagerService(Ams):负责管理所有应用程序中的Activity,它掌握所有Activity的情况,具有所有调度Activity生命周期的能力,简单来说,ActivityManagerService是管理和掌控所有的Activity.
  2. WindowManagerService(Wms):控制窗口的显示、隐藏以及窗口的层序,简单来说,它就是管理窗口的,大多数和View有关系的都要和它打交道。
  3. KeyQ类:它是Wms的一个内部类,一旦创建就会启动一个新线程,这个线程会不断地接收和读取用户的UI操作消息,并把这些消息放到消息队列QueueEvent中。
  4. InputDispatcherThread类:该类也是一旦创建就会启动一个新线程,这个线程会不断地从上面的QueueEvent中取出用户的消息进行一定的过滤,再将这些消息发送给当前活动的客户端程序中.

客户端:

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

Linux驱动:

     Linux驱动和Framework相关的主要是两个部分:画家SurfaceFlingger和快递员Binder。每一个窗口都对应一个画Surface,SF主要是把各个Surface显示到同一屏幕上。Binder是提供跨进程的消息传递。】

我们在开发应用时都是通过框架来与Android底层进行交互,接触最多的就是应用框架层了。

应用程序框架可以说是一个应用程序的核心,是所有参与开发的程序员共同使用和遵守的约定,大家在其约定上进行必要的扩展,但程序始终保持主体结构的一致性。其作用是让程序保持清晰和一目了然,在满足不同需求的同时又不互相影响。

Android系统提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则。我们在开发应用时就是在这个框架上进行扩展。Android应用框架功能如下:

  *android.app:提供高层的程序模型和基本的运行环境。
  *android.content:包含对各种设备上的数据进行访问和发布。
  *android.database:通过内容提供者浏览和操作数据库。
  *android.graphics:底层的图形库,包含画布、颜色过滤、点、矩形,可以将它们直接绘制到屏幕上。
  *android.location:定位和相关服务的类。
  *android.media:提供一些类管理多种音频、视频的媒体接口。
  android.net:提供帮助网络访问的类,超过通常的java.net.接口。
  *android.os:提供了系统服务、消息传输和IPC机制。
  *android.opengl:提供OpenGL的工具。
  *android.provider:提供访问Android内容提供者的类。
  *android.telephony:提供与拨打电话相关的API交互。
  *android.view:提供基础的用户界面接口框架。
  *android.util:涉及工具性的方法,例如时间日期的操作。
  *android.webkit:默认浏览器操作接口。
  *android.widget:包含各种UI元素(大部分是可见的)在应用程序的布局中。
如果觉得不够清晰,可以自己查阅Android API文档。

C、C++本地库和Android运行时环境

开发者可以在自己的应用中使用C、C++本地库中的接口来方便地实现官方 API 未实现的功能 . 例如, Facebook提供了一个开源的Java库,开发者可以在自己的 应 用 中 嵌 入 Facebook的 部 分 社 交 功 能, 第 3 方 类库独立于 Android系统架构实现,但与系统架构处于相同的地位,都是使用内核层来提供服务,实现、封装功能模块,供应用层调用。

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

系统 C 库 - 一个从BSD (Berkeley Software Distribution,伯克利软件套件),Unix的衍生系统继承来的标准C系统函数库 Libc ), 它是专门为基于Embedded linux的设备定制的。

媒体库 - 基于PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。

LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。

Android运行时环境(Android Runtime)提供了核心链接库(Core Libraries)和 Dalvik VM虚拟系统(Dalvik Virtual Machine),采用 Java开发的应用程序编译成 apk程序代码后,交给 Android操作环境来执行。

Android采用 Dalvik VM来代替 Java VM,熟悉 Java SE开发环境的开发人员可以很快地学会开发 Android应用程序。将写好的 Java程序“.java”先编译成“.class”程序,这个过程和开发 Java SE是相同的;接下来再次编译成可以在 Dalvik VM执行的“.dex”程序,最后要包装成 Android可以执行的文件“.apk”

每个Android 应用都运行在自己的进程上, Dalvik 虚拟机为它分配自有的实例。 Dalvik 使一台设备能运行多个虚拟机程序但消耗较少的资源。

Linux内核与驱动层

Android是基于不同版本的 Linux内核开发出来的, Linux内核层包括系统层安全机制、内存管理、进程管理、网络堆栈及一系列的驱动模块,位于硬件与其他的软件层之间,提供与硬件的交互.

Android内核与标准 Linux 内核在文件系统、进程间通信机制、内存管理等方面存在不同

Android内核中增加了标准 Linux 内核中没有采纳的 YAFFS2文件系统。 YAFFS2(Yet Another Flash File System,2nd edition) 是专用于 Flash 的文件系统, 对 NAND-Flash 芯片有着良好的支持。 YAFFS2 是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外断电对文件系统一致性和完整性的影响。

Android 增加了一种进程间的通信机制 IPC Binder , 在内核源代码中, 驱动程序文件为 coredroid/include/linux/binder.h 和 coredroid/drivers/android/binder.c 。 Binder 通过守护进程 Service Manager 管理系统中的服务,负责进程间的数据交换。 各进程通过 Binder 访问同一块共享内存,以达到数据通信的机制。

Android 内核采用了一种不用于标准 Linux 内核的低内存管理策略。 在标准 Linux内核当中,使用一种叫做 OOM ( Out of Memory) 的低内存管理策略;当内存不足时,系统检查所有的进程,并对进程进行限制评分, 获得最高分的进程将被关闭(内核进程除外)。 Android 系统采用的则是一种叫作LMK ( Low Memory Killer )的机制,这种机制将进程按照重要性进行分级、分组。内存不足时,将处于最低级别组的进程关闭。 例如,在移动设备当中, UI 界面处于最高级别,所以该进程永远不会被中止,这样,在终端用户看来,系统是稳定运行的。 在 Andorid 内核源码 中 , LMK 的 位 置 coredroid/drivers/misc/lowme -morykiller.c

Android Linux内核核心驱动主要包括:

Android Binder,基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通讯(IPC,inter-process communication)。

Android 中每个应用都是一个独立的系统进程,而资源的管理和分配是以进程为单位进行的,通常情况下一个进程不能直接访问另一个进程的资源.为了实现进程通信, Android系统引入了 Binder机制,该机制是 OpenBinder在 Linux中的具体实现.这种通信基于 Client/Service模型,通信的双方都必须创建一个 IBinder接口,进行通信时, Client首先通过系统的 ServiceManager获取目标 Service的代理对象,并通过这个代理对象调用Service提供的功能接口,调用请求会通过 Binder驱动发送给Service,而Service的处理结果也会通过 Binder驱动发送给 Client.

源代码位于drivers/staging/android/binder.c

Android电源管理(PM),一个基于标准Linux电源管理系统的轻量级的Android电源管理驱动,针对嵌入式设备做了很多优化。

源代码位于kernel/power/earlysuspend.c

                    kernel/power/consoleearlysuspend.c
                    kernel/power/fbearlysuspend.c
                    kernel/power/wakelock.c
                    kernel/power/userwakelock.c

低内存管理器(Low Memory Killer),相对于Linux标准OOM(Out Of Memory)机制更加灵活,它可以根据需要杀死进程来释放需要的内存。

源代码位于drivers/staging/android/lowmemorykiller.c

匿名共享内存(ashmem),为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。

源代码位于mm/ashmem.c

Android PMEM(Physical),PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。

源代码位于drivers/misc/pmem.c

Android Logger,一个轻量级的日志设备,用于抓取Android系统的各种日志。

源代码位于drivers/staging/android/logger.c

Android Alarm,提供了一个定时器用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠时也会运行的时钟基准,

源代码位于drivers/rtc/alarm.c

USB Gadget驱动,一个基于标准Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框架的,

源代码位于drivers/usb/gadget/

Android Ram Console,为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。

源代码位于drivers/staging/android/ram_console.c。

Android timed device,提供了对设备进行定时控制功能,目前支持vibrator和LED设备。

源代码位于drivers/staging/android/timed_output.c(timed_gpio.c)。

Yaffs2文件系统,Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2使用更小的内存来保存他的运行状态,因此它占用内存小;Yaffs2的垃圾回收非常简单而且快速,因此能达到更好的性能;Yaffs2在大容量的NAND Flash上性能表现尤为明显,非常适合大容量的Flash存储。

参考链接:

1. https://blog.youkuaiyun.com/songkai320/article/details/51802282

2. https://www.cnblogs.com/wangcMove/p/7602903.html  Android Framework 初探

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值