Android系统架构解析与系统源码目录 - Go语言中文社区

Android系统架构解析与系统源码目录


Android框架是一个大的系列,熟悉其中的流程对于Android开发尤其重要,这里面有很多重要的工作和面试的知识点,我准备发布一个系列博客,对于系统源码层进行分析。今天首先对Android的框架结构以及系统源码目录进行解析。

1 Android系统架构图


众所周知,Android是谷歌开发的一款基于Linux的开源操作系统,Android系统架构分为五层,从下到上依次是Linux内核层,硬件抽象层,系统运行库层(Android Runtime + Native C/C++ Libraries)、应用框架层、应用层,如下图所示:


在这里插入图片描述


(1) Linux 内核

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

例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序。

(2) 硬件抽象层 (HAL Hardware Abstraction Layer)

硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。简单理解就是将控制硬件的动作放在硬件抽象层中。

(3) Android Runtime

在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应用。

(4) 原生C/C++库

许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形。如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某些原生平台库。主要的C/C++程序库如下:

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

这一层和我们开发者接触的是最多的,我们平常开发应用程序基本都是调用的这一层所提供的API。常用的组件包括:

名称描述
ActivityManager管理应用程序生命周期以及通常的导航回退功能
PackageManager管理所有安装在Android系统中的应用程序
WindowManager管理所有开启的窗口程序
NotificationManager使得应用程序可以在状态栏中显示自定义的提示信息
ResourceManager提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
TelephonyManager管理所有的移动设备功能
ContentProviders使得不同应用程序之间可以共享数据
LocationManager提供地理位置以及定位功能服务
(6) 应用层

系统内置的应用程序以及非系统级的应用程序都是属于应用层。Android 系统自带一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用。平台随附的应用与用户可以选择安装的应用一样,没有特殊状态。因此第三方应用可成为用户的默认网络浏览器、短信 Messenger 甚至默认键盘(有一些例外,例如系统的“设置”应用)。


2 Android源码目录

因为后期学习源码都是来资源这个源码目录中的,所以了解Android源码目录是为后期系统学习源码打下坚实的基础。每个Android版本的源码大同小异,下面是Android7.0的源码目录结构说明, 加粗的几个目录是后面学习源码重点关注的目录:

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

上面就是本系列的第一篇文章,学习源码最好将源码下载下来,使用Source Insight进行查看,比较方便,或者也可以在线查看http://androidxref.com/

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/oman001/article/details/108907816
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-13 12:12:29
  • 阅读 ( 1306 )
  • 分类:架构

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢