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,实现以下功能࿱…...

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通过给…...

[ubuntu系统下的文本编辑器nano,vim,gedit,文件使用,以及版本更新问题]
文本编辑器概要 在Ubuntu系统下,有许多文本编辑器可供选择,每个编辑器都有其独特的特性和用途。以下是一些常见的文本编辑器: Gedit: 这是Ubuntu默认的文本编辑器,它简单易用,适合基本的文本编辑任务。 安…...

C#WinformListView实现缺陷图片浏览器
C#&Winform&ListView实现缺陷图片浏览器 功能需求图像浏览行间距调整悬浮提示 功能需求 机器视觉检测系统中特别是缺陷检测系统,通常需要进行对已经检出的缺陷图片进行浏览查阅。主要是通过条件筛选查询出所需要的数据,进行分页再展示到界面中。…...

C- qsort()
qsort() 是 C 语言标准库中的一个函数,用于进行数组的排序。其名字“qsort”代表“快速排序”(Quick Sort),这是因为它通常使用快速排序算法进行排序,但具体实现可能因库而异。 以下是 qsort() 的详细介绍:…...

【Apache Flink】基于时间和窗口的算子-配置时间特性
文章目录 前言配置时间特性将时间特性设置为事件时间时间戳分配器周期性水位线分配器创建一个实现AssignerWithPeriodicWatermarks接口的类,目的是为了周期性生成watermark 定点水位线分配器示例 参考文档 前言 Apache Flink 它提供了多种类型的时间和窗口概念&…...

数组的优点和缺点
数组的优点和缺点: 优点: 随机访问:数组支持常量时间的随机访问,即通过索引可以直接访问元素。这使得数组在查找特定元素时非常高效。内存连续性:数组的元素在内存中是连续存储的,这可以减少缓存未命中的…...

接口返回响应,统一封装(ResponseBodyAdvice + Result)(SpringBoot)
需求 接口的返回响应,封装成统一的数据格式,再返回给前端。 依赖 对于SpringBoot项目,接口层基于 SpringWeb,也就是 SpringMVC。 <dependency><groupId>org.springframework.boot</groupId><artifactId&g…...

苹果cms模板MXone V10.7魔改版源码 全开源
苹果cms模板MXone V10.7魔改版源码 全开源 苹果cms模板MXone魔改版短视大气海报样式 安装模板教程说明: 1、将模板压缩包上传到苹果CMS程序/template下解压 2、网站模板选择mxone 模板目录填写html 3、网站模板选择好之后一定要先访问前台,然后再进…...

ArcGIS笔记13_利用ArcGIS制作岸线与水深地形数据?建立水动力模型之前的数据收集与处理?
本文目录 前言Step 1 岸线数据Step 2 水深地形数据Step 3 其他数据及资料 前言 在利用MIKE建立水动力模型(详见【MIKE水动力笔记】系列)之前,需要收集、处理和制作诸多数据和资料,主要有岸线数据、水深地形数据、开边界潮位驱动数…...

一些k8s集群操作命令
参考: 【K8S系列】Pod重启策略及重启可能原因_k8s查看pod重启原因-CSDN博客 #查看加入集群命令 kubeadm token create --print-join-command #kubeadm重置k8s kubeadm reset -f ipvsadm --clear systemctl stop kubelet rm -rf /etc/kubernetes/* reboot …...

pycharm运行R语言脚本(win10环境下安装)
文章目录 简介1. pycharm安装插件2. 安装R语言解释器2.1下载安装包2.2具体安装过程 3.编辑环境变量4 检验是否安装成功:5.安装需要的library6.pycharm中配置安装好的R语言解释器 简介 pycharm 安装 R language for Intellij R language for Intellij 是一个插件&am…...