Android系统体系结构的分析

走到这里,可以对自己说声“辛苦了”,因为这仅仅是个开始。我认为理解Android系统的整个体系结构和运行原理是很重要的,它就像一个刚出生的孩子,必须先学会走,然后才会跑的,下面即为分析Android体系结构和执行流程的文字。

我们都知道,Android系统是采用“堆层”的体系结构来搭建整个系统的运行流程的。但是,对于这个系统的分层并不是固定的,我把它分为4层的结构:Android应用程序层、Android应用程序框架层、外部库和运行时库层及Linux内核层。它的体系结构示意如下:

我们这里主要分析的是框架层、HAL以及Linux内核层的实现原理。当然,在这里简单的介绍一下Android应用程序、外部库和运行时库的作用和功能。

1、应用程序层的分析

Android的应用程序主要体现在用户界面方面,通常是以JAVA语言编写和实现的,其中可以包含各种各样的资源文件,这些资源是放置在项目目录res中的。当然,在JAVA的源代码和相关的资源被成功编译之后,将生成一个APK包,这个包是一种Android特定编译的程序包,类似于c/c++程序包EXE等。Android系统本身就提供了一些核心的应用程序,例如:主屏幕(Home)、联系人(Contact)、电话(Phone)、浏览器(Brower)等众多的核心应用程序。

那么Android应用程序是怎样实现访问系统底层Linux内核的那?我们知道应用程序的开发者可以使用应用程序框架提供的API来实现自己的程序功能,这样就可以逐层的访问硬件设备了。

2、外部库和运行时库的分析

本层对应于一般的嵌入式系统,相当于系统的中间件层次。在Android系统中,分成两部分,一部分即为各种库,另一个为Android的系统运行环境。这层的内容大多是由C++语言编写,少部分为C编写的。

其中包含的各种库如下:

A、C库:C语言标准库,也是系统中最为底层的库之一,这个库是经由Linux系统调用来实现的。

B、SSL:即为SecureSocketLayer,它位于TCP/IP通信协议和各种应用程序协议之间的,为数据通信传递提供安全支持。

C、多媒体框架:即为Android系统多媒体功能的核心框架了,是基于PacketVideo(PV)技术的OpenCore,如果从功能上来划分的话,可以分为音频、视频的回放和音频、视频的记录功能。

D、SGL:Android采用的2D图像引擎库。

E、OpenGLES:提供了对于3D技术的支持库。

F、SQLite:Android系统独特嵌入的轻量级关系型数据库。

G、Webkit:网络浏览器的内核支持。

H、FreeType;支持位图和矢量字体的功能。

3、框架层分析

Android应用程序框架即为应用程序开发者提供了APIs,它实际上即为应用程序的框架。由于上层的应用程序是由JAVA构建,并且主要用来实现UI,所以本层次首先提供包含UI程序中需要的各种空间,例如:Views(视图组件),包括Lists(列表)、Grids(网格)、TextBox(文本框)、Buttons(按钮)等控件。甚至包含有一个重要的嵌入式的网络浏览器(webkit内核集成)。

一个基本的应用程序应该可以利用框架中的一下功能部分:

A、Activity(视图窗口或称之为活动)。

B、Service(框架服务)。

C、ContentProvider(内容提供者或内容分享)。

D、BroadcastIntentReceiver(广播机制)。

通过Android启动过程包括从Linux内核加载到Home应用程序的整个过程来分析Android框架,Android启动过程简略图如下:

上面即是Android启动过程的执行过长简略图。

A、Linux内核

我们知道Android是基于Linux内核的。启动时,首先通过加载器bootloader来加载Linux内核;然后,在内核加载启动时,与普通的linux启动的过程是相同的,即先初始化内核(很多个驱动程序设备),然后再调用init进程继续进行。

B、调用init进程

本进程是用来对各种设备进行初始化的,加载运行应用程序框架所需要的各种服务,例如:Daemon、ContextManager、MediaServer及Zygote等。

C、ContextManager

这个进程是个很重要的进程,主要用来管理Android系统所需要系统服务的。Android系统服务是组成Android应用程序框架的重要组件,可以提供从音频、视频、相机、通讯录等各种应用程序进行所需要的重要的APIs。

Android应用程序或框架的内部功能模块在调用系统服务时,先需要向服务管理器ContextManager申请注册,然后才可以通过BinderIPC来调用系统服务。在系统启动的时候,Android所有的系统服务必须把自己的handle信息注册到服务管理器,一供BinderIPC进行进程之间的通信。

D、MediaServer

MediaServer是负责运行基于C/C++的本地系统服务的多媒体功能服务,例如:AudioFlinger是负责音频、视频及Camera等正常运行的。

E、Zygote进程

Zygote进程相当于一种优化器,它会缩短Android应用程序加载的时间,每当运行Java应用程序时,Zygote就会派生出一个子进程来执行程序,这个进程就是来执行Java应用程序的需要的虚拟机的。

F、SystemServer系统服务

SystemServer进程是由Zygote进程所创建的,所以它是运行在Zygote进程之后的。从上面的运行流程中,我们知道它创建了Android系统中大部分的服务,例如:管理应用程序生命周期的ActivityManagerServer、管理网络连接功能的ConnectivityService及管理提供终端地理位置信息的LocationServer、管理传感器的SensorServer和电源管理服务。

在上面的图中,可以看到运行在SystemServer中的Java本地系统服务被提供给了Android应用程序或框架内部模块调用,在这之前,需要先在ContextManager中注册才可进行。

上面只是简单的分析了Android启动过程。当所有的Java本地系统服务加载完毕之后,ActivityManagerServer就会运行Home了,同时,启动过程继续进程。

4、HAL及Linux内核分析

在这里,主要讨论的是HAL在整个体统中的承上启下的重要作用;对于Linux内核部分,主要就是硬件驱动程序模块部分;后面我会编写一个实验性质的硬件驱动程序来访问硬件设备。如果想要更深入得了解Linux内核系统,建议最好阅读一些Linux内核相关书籍,这样对于编写Android驱动程序也有极大的帮助。

从上面的Android系统体系结构图中,可以知道HAL(硬件抽象层)的作用是向上提供底层访问的服务接口,向下则屏蔽了底层的实现细节,如果学过网络协议的同学会更清楚知道这种“堆层”结构的最大好处就是“向上提供接口,向下屏蔽实现细节”。

为什么将Android系统中的硬件支持分成两成那?我们都知道,Linux系统的源代码是遵循着GPL协议的,也就是说如果我们在内核中添加或者修改内核源代码的话,就必须公开所修改的源代码的;同时,我们知道Android系统是基于Linux系统的,并且遵循则ApacheLicense协议,这个协议是这样的,它是允许移动厂商添加或修改源代码的时候不必公开源代码的实现细节和相关参数的。因此,Android将对硬件的支持分为了两层来实现的,这样也可以维护各移动厂商的利益,所以将HAL的实现放在了“用户空间“而不是内核空间,内核空间中只是存放了一些简单访问硬件的驱动通道接口。

分析HAL的目的在于更好的了解Android系统的整个结构和执行的流程,因为它涵盖了Android驱动程序、硬件抽象层、外部库和运行时库、程序框架以及应用程序等层次结构。所以,我会在工作之余,编写相关的程序代码来印证Android系统的执行流程,使我们更深刻的理解Andorid体系。

希望兴趣相投的同学来一起研究学习,申请时,请输入加入理由,谢谢!

我刚新建一讨论群,群号是:179914858

更多相关文章

  1. 说说在 Android(安卓)中如何接收系统广播
  2. Android权限之sharedUserId和签名
  3. android实现静默安装和跳过卸载弹窗直接卸载应用
  4. 如何实现在 Android(安卓)Studio 上开发系统应用(自带系统签名)
  5. 使用Frida渗透Android(安卓)app
  6. "浅谈Android"第一篇:Android系统简介
  7. android 学习一 android开发环境搭建
  8. Android(安卓)权限介绍
  9. Android弹幕实现:基于B站弹幕开源系统(6)带用户头像且头像从网络加

随机推荐

  1. Android Studio升级后报 method not foun
  2. 开始写笔记
  3. Android(安卓)UI开源组件库BottomView ,第
  4. android NDK mk文件模板
  5. Android开发指南中文版(七)Content Provide
  6. Android View底层到底是怎么绘制的
  7. Android测试入门篇
  8. Android开发者e周报 第2期
  9. Android日记之2012\01\18
  10. Android System Server大纲之LightsServi