【Android】系统层学习笔记——系统架构与源码目录

【Android】系统层学习笔记——系统架构与源码目录

参考文献:Android系统架构与系统源码目录

首先要感谢@刘望舒大神的博客,让我们这些渣渣有途径更快速地接触到Android系统层的内容。

本篇博客主要介绍了Android系统的整体架构及源码的目录结构。

Android系统架构

Android的系统架构可以分为五层,分别是 应用层、应用框架层、系统运行库层、硬件抽象层、Linux内核层。

img

应用层

系统内置应用及非系统应用均属于应用层的级别,它们负责直接与用户进行交互,一般用Java开发。我们一般开发出来的应用都是属于应用层。

应用框架层(Framework层)

应用框架层又称Framework层,为应用的开发人员提供了开发所需的API,我们日常开发基本都是调用应用框架层的API,这一层一般也是由Java编写。

下表列出了这一层主要的组件及简单描述:

名称 功能描述
Activity Manager 管理各个应用程序生命周期以及通常的导航回退功能
Location Manager 地理位置以及定位功能服务
Package Manager 管理所有安装在Android系统中的应用程序
Notification Manager 使得应用程序可以在状态栏中显示自定义的提示信息
Resource Manager 应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
Telephony Manager 管理所有的移动设备功能
Window Manager 管理所有开启的窗口程序
Content Providers 使得不同应用程序之间可以共享数据
View System 构建应用程序的基本组件

系统运行库层(Native层)

系统运行库层又称Native层,一般分为两部分

  • C++程序库
  • Android运行时库

C++程序库

C++程序库可以被Android系统的不同组件使用,并且通过Framework层为开发者服务。

下表为常见的C++程序库及其对应功能:

名称 功能描述
OpenGL ES 3D绘图函数库
Libc 从BSD继承来的标准C系统函数库,专门为基于嵌入式Linux的设备定制
Media Framework 多媒体库,支持多种常用的音频、视频格式录制和回放。
SQLite 轻型的关系型数据库引擎
SGL 底层的2D图形渲染引擎
SSL 安全套接层,是为网络通信提供安全及数据完整性的一种安全协议
FreeType 可移植的字体引擎,它提供统一的接口来访问多种字体格式文件

可以看到,我们的常用的很多Framework层的库都是由Native层的这些C++程序库封装而成(如 MediaPlayer、SQLite)

Android运行时库

Android的运行时库又分为了核心库和ART(Android5.0后,Dalvik虚拟机被ART取代)

核心库提供了Java语言核心库的大部分功能,使得开发者可以使用Java语言来开发应用。

相比JVM,Dalvik虚拟机是专门为移动设备定制,可以在有限的内存中同时运行多个虚拟机实例。并且每一个Dalvik应用都作为一个独立的Linux进程来执行。独立的进程可以防止虚拟机崩溃时所有程序都被关闭。

而ART的机制则与Dalvik不同。Dalvik中的应用运行时,字节码都需要通过即时的编译转为机器码,拖慢应用的效率。而ART中,应用在第一次安装时便会转换为机器码,提高运行时的效率。

硬件抽象层(HAL层)

硬件抽象层位于操作系统内核与硬件电路之间的接口层,目的在于把硬件抽象化,保护硬件厂商的知识产权。它隐藏了特定平台的硬件接口的细节,给操作系统提供了虚拟的硬件平台,使得其具有了硬件无关性。一般将控制硬件的部分放在硬件抽象层中。

Linux内核层

众所周知,Android是基于Linux的内核,在此基础上添加了Android专用的驱动。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于这个内核。

Android系统源码目录

我们首先需要了解Android系统源码的目录结构,这样便于我们后期进行源码的分析。我们可以到http://androidxref.com这个网站下载Android系统的源码。不过最好将源码下载下来。

我们可以使用清华大学开源软件镜像站提供的Android 镜像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP

同样我们也可以使用这个百度网盘链接:http://pan.baidu.com/s/1ngsZs

整体结构

各个版本Android的源码根目录基本类似,如果编译后会多一个out文件夹存储编译产生的文件。

根目录结构如下:

  • abi 应用程序二进制接口
  • art 全新的ART运行环境
  • bionic 系统C库
  • bootable 启动引导相关代码
  • build 存放系统编译规则及generic等基础开发包配置
  • cts Android兼容性测试套件标准
  • dalvik dalvik虚拟机
  • developers 开发者目录
  • development 应用程序开发相关
  • device 设备相关配置
  • docs 参考文档目录
  • external 开源模组相关文件
  • frameworks 应用程序框架,Android系统核心部分,由Java和C++编写
  • hardware 主要是硬件抽象层的代码
  • libcore 核心库相关文件
  • libnativehelper 动态库,实现JNI库的基础
  • ndk NDK相关代码,帮助开发人员在应用程序中嵌入C/C++代码
  • out 编译完成后代码输出在此目录
  • packages 应用程序包
  • pdk Plug Development Kit 的缩写,本地开发套件
  • platform_testing 平台测试
  • prebuilts x86和arm架构下预编译的一些资源
  • sdk sdk和模拟器
  • system 底层文件系统库、应用和组件
  • toolchain 工具链文件
  • tools 工具文件
  • Makefile 全局Makefile文件,用来定义编译规则

可以看到系统源码分类清晰,内容庞大且复杂。我们接下来分析应用层部分,也就是packages中的内容。

应用层

应用层位于整个Android系统的最上层,开发者开发的应用程序以及系统内置的应用程序都是在应用层。源码根目录中的packages目录对应着系统应用层。

应用层的目录结构如下:

  • apps 核心应用程序
  • experimental 第三方应用程序
  • inputmethods 输入法目录
  • providers 内容提供者目录
  • screensavers 屏幕保护
  • services 通信服务

可以发现,它存放了核心应用程序、第三方应用、输入法等等与用户直接交互的内容,这些都是运行在应用层的。

应用框架层

应用框架层是系统的核心部分,一方面向上提供接口给应用层调用,另一方面向下与C/C++程序库以及硬件抽象层等进行衔接。

应用框架层的主要实现代码位于/frameworks/base//frameworks/av目录,其中/frameworks/base/的目录结构如下:

  • api 定义API
  • cmds 重要命令:am、app_proce等
  • core 核心库
  • data 字体和声音等数据文件
  • docs 文档
  • graphics 图形图像相关
  • include 头文件
  • keystore 和数据签名证书相关
  • libs 库
  • location 地理位置相关库
  • media 多媒体相关库
  • native 本地库
  • nfc-extras NFC相关
  • obex 蓝牙传输
  • opengl 2D/3D 图形API
  • packages 设置、TTS、VPN程序
  • sax XML解析器
  • services 系统服务
  • telephony 电话通讯管理
  • test-runner 测试工具相关
  • tests 测试相关
  • tools 工具

系统运行库层C/C++部分

系统运行库层(Native)中的 C/C++程序库的类型繁多,功能强大,C/C++程序库并不完全在一个目录中,

下面是几个常用且比较重要的C/C++程序库所在的目录位置。

  • bionic/ Google开发的系统C库,以BSD许可形式开源。
  • /frameworks/av/media 系统媒体库
  • /frameworks/native/opengl 第三方图形渲染库
  • /frameworks/native/services/surfaceflinger 图形显示库,主要负责图形的渲染、叠加和绘制等功能
  • external/sqlite 轻量型关系数据库SQLite的C++实现

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: