Android系统四层体系结构详解

开门见山,先上图
Android系统架构图
很明显四层:接下来一一讲解:

Java应用程序层:

Android会同一系列核心应用程序包一起发布,包括客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言调用应用程序框架层的接口编写的,显然你自己也可以使用Java通过JNI(Java Native Interface)的方式,配合Android NDK来开发原生程序(Android Studio里面可直接下载集成NDK。我的另外一篇博客里面有实例)。它允许Java代码和其他语言写的代码(通常为 C和C++ ,形成的代码称为本地代码)进行交互.使用Java与本地已编译的代码交互,通常会丧失平台可移植性.但有些情况下这样做是可以接受的,甚至是必须的。

Java应用程序框架层

这一层刚刚已经提到了一下,他其实就是隐藏在每个应用后面的是一系列的服务和系统。
应用框架层为应用开发者提供了用以访问核心功能的API框架及各种服务和管理工具,包括界面管理、数据访问、应用层的消息传递、应用包的管理、电话管理、定位管理等功能。
它主要包括以下几部分:
丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(Lists),网格(Grids),文本框(Text boxes),按钮(Buttons), 甚至可嵌入的web浏览器。
内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据。
资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和布局文件。
通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。
活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。

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元素(大部分是可见的)在应用程序的布局中。

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

开发者可在自己的应用中使用C、C++本地库中的接口来方便地实现官方API未实现的功能 。例如,Facebook提供了一个开源的Java库,开发者可在自己的应用中嵌入Facebook的部分社交功能, 第三方类库独立于 Android系统架构实现,但与系统架构处于相同的地位,都是使用内核层来提供服务,实现、封装功能模块,供应用层调用。
Android C/C++库通过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)提供了核心链接库和 Dalvik VM虚拟系统,采用 Java开发的应用程序编译成apk程序代码后,交给 Android操作环境来执行。
Android采用 Dalvik VM来代替 Java VM,将写好的 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 Sy-stem,2nd edition ) 是专用于 Flash 的文件系统, 对 NAND-Flash 芯片有着良好的支持。 YAFFS2 是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外断电对文件系统一致性和完整性的影响。
Android 增加了一种进程间的通信机制 IPC Binder , 在内核源代码中, 驱动程序文件为 coredroid/include/linux/binder.h 和 coredroid/drivers/android/binder.c 。 Binder 通过守护进程 Service Manager 管理系统中的服务,负责进程间的数据交换。 各进程通过 Binder 访问同一块共享内存,以达到数据通信的机制。
在标准 Linux内核当中,使用一种叫做 OOM( Out of Memory) 的低内存管理策略;当内存不足时,系统检查所有的进程,并对进程进行限制评分, 获得最高分的进程将被关闭(内核进程除外)。 Android 系统采用的则是一种叫作LMK ( Low Memory Killer )的机制,这种机制将进程按照重要性进行分级、分组。内存不足时,将处于最低级别组的进程关闭。 例如,在移动设备当中, UI 界面处于最高级别,所以该进程永远不会被中止,这样,在终端用户看来,系统是稳定运行的。LMK 内核源码->coredroid/drivers/misc/lowme -morykiller.c

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

Android Binder,基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通讯(IPC,inter-process communication)。Android中每个应用都是一个独立的系统进程,而资源的管理和分配是以进程为单位进行的,通常情况下一个进程不能直接访问另一个进程的资源.为了实现进程通信, Android系统引入了 Binder机制.这种通信基于 Client/Server模型,通信的双方都必须创建一个 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,PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。
源代码位于drivers/misc/pmem.c

Android Logger,一个轻量级的日志设备,用于抓取Android系统的各种日志。
源代码位于drivers/staging/android/logger.c

Android Alarm,提供了一个定时器用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠时也会运行的时钟基准,
源代码位于drivers/rtc/alarm.c

USB Gadget Driver,一个基于标准Linux USB gadget驱动框架的设备驱动。
源代码位于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 File System,Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2使用更小的内存来保存他的运行状态;Yaffs2的垃圾回收简单快速,因此能达到更好的性能;Yaffs2非常适合大容量的Flash存储。

参考资料:
【1】张玉清, 王凯, 杨欢, 方喆君, 王志强, 曹, 琛. Android安全综述[J]. 计算机研究与发展, 2014, (7): 1385-1396
【2】陈璟, 陈平华, 李文亮. Android 内核分析[J]. 现代计算机(专业版), 2009, (11): 112-115
【3】http://www.cnblogs.com/leaven/archive/2010/01/10/1643429.html

  • 23
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值