社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
Android框架是一个大的系列,熟悉其中的流程对于Android开发尤其重要,这里面有很多重要的工作和面试的知识点,我准备发布一个系列博客,对于系统源码层进行分析。今天首先对Android的框架结构以及系统源码目录进行解析。
众所周知,Android是谷歌开发的一款基于Linux的开源操作系统,Android系统架构分为五层,从下到上依次是Linux内核层,硬件抽象层,系统运行库层(Android Runtime + Native C/C++ Libraries)、应用框架层、应用层,如下图所示:
Android平台的基础是 Linux 内核,在此基础上添加了部分Android专用的驱动。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。
例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序。
硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。简单理解就是将控制硬件的动作放在硬件抽象层中。
在Android 5.0(API 级别 21)或更高版本的设备,正式将Davlik虚拟机替换为ART虚拟机。5.0之前的Davlik虚拟机在每次应用运行的时候,字节码都需要通过即时编译器(JIT)转换为机器码,比较耗电,占用CPU,而且因为机器码没有做持久话存储,这样势必会影响应用的运行效率。在5.0以及之后在ART虚拟机中,应用在第一次安装的时候,字节码就会预编译(AOT)为机器码,使其成为真正的本地应用,但是这样会降低应用的安装速度,并且占用内存空间。
在7.0的时候,将ART和JIT同时引入到ART虚拟机中,App在安装时不编译, 所以安装速度快。在运行App时, 先走解释器, 然后热点函数会被识别,并被JIT进行编译, 存储在JIT code cache, 并产生profile文件(记录热点函数信息),等手机进入charging和idle状态下, 系统会每隔一段时间扫描App目录下profile文件,并执行AOT编译(Google官方称之为profile-guided compilation)。
Android 还包含一套核心运行时库,核心库提供了Java语言核心库的大多数功能,这样开发者可以使用Java语言来编写Android应用。
许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形。如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某些原生平台库。主要的C/C++程序库如下:
名称 | 描述 |
---|---|
OpenGL ES | 3D绘图函数库 |
Libc | 从BSD继承来的标准C系统函数库,专门为基于嵌入式Linux的设备定制 |
Media Framework | 多媒体库,支持多种常用的音频、视频格式录制和回放。 |
SQLite | 轻型的关系型数据库引擎 |
SGL | 底层的2D图形渲染引擎 |
SSL | 安全套接层,是为网络通信提供安全及数据完整性的一种安全协议 |
FreeType | 可移植的字体引擎,它提供统一的接口来访问多种字体格式文件 |
这一层和我们开发者接触的是最多的,我们平常开发应用程序基本都是调用的这一层所提供的API。常用的组件包括:
名称 | 描述 |
---|---|
ActivityManager | 管理应用程序生命周期以及通常的导航回退功能 |
PackageManager | 管理所有安装在Android系统中的应用程序 |
WindowManager | 管理所有开启的窗口程序 |
NotificationManager | 使得应用程序可以在状态栏中显示自定义的提示信息 |
ResourceManager | 提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等 |
TelephonyManager | 管理所有的移动设备功能 |
ContentProviders | 使得不同应用程序之间可以共享数据 |
LocationManager | 提供地理位置以及定位功能服务 |
系统内置的应用程序以及非系统级的应用程序都是属于应用层。Android 系统自带一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用。平台随附的应用与用户可以选择安装的应用一样,没有特殊状态。因此第三方应用可成为用户的默认网络浏览器、短信 Messenger 甚至默认键盘(有一些例外,例如系统的“设置”应用)。
因为后期学习源码都是来资源这个源码目录中的,所以了解Android源码目录是为后期系统学习源码打下坚实的基础。每个Android版本的源码大同小异,下面是Android7.0的源码目录结构说明, 加粗的几个目录是后面学习源码重点关注的目录:
Android源码根目录 | 描述 |
---|---|
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++代码 |
packages | 应用程序包 |
pdk | Plug Development Kit 的缩写,本地开发套件 |
platform_testing | 平台测试 |
prebuilts | x86和arm架构下预编译的一些资源 |
sdk | sdk和模拟器 |
system | 底层文件系统库、应用和组件 |
toolchain | 工具链文件 |
tools | 工具文件 |
Makefile | 全局Makefile文件,用来定义编译规则 |
上面就是本系列的第一篇文章,学习源码最好将源码下载下来,使用Source Insight进行查看,比较方便,或者也可以在线查看http://androidxref.com/。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!