当前位置: 首页 > news >正文

Android 系统架构

目录

Android 系统架构

1.  Android 应用层

2.  Android应用框架层

2.1  Activity Manager (活动管理器)

2.2  Window Manager (窗口管理器)

2.3   Content Provider (内容提供器)

2.4  View System(视图系统)

2.5  Notification Manager(通告管理器)

2.6  Package Manager (包管理器)

2.7  Telephony Manager(电话管理器)

2.8  Resource Manager (资源管理器)

2.9   Location Manager (位置管理器)

2.10  GTalk Service

3.  Android 核心库

3.1  Surface Manager

3.2  Media Framework

3.3  SQLite

3.4  OpenGL|ES

3.5  FreeType

3.6  WebKit

3.7  SGL

3.8  SSL

3.9  Libc

4.  Android运行时(Run Time)

4.1  什么是 Dalvik

4.2  什么是ART

4.3  Dalvik 与 ART 的区别

5.  Linux内核层


Android 系统架构

        Android 是在 Linux内核的基础上,使用一种可称为“软件层级”的架构组织起来的。“软件层级”架构是指它含有多个层次,而每层都是由多个软件模块或软件库组成。Android的架构共有四层,如图 1-1 所示。

        纵观整个Android系统架构,各种开源的软件包和各种主流的编程语言全部都有“用武之地”,从下到上,一同构建出了一款移动操作系统。从编程语言的角度来看,如图 1-1 中所示,所有红色部分都是C语言写的:所有绿色部分都是由C++为主,而辅之以C写成的有用的本地库:所有蓝色部分则都是 Java 语言写成的。从开发者的角度来看,如果我们只是开发一般的应用程序,则只需要使用 Java 语言在应用层做开发即可。如果要开发一些个人或公司自用的框架,则同样使用Java在前两层进行开发即可。如果要做 Android系统级开发,则需要深入本地库和Java运行时环境层,使用C++和C进行开发。如果需要开发Android的驱动程序,则需要从Linux内核层开始开发。

图1-1 Android系统架构示意图

1.  Android 应用层

应用层是Android设备真正与用户进行交互的一层, Android设备上的应用程序都是运行在这一层的。其中包括Google开发的应用软件,比如电话、短信、电子邮件、浏览器等,也包括一般开发者所开发的应用软件。这一层使用Java作为其开发语言。

2.  Android应用框架层

        框架层是我们从事 Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的。该层简化了组件的重用,开发人员可以直接使用其提供的组件来进行快速的应用程序开发,也可以通过继承而实现个性化的拓展。由于在其下已经运行了Java运行时环境,所以这一层使用Java语言作为开发语言。Android应用框架层主要包含如下内容。

2.1  Activity Manager (活动管理器)

管理各个应用程序生命周期以及通常的导航回退功能。

2.2  Window Manager (窗口管理器)

管理所有的窗口程序。

2.3   Content Provider (内容提供器)

使得不同应用程序之间存取或者分享数据。

2.4  View System(视图系统)

构建应用程序的基木组件.

2.5  Notification Manager(通告管理器)

使得应用程序可以在状态栏中显示自定义的提示信息。

2.6  Package Manager (包管理器)

Android 系统内的程序管理。

2.7  Telephony Manager(电话管理器)

管理所有的移动设备功能。

2.8  Resource Manager (资源管理器)

提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等。

2.9   Location Manager (位置管理器)

提供位置服务。

2.10  GTalk Service

提供Google Talk服务。

3.  Android 核心库

        本地库是应用程序框架的基础,是连接应用程序框架层与Linux内核层的重要纽带。主要含有以下几个重要的库。

3.1  Surface Manager

        执行多个应用程序时候,负责管理显示与存取操作问的互动,另外也负责2D绘图与3D绘图进行显示合成。

3.2  Media Framework

        多媒体库,基于PacketVideo OpenCore,支持多种常用的音频、视频格式录制和回放,编码格式包括MPEG4、MP3、H.264、AAC、 ARM.

3.3  SQLite

小型的关系型数据库引擎。

3.4  OpenGL|ES

根据OpenGL ES 1.0 API 标准实现的3D绘图函数库。

3.5  FreeType

提供点阵字与向量字的描绘与显示。

3.6  WebKit

一套网页浏览器的软件引擎。

3.7  SGL

底层的 2D 图形渲染引擎。

3.8  SSL

在Android上通信过程中实现握手。

3.9  Libc

从BSD继承来的标准C 系统函数库,专门为基于嵌入式Linux 的设备定制。

4.  Android运行时(Run Time)

        Android 应用程序是用 Java 语言编写的,所以 Android 需要一个 Java 的运行时环境,该环境又包括核心库和Dalvik虚拟机两部分。

        核心库提供了Java语言API中的大多数功能,同时也包含了Android的一些核心API,如 android.os、android.net、 android.media等等。

        Android 程序不同于J2ME 程序。每个 Android 应用程序都有一个专有的进程,并且不是多个程序运行在一个虚拟机中,而是每个Android程序都有一个Dalivik虚拟机的实例,并在该实例中执行。Dalvik虚拟机不是传统的基于栈的虚拟机,而是一种基于寄存器的Java虚拟机,并进行了内存资源使用的优化以及支持多个虚拟机的特点。需要注意的是,个同于J2ME,Android 程序在虚拟机中执行的并非编译后的字节码,而是通过转换工具 dx 将 Java字节码转成 dex 格式的中间码。

注:ART 和Dalvik 的联系和区别:

4.1  什么是 Dalvik

        Dalvik 是 Google 公司自己设计用于 Android 平台的 Java 虚拟机。dex 格式是专为 Dalvik应用设计的一种压缩格式,适合于内存和处理器速度有限的系统。Dalvik允许同时运行多个虚拟机的实例,并且每一个应用作为独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

4.2  什么是ART

        在 Dalvik 下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这一机制并不高效,但让应用安装比较快,而且更容易在不同硬件和架构上运行。ART完全改变了这种做法,在应用安装时就预编译字节码到机器语言,在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。ART是在Android 4.4版本之后出现的,用于替代 Dalvik 虚拟机。

4.3  Dalvik 与 ART 的区别

(1)在 Dalvik 下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这虽然会使安装过程比较快,但是会拖慢应用以后每次启动的效率。而在 ART 环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备和应用的首次启动(安装慢了)会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。

(2)ART 占用空间比 Dalvik 大(字节码变为机器码之后,可能会增加 10%-20%),这也是著名的“空间换时间大法”。

(3)预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了CPU的使用频率,降低了能耗。

5.  Linux内核层

        Android是在Linux内核的基础上构建的, Android的内核属于Linux内核的一个分支,它并不是GNU/Linux,因为一般在GNU/Linux中被支持的功能,在Android大多没有被支持。众所周知,Linux 是一个开源的操作系统,由非营利的组织——Linux 基金会所管理。虽然Linux是开源的,但是Android必须在GNU GPL (用于保护开源软件的一个授权规范)的许可下使用Linux的源码,才可以商用。所以为了达到商业应用的目的,Android必须去除被GNU GPL所约束的部分。Android去除了Cairo、 X11、 Alsa、 FFmpeg、 GTK、 Pango和Glibe等,并以Bionic取代Glibe,以Skia取代Cairo,以Opencore取代FFmpeg等。Android 并没有用户空间驱动,而是将所有的驱动都放在内核空间中,并以 HAL 隔开版权问题。

        目前, Android的Linux内核层包括安全管理、内存管理、进程管理、网络协议栈、驱动程序模型和电源管理等,这些都依赖于Linux内核。由于Linux内核全部使用C语言编写,所以Android的Linux内核层也全部是用C语言编写的。

相关文章:

Android 系统架构

目录 Android 系统架构 1. Android 应用层 2. Android应用框架层 2.1 Activity Manager (活动管理器) 2.2 Window Manager (窗口管理器) 2.3 Content Provider (内容提供器) 2.4 View System(视图系统&a…...

【Docker】Python Flask + Redis 练习

一、构建flask镜像 1.准备文件 创建app.py,内容如下 from flask import Flask from redis import Redis app Flask(__name__) redis Redis(hostos.environ.get(REDIS_HOST,127.0.0.1),port6379)app.route(/) def hello():redis.incr(hits)return f"Hello Container W…...

shell_52.Linux测试与其他网络主机的连通性脚本

实战演练 本节将展示一个实用脚本,该脚本在处理用户输入的同时,使用 ping 命令或 ping6 命令来测试与其他网络主机的连通性。 ping 命令或 ping6 命令可以快速测试网络主机是否可用。这个命令很有用,经常作为首选工具。如果只是检查单个主机&…...

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示...

Python操作MySQL基础使用

Python操作MySQL基础使用 链接数据库并查询数据 import pymysql# 链接数据库 conn pymysql.connect(host10.5.6.250,port3306,userroot,password******** )# 查看MySQL版本信息 print(conn.get_server_info()) # 5.5.27# 获取到游标对象 cursor conn.cursor()# 选择数据库…...

【pytorch】pytorch中的高级索引

这里只介绍pytorch的高级索引,是一些奇怪的切片索引 基本版 a[[0, 2], [1, 2]] 等价 a[0, 1] 和 a[2, 2],相当于索引张量的第一行的第二列和第三行的第三列元素; a[[1, 0, 2], [0]] 等价 a[1, 0] 和 a[0, 0] 和 a[2, 0],相当于索…...

基于图像识别的自动驾驶汽车障碍物检测与避障算法研究

基于图像识别的自动驾驶汽车障碍物检测与避障算法研究是一个涉及计算机视觉、机器学习、人工智能和自动控制等多个领域的复杂问题。以下是对这个问题的研究内容和方向的一些概述。 障碍物检测 障碍物检测是自动驾驶汽车避障算法的核心部分,它需要从车辆的感知数据…...

Spring boot定时任务

目录 前言一、使用 Scheduled 注解二、使用 ScheduledExecutorService三、使用 Spring 的 TaskScheduler四、使用第三方调度框架 前言 在 Spring Boot 中,有多种方法来编写定时任务,以执行周期性或延迟执行的任务。下面是几种常见的方式 一、使用 Sche…...

Glide原理

本文基于Carson整理 1.简介 相比其他几种图片加载框架,Glide性能最好。这得益于其高效的图片缓存策略 其还有多样化的媒体格式加载:如GIF、Video,对于商城首页需展示丰富样式、信息的页面需求来说,也是必不可少的。 2.加载原理…...

wps表格按分隔符拆分单元格

有数据如下;看选中区域,一个单元格中有一个v,空格,然后有三个数值,以空格分开;点击菜单中的数据-分列; 弹出分列向导;选择 分隔符号; 选择分隔符为空格;出现预…...

【SEC 学习】Vim 的基本使用

一、Vim 编辑器安装 yum install -y vim二、Vim 三种模式 命令模式 编辑模式 末行模式 三、三种模式之间的转换 1. 命令模式 -> 编辑模式 快捷键含义i从光标处插入I从光标所在行首插入a从光标后插入A从光标所在行末插入o从光标下一行插入O从光标上一行插入 2. 命令模式 …...

Linux中shell脚本练习

目录 1.猜数字 2.批量创建用户 3.监控网卡Receive Transmit 数据的变化 4.部署Linux 5.系统性能检测脚本 6.分区脚本 7.数据库脚本 1.猜数字 随机数的生成 使用环境变量RANDOM,范围是0~32767 编写guest.sh,实现以下功能&#xff1…...

AS/400简介

AS400 AS400 简介AS/400操作系统演示 AS400 简介 在 AS400 中,AS代表“应用系统”。它是多用户、多任务和非常安全的系统,因此用于需要同时存储和处理敏感数据的行业。它最适合中级行业,因此用于制药行业、银行、商场、医院管理、制造业、分销…...

FreeRTOS 中断管理介绍和实操

目录 中断定义 中断优先级 相关注意 中断相关函数 1.队列 2.信号量 3.事件标志组 4.任务通知 5.软件定时器 中断管理实操 中断定义 中断是指在程序执行的过程中,突然发生了某种事件,需要立即停止当前正在执行的程序,并转而处理这个…...

性能测试 —— Jmeter 常用三种定时器!

1、同步定时器 位置:HTTP请求->定时器->Synchronizing Timer 当需要进行大量用户的并发测试时,为了让用户能真正的同时执行,添加同步定时器,用户阻塞线程,知道线程数达到预先配置的数值,才开始执行…...

ROS自学笔记十七:Arbotix

ArbotiX 是一个基于 ROS(Robot Operating System)的机器人控制系统,它旨在为小型机器人提供硬件控制和传感器接口,以便于机器人的运动和感知。以下是有关 ROS 中 ArbotiX 的简介和安装步骤: ArbotiX 简介 ArbotiX 主…...

Mac电脑窗口管理Magnet中文 for mac

Magnet是一款Mac窗口管理工具,它可以帮助用户轻松管理打开的窗口,提高多任务处理效率。以下是Magnet的一些主要特点和功能: 分屏模式支持:Magnet支持多种分屏模式,包括左/右/顶部/底部 1/2 分屏、左/中/右 1/3 分屏、…...

Centos7 部署 Stable Diffusion

参考:https://www.jianshu.com/p/ff81bb76158a 遇到的问题: 1、git clone 比较慢 解决办法:设置代理 https://blog.csdn.net/dszgf5717/article/details/130735389 2、pip install 比较慢 解决办法:更换源或设置代理 https:/…...

【Python】一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格

题目要求:一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格 例:(为了方便观看,以 ▢ 代替空格) 输入:123▢▢abc▢▢▢python 输出:123▢abc▢python 参考…...

嵌入式项目电灯

1、原理,电灯有个正负极,当正确接入电源正负极就能点亮(如正极5v,负极0v),单两边同时接入正极,就不会亮(两端都是5v),所以通过控制电平,来实现控制led等的亮暗 cpu通过给…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...