Android 系统架构

首语

由于工作内容的转变,使得我向Android系统方向转变,对于一个Android系统工程师,了解Android整个系统架构是必然的。本篇是Android系统学习的开篇,Android系统庞大且复杂,但是能对Android的认识更深,更全面。开启Android系统之旅吧!

推荐Android系统干货博主:Gityuan

系统架构

Android系统架构分为五层。从上往下依次是应用层应用框架层系统运行库层硬件抽象层Linux内核层

Android系统架构

应用层(System Apps)

系统内置的应用程序以及非系统级的应用程序都属于应用层,负责与用户进行直接交互。

应用框架层(Java API Framework)

应用框架层为开发人员提供了开发应用程序所需要的API,我们平成开发应用程序都是调用这一层提供的API,当然也包括系统应用。这一层是由Java代码编写的,可以称为Java Framework。

它所提供的组件如下:

名称功能描述
Activity Manager(活动管理器)管理各个应用程序生命周期,以及常用的导航回退功能
Location Manager(位置管理器)提供地理位置及定位功能服务
Package Manager(包管理器)管理所有安装在Android系统的应用程序
Notification Manager(通知管理器)使得应用程序在通知栏显示自定义的提示消息
Resource Manager(资源管理器)提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
Telephony Manager(电话管理器)管理所有的移动设备功能
Window Manager(窗口管理器)管理所有的窗口程序
Content Provider(内容提供者)Android四大组件之一。使得不同应用程序之间共享数据
View System(视图系统)构建应用程序的基本组件
系统运行库层(Native)

从上图可以看出,系统运行库层分为两部分,分别是C/C++程序库和Android运行时库。

C/C++程序库

C/C++库被Android系统中的不同组件使用,并通过应用程序框架为开发者提供服务。以下为主要的C/C++程序库:

名称功能描述
OpenGL ES3D 绘图函数库
Libc从BSD继承来的标准C系统函数库,专门为嵌入式Linux的设备定制
Media Framework多媒体库,支持多种常用的音频、视频格式录制和回放
SQLite轻型的关系型数据引擎
SGL底层的2D图形渲染引擎
SSL安全套接层,是一种为网络通信提供安全及数据完整性的安全协议
Free Type可移植的字体引擎,提供统一的接口来访问多种字体格式文件
Webkit浏览器网页排版引擎,包含WebCore排版引擎和JSCore引擎。
OpenMax ALOpenMax是一个多媒体应用程序的框架标准,OpenMax分为3层:
第一层:OpenMax DL(Development Layer,开发层)
第二层:OpenMax IL(Integration Layer,集成层)
第三层:OpenMax AL(Appliction Layer,应用层)
Android运行时库

从上图可以看出,运行时库分为核心库和ART。

核心库

核心库提供了Java语言核心库的大多数功能,开发者使用Java语言编写应用程序。

ART

Android 5.0后,Dalvik虚拟机被ART取代。与JVM相比,Dalvik虚拟机(DVM)是专门为移动设备定制的,允许在有限的内存同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。这样可以防止虚拟机崩溃的时候所有程序都关闭。ART与DVM的机制有所不同,DVM中的应用每次运行时,字节码都需要通过即时编译器(JIT)转化为机器码,使得应用程序运行效率降低。在ART中,系统安装应用时会进行依次预编译(AOT),将字节码预先编译成机器码并存储在本地,这样不需要每次运行执行编译,提高运行效率。

硬件抽象层(HAL)

硬件抽象层是位于操作系统内核与硬件电路之间的接口层,目的在于将硬件抽象化。为了保护硬件厂商的知识产权,它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。通俗来讲,就是将控制硬件的动作放在硬件抽象层中。

Linux内核层(Linux Kernel)

Android的核心服务基于Linux内核层,这一层为android设备的各种硬件提供了底层的强大驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等。在此基础上添加了部分Android专用的驱动,如Binder、Alarm、Logger等。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型都依赖该内核。

Android版本

版本号代号API
Android 14.0U34
Android 13.0T33
Android 12.0LS32
Android 12.0S31
Android 11.0R30
Android 10.0Q29
Android 9.0Pie28
Android 8.1Oreo27
Android 8.0Oreo26
Android 7.1.1Nougat25
Android 7.0Nougat24
Android 6.0Marshmallow23
Android 5.1Lollipop22
Android 5.0Lollipop21
Android 4.4WKitKat Wear20
Android 4.4KitKat19
Android 4.3Jelly Bean18
Android 4.2Jelly Bean17
Android 4.1Jelly Bean16
Android 4.0.3IceCreamSandwich15
Android 4.0IceCreamSandwich14
Android 3.2Honeycomb13
Android 3.1Honeycomb12
Android 3.0Honeycomb11
Android 2.3.3Gingerbread10
Android 2.3Gingerbread9
Android 2.2Froyo8
Android 2.1Eclair7

系统源码目录

关于Android源码下载,可以参考:Windows下安装Ubuntu、图形界面、下载Android源码,看这一篇就够了

目录基于Android13。

整体结构
源码根目录描述
artART运行环境
bionic系统C库
bootable启动引导相关代码
build系统编译规则及generic等基础开发包配置
ctsAndroid 兼容性测试套件标准
dalvikDalvik 虚拟机
developers开发者目录
development应用程序相关
device设备相关配置
docs参考文档
external开源模组相关
frameworks应用程序框架,Android系统核心部分
hardware硬件抽象层代码
kernel内核层,包括设备驱动、硬件抽象层、系统调用等方面的代码
libcore核心库相关文件
libnativehelper动态库,实现JNI库的基础
packages应用程序包
out编译代码输出目录,可自定义
pdkPlug Development Kit,本地开发套件
platform_testing平台测试
prebuiltsX86和ARM架构下预编译的一些资源
sdkSDK和模拟器
system底层文件系统库、应用和组件
test存放测试代码和测试工具
toolchain工具链文件
tools工具文件

还有一个重要的目录vendor,存放厂商定制代码。

应用层(packages)

应用层是Android系统的最上层,开发者开发的应用和系统内置的应用都在应用层。源码根目录中的packages目录对应着系统应用层。

packages目录描述
apps核心应用程序
modules独立、可插拔的应用程序模块
inputmethods输入法目录
providers内容提供者目录
screensavers屏幕保护
services通信服务
wallpapers壁纸
应用框架层(frameworks/base)

应用框架层是系统的核心部分,向上提供接口给应用层调用,向下与C/C++程序库及硬件抽象层进行通信,主要实现代码在frameworks/base和frameworks/av这两个目录下,frameworks的目录结构如下:

frameworks/base目录描述
apct_tests存放自动化测试相关代码及测试用例
apexAPEX(Android Package Executable)模块,一种新的Android应用打包格式,用于将系统组件和服务以及供应商组件和服务封装为单独的模块
api定义API
boot操作系统的启动代码和基本类库
cmds重要命令,如am、app_proce等
config系统的配置文件和数据结构
core核心库
data字体、声音等数据文件
docs文档
drm数字版权管理(DRM)的代码和类库
errorprone错误处理和异常处理的代码和类库
graphics图形图像有关
identity身份验证和授权的代码和类库
keystore数据签名证书相关
libs
location地理位置相关库
media多媒体相关库
mimeMIME(多用途互联网邮件扩展)类型的定义和配置信息
mms短信和多媒体消息服务的代码和类库
native本地库
nfc-extrasNFC相关
obex蓝牙传输
omapiOMADP(Open Mobile Alliance Device Provider)的API接口和类库
opengl2D/3D图形API
packages设置、TTS、SystemUI、VPN程序等
proto系统中的各种协议和数据结构的定义和配置信息
rsRenderScript(渲染脚本)的代码和类库
samples各种示例代码和演示程序
saxxml解析器
services系统服务
startopStartOp(启动操作)的代码和类库
telecomTelecom(电话通信)的代码和类库
telephony电话通信管理
test-runner测试工具相关
tests与测试相关
tools工具
wifiWi-Fi 无线网络
C/C++程序库部分

系统运行库层的C/C++程序库的类型繁多,功能强大。以下是比较常用且重要的C/C++程序库。

目录位置描述
bionicGoogle开发的系统C库,以BSD许可形式开源
frameworks/av/media系统媒体库
frameworks/native/opengl第三方图形渲染库
frameworks/native/services/surfaceflinger图形显示库,负责图形渲染、叠加和绘制功能
external/sqlite轻量级关系型数据库SQLite的C++实现

源码阅读

源码阅读有在线阅读和本地阅读两种方式。在线阅读推荐官方:https://cs.android.com

本地阅读就是将代码下载到本地,然后通过Android Studio去阅读。以下是阅读环境配置:

1.更改内存设置,把内存调整到8GB及以上

2.在源码根目录,编译idegen模块

source build/envsetup.sh
mmm development/tools/idegen/

编译成功后在 /out/host/linux-x86/framework 目录下会生成 idegen.jar 文件。

3.执行sh脚本,它将使用这个jar生成所需的 .ipr 文件:

development/tools/idegen/idegen.sh

成功后,源码根目录可以找到 android.imlandroid.ipr 两个文件,用Android Studio打开 android.ipr文件即可,等待一段时间的扫描就可以了。

总结

以上都是学习Android系统源码的必备基础,掌握它们才能更好的深入学习Android系统源码,如有问题欢迎批评指正。后续会学习Android系统启动、AMS、WMS等源码,真正走进Android系统源码的世界。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/103754.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2019年亚太杯APMCM数学建模大赛B题区域经济活力及其影响因素的分析与决策求解全过程文档及程序

2019年亚太杯APMCM数学建模大赛 B题 区域经济活力及其影响因素的分析与决策 原题再现 区域(或城市或省级)经济活力是区域综合竞争力的重要组成部分。近年来,为了提高经济活力,一些地区推出了许多刺激经济活力的优惠政策&#xf…

Day 10 python学习笔记

高阶函数 map( ) map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。(Iterator是一个可迭代对象) 再简单点说:从可迭代…

LeetCode讲解篇之面试题 01.08. 零矩阵

文章目录 题目描述题解思路题解代码 题目描述 题解思路 遍历矩阵,若当前元素为零,则将该行和该列的第一个元素置零 遍历第一行,若当前元素为零,则将当前列置零 遍历第一列,若当前元素为零,则将当前行置零 …

整理指定文件夹下的所有文件,以类树状图显示并生成对应超链接

最近在整理家里学习资料的时候,由于年代久远,找不到我想要找的文件,windows文件搜索速度感觉太慢。于是想要生成一份类似文件索引的东西来显示所有资料,让我可以快速的找到需要的资料路径 直接上代码 import os import datetim…

73 应急响应-WEB分析phpjavaweb自动化工具

目录 应急响应:必备知识点:准备工作:有明确信息网站被入侵:无明确信息网站被入侵:常见分析方法: 演示案例:WindowsIISSql-日志,搜索LinuxBT_Nginxtp5-日志,后门360星图日志自动分析工…

Sui提供dApp Kit 助力快速构建React Apps和dApps

近日,Mysten Labs推出了dApp Kit,这是一个全新的解决方案,可用于在Sui上开发React应用程序和去中心化应用程序(dApps)。mysten/dapp-kit是专门为React定制的全新SDK,旨在简化诸如连接钱包、签署交易和从RPC…

PyTorch 与 TensorFlow:机器学习框架之战

深度学习框架是简化人工神经网络 (ANN) 开发的重要工具,并且其发展非常迅速。其中,TensorFlow 和 PyTorch 脱颖而出,各自在不同的机器学习领域占有一席之地。但如何为特定项目确定理想的工具呢?本综合指南[1]旨在阐明它们的优点和…

报错:Could not resolve host: mirrorlist.centos.org;Unknown error

报错:Could not resolve host: mirrorlist.centos.org;Unknown error 一般是因为网络配置错误导致无法连接外网,我们先尝试ping一下www.baidu.com发现无法ping通。 果然,接下来我们就开始排查吧!! 1.网络配置查看 打开…

SpringBoot 源码分析(四) 内置Tomcat分析

一、Tomcat相关知识 1. tomcat目录结构 Tomcat文件的目录结构 2.启动流程 启动一个Tomcat服务是执行的bin目录下的脚本程序,startup.bat和 startup.sh.一个是windows的脚本,一个是Linux下的脚本,同样还可以看到两个停止的脚本 shutdown.ba…

64从零开始学Java之关于日期时间的新特性

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中,壹哥给大家讲解了Java里的格式化问题,这样我们就可以个性化设…

网络套接字编程

1.基础预备知识 1.1源ip和目的ip 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址 源IP地址表示发起通信的设备的IP地址。它是数据包的出发点,标识了数据包的来源。当一个设备发送数据包到网络上的其他设备时,该数据包的源IP字段会被…

WSL2的安装与配置(创建Anaconda虚拟环境、更新软件包、安装PyTorch、VSCode)

1. WSL2 安装 以管理员身份打开 PowerShell(“开始”菜单 >“PowerShell” >单击右键 >“以管理员身份运行”),然后输入以下命令: dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /a…

Maven学习

Maven介绍 Maven是Apache的一个开源项目,主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。 Maven可以让团队能够更科学的构建项目,我们可以用配置文件的方式,对项目的名称、描述、项目版本号、项目依赖等信息进行描述…

中文编程开发语言编程实际案例:程序控制灯电路以及桌球台球室用这个程序计时计费

中文编程开发语言编程实际案例:程序控制灯电路以及桌球台球室用这个程序计时计费 上图为:程序控制的硬件设备电路图 上图为:程序控制灯的开关软件截图,适用范围比如:台球厅桌球室的计时计费管理,计时的时候…

RedHat8升级GLIBC_2.29,解决ImportError: /lib64/libm.so.6: version `GLIBC_2.29

问题背景 在做大模型微调训练时,执行python脚本时出现如下报错: 查看当前服务器版本,确实没有GLIBC_2.29的 strings /lib64/libm.so.6 | grep GLIBC_ GLIBC_2.2.5 GLIBC_2.4 GLIBC_2.15 GLIBC_2.18 GLIBC_2.23 GLIBC_2.24 GLIBC_2.25 GLIB…

MySQL的优化利器:索引条件下推,千万数据下性能提升273%

MySQL的优化利器:索引条件下推,千万数据下性能提升273%🚀 前言 上个阶段,我们聊过MySQL中字段类型的选择,感叹不同类型在千万数据下的性能差异 时间类型:MySQL字段的时间类型该如何选择?千万…

[Go版]算法通关村第十八关青铜——透析回溯的模版

目录 认识回溯思想回溯的代码框架从 N 叉树说起有的问题暴力搜索也不行回溯 递归 局部枚举 放下前任Go代码【LeetCode-77. 组合】回溯热身-再论二叉树的路径问题题目:二叉树的所有路径Go 代码 题目:路径总和 IIGo 代码 回溯是最重要的算法思想之一&am…

【Jenkins 安装】

一:安装文件夹准备 在/home/admin 界面下新建三个文件夹,用来安装tomcat、maven 1.打开,/home/admin目录 cd /home/admin 2.新建三个文件夹 mkdir tomcat mkdir maven 二:安装tomcat 1.打开tomcat目录进行tomcat的安装 访问:h…

LSKA(大可分离核注意力):重新思考CNN大核注意力设计

文章目录 摘要1、简介2、相关工作3、方法4、实验5、消融研究6、与最先进方法的比较7、ViTs和CNNs的鲁棒性评估基准比较8、结论 摘要 https://arxiv.org/pdf/2309.01439.pdf 大型可分离核注意力(LSKA)模块的视觉注意力网络(VAN)已…

SpringDoc API文档工具集成SpringBoot - Swagger3

1、引言 之前在Spring Boot项目中一直使用的是SpringFox提供的Swagger库,发现已经超过3年没出新版本了!SpringDoc是一款可以结合Spring Boot使用的API文档生成工具,基于OpenAPI 3,是一款更好用的Swagger库!值得一提的是…