嵌入式系统 第十一讲 Android操作系统(增加)

news2025/1/3 8:52:24

• 11.1 Android 操作系统介绍

• Android 是 Google 公司于2007 年11月发布的一款非常优秀的智能移 动平台操作系统。到2011 年第一季度Android 在全球的市场份额首 次超过Nokia的Symbian系统,跃居全球第一。

• Android系统最初由AndyRubin等人于2003年10月创建。Google于 2005 年8月17日收购Android并组建OHA(OpenHandsetAlliance, 开放手机联盟)开发改良 Android,之后逐渐扩展到平板电脑及其他 移动平台领域上。

• Android 系统是一个基于 Apache License(Apache 许可证)GPL (GNU General Public License,GNU 通用公共许可证)软件许可的开 源手机操作系统,底层由 Linux 操作系统作为内核,我们可以直接从 Android 的官方网站上下载最新的Android源码和相关开发工具包:

– 面向开发者的Android网址:https://developer.android.google.cn/

– Android开源项目网址:http://source.android.com

• 11.2 Android 软件架构介绍

• Android 的软件架构采用了分层结构,如下图所示,由上至下分别为:Applications 应 用层Application Framework 应用框架层Android Runtime & Libraries 运行时库和本 地库层Linux Kernel 内核层

 ① Applications 应用层:用户安装应用程序系统自带应用程序层,主要用来与用户进行 交互,如Home 指Android 手机的桌面,Phone 指电话应用,用来拨打电话等。

② Application Framework 应用框架层:系统框架层,封装了大量应用程序所使用的类, 从而达到组件重用的目的,它主要向上层应用层提供API,如:ActivityManager主要 用于管理所有的Activity、画面导航、回退等生命周期相关的操作,PackageManager 主要用来管理程序安装包的安装、更新、删除等操作。

③ Android Runtime & Libraries 运行时库和本地库层:Runtime 是 Android 的运行环境,在 该层有DalvikVirtualMachine(Android 的虚拟机简称 DVM)的实现,在DVM 中运行着 Java 的核心语言库代码和Java 程序。同时,在DVM 运行期间要调用系统库代码,如: 负责显示的SurfaceManager 本地代码,负责多媒体处理相关的MediaFrameworks代码 及C 库libc等。

④ Linux Kernel 内核层:Android 系统是基于Linux 系统的,所以Android 底层系统相关的 框架和标准的Linux 内核没有什么很大的区别,只不过添加了几个Android 系统运行 必备的驱动,如:BinderIPC进程间通信驱动、PowerManager电源管理驱动等。

• 总结:Android 的软件架构是我们学习Android 开发必须要掌握的知识点,它对我们将 来编写Android 应用程序、理解Android 框架代码、编写本地代码、修改底层驱动都有 重要的指导意义,可谓是学习Android 的灵魂。

• 11.3 Android 内核

• 内核(Kernel)是Android系统最核心的部分,其主要作用在于与计算机 硬件进行交互,实现对硬件的编程控制和接口操作。内核的主要功能包 括:内存管理进程间通信进程调度虚拟文件系统、网络等功能。 和标准的Linux 内核一样,Android 内核主要实现内存管理、进程间通信 及进程调度等功能。Android 对Linux 内核的更改较少,但增加了一些没 有加入标准内核的内容,例如:yaffs文件系统

• Android 内核结构和标准Linux 4.1.15 内核基本上相同,为了适应嵌入式 硬件环境和移动应用程序的开发,Android 在其基础上,增加了私有内 容。

• Android 在标准Linux 内核中增加的内容是一些驱动程序,这些驱动主要 分为两种类型:

        ① Android 专用驱动

        ② Android 使用的设备驱动

Android 专用驱动

– Android 专用驱动和组件并非Linux 标准的内容,它们实际上是纯软件的 内容和体系结构,与硬件平台无关。Android 专用驱动类似于Linux 内存 设备驱动程序。随着Andorid内核的升级,Android 专用驱动的目录几经 变化,在较新的版本中,主要的驱动程序放在drivers/staging/android/目 录中,另外也有几个驱动程序分布在其他的目录中。

– 主要的Android 专用驱动如下:

        ① Binder:基于OpenBinder系统的驱动,为Android 平台提供IPC 支持

        ② Logger:轻量级的log 驱动

        ③ LowMemoryKiller缺少内存的情况下,杀死进程

        ④ Ashmem:匿名共享内存

        ⑤ PowerManagement(PM):电源管理模块

        ⑥ PMEM:物理内存驱动

Android 使用的设备驱动

– 作为主要为智能手机定制的操作系统,Android 通常使用Linux 中 一些标准的设备驱动程序

– Android 使用的设备驱动有:

        ① Framebuffer 显示驱动

        ② Event 输入设备驱动

        ③ ASLA 音频驱动

         ④ WLAN 驱动

        ⑤ 蓝牙驱动等。

• Android 内核目录结构

– Android 内核结构和标准Linux 4.1.15 内核基本上相同,IMX6 综合嵌入式 教学科研平台(实验箱)运行的Android 内核版本位于 /Android/myandroid/kernel_imx,其源码目录结构如图:

 • arch:与体系结构相关的代码全部放在这里,我们的实验设备中使用的是其中的arm 目录。

Documentation:这里存放着内核的所有开发文档,其中的文件会随版本的演变发生变化, 通过阅读这里的文件是获得内核最新的开发资料的最好的地方。

• drivers:此目录包括所有的驱动程序,下面又建立了多个目录,分别存放各个分类的驱动程 序源代码。drivers 目录是内核中最大的源代码存放处,大约占整个内核的一多半。其中我们 经常会用到的目录有:

        – drivers/char字符设备是drivers 目录中最为常用,也许是最为重要的目录,因为其中包含了大量与 驱动程序无关的代码。通用的tty层在这里实现,console.c定义了linux终端类型vt.c中定义了虚拟 控制台lp.c中实现了一个通用的并口打印机的驱动,并保持设备无关性kerboard.c实现高级键盘 处理,它导出handle_scancode 函数,以便于其他与平台相关的键盘驱动使用。

        – driver/block:其中存放所有的块设备驱动程序,也保存了一些设备无关的代码。如nbd.c实现了网络 块设备loop.c实现了回环块设备

        – drives/ide:专门存放针对IDE 设备的驱动。

        – drivers/scsi:存放SCSI 设备的驱动程序,当前的cd 刻录机扫描仪U 盘等设备都依赖这个SCSI 的 通用设备。

        – drivers/staging:Android 专用驱动程序大部分存放在这个目录中。

        – drivers/net:存放网络接口适配器的驱动程序,还包括一些线路规程的实现,但不实现实际的通信协 议,这部分在顶层目录的net 目录中实现。

        – drivers/video:这里保存了所有的帧缓冲区视频设备的驱动程序,整个目录实现了一个单独的字符设 备驱动。/dev/graphics/fb/fb 设备的入口点在fbmem.c文件中,该文件注册主设备号并维护一个此设 备的清单,其中记录了哪一个帧缓冲区设备负责哪个次设备号

        – drivers/media:这里存放的代码主要是针对无线电和视频输入设备,比如目前流行的usb摄像头。

• fs:此目录下包括了大量的文件系统的源代码,其中在嵌入式开发中要使用的包括:devfs、cramfs、ext2、 jffs2、romfs、yaffs、vfat、nfs、proc 等。 文件系统是Linux 中非常重要的子系统,这里实现了许多重要的 系统调用;用于文件访问的系统调用在open.c、read_write.c等文件中定义,select.c实现了select 和poll 系统调用,pipe.c和fifo.c 实现了管道和命名管道,mkdir、rmdir、rename、link、symlink、mknod 等系统 调用在namei.c中实现。文件系统的挂装和卸载和用于临时根文件系统的initrd在super.c中实现。 Devices.c 中实现了字符设备和块设备驱动程序的注册函数;file.c、inode.c实现了管理文件和索引节点内部 数据结构的组织。Ioctl.c实现ioctl系统调用。

• include:内核所有头文件存放的地方,其中Linux 目录是头文件最多的地方,也是驱动程序经常要包含的 目录。

• init:Linux 的main.c 程序,通过这个比较简单的程序,我们可以理解Linux 的启动流程

• ipc:systemV的进程间通信的原理实现,包括信号量、共享内存

• kernel:这个目录下存放的是除网络、文件系统、内存管理之外的所有其他基础设施,其中至少包括进程调 度sched.c进程建立fork.c定时器的管理timer.c,中断处理,信号处理等。

• lib:包括一些通用支持函数,类似于标准C 的库函数。其中包括了最重要的vsprintf函数的实现,它是 printk 和 sprintf 函数的核心。还有将字符串转换为长整形数的simple_atol函数。

• mm:包含实现内存管理的代码,包括所有与内存管理相关的数据结构,我们在驱动中需要使用的kmalloc 和kfree 函数在slab.c 中实现,mmap定义在mmap.c中的do_mmap_pgoff函数。将文件映射到内存的实现 在filemap.c 中,mprotect 在mprotect.c,remap 在 remap.c 中实现;vmscan.c中实现了kswapd内核线程。

• net:包含了套接字抽象和网络协议的实现,每一种协议都建立了一个目录,但是其中的core、bridge、 ethernet、 sunrpc、khttpd 不是网络协议。我们使用最多的是ipv4、ipv6、802、ipx等。

• scripts:这个目录存放许多脚本,主要用于配置内核

• 11.4 Android 子系统介绍

• Android 是一个庞大的手机的系统,它不仅仅实现了手机的基本的打 电话,发信息的功能,还实现了更复杂的多媒体处理、2D 和3D 游戏 处理、信息感知处理等。

• Android 的子系统主要包含:

         ① Android RIL 子系统:Radio Interface Layer(简称:RIL子系统,即:无 线电接口层子系统)用于管理用户的电话、短信、数据通信等相关功 能,它是每个移动通信设备必备的系统。

        ② Android Input 子系统:Input 输入子系统用来处理所有来自己用户的输 入数据,如:触摸屏,声音控制物理按键等。

        ③ Android GUI 子系统:GUI 即:图形用户接口子系统,也就是所谓的图 形界面,它用来负责显示系统图形化界面,形象让用户和系统操作及 信息进行交互。Android 的GUI 系统和其它各子系统关系密切相关,是 Android 中最重要的子系统之一,如:绘制一个2D 图形、通过 OpenGL 库处理3D 游戏、通过SurfaceFlinger(Android 中图形混合器, 用于将屏幕上显示的多个图形进行混合显示)来重叠几个图形界面。

        ④ Android Audio 子系统:Android 的音频处理子系统,主要用于音频方 面的数据流传输和控制功能,也负责音频设备的管理。Android 的 Audio 系统和多媒体处理紧密相连,如:视频的音频处理和播放、电话 通信及录音等。

        ⑤ Android Media 子系统:Android 的多媒体子系统,它是Android 系统 中最庞大的子系统,与硬件编解码OpenCore多媒体框架Android 多媒体框架等相关,如:音频播放器,视频播放器,Camera 摄像预览 等。

        ⑥ Android Connectivity 子系统:Android 连接子系统是智能设备的重要组 成部分,它除了一般所谓的网络连接,如:以太网、WIFI 外,还包含: 蓝牙连接、GPS 定位连接、NFC 等。

        ⑦ Android Sensor 子系统:Android 的传感器子系统为当前智能设备大大 提高了交互性,它在创新应用程序和应用体验里发挥了重要作用,传 感器子系统和手机的硬件设备紧密相关,如:gyroscope 陀螺仪、 accelerometer 加速度计、proximity 距离感应器、magnetic 磁力传感器 等。

• 11.5 Android 应用程序开发过程

• Android 应用程序开发是基于Android 架构提供的API 类库编 写程序,这些应用程序是完全的Java 代码程序,它们构建在 Android 系统提供的API 之上

• Android 开发方式:开发Android 应用程序可以基于Google 提 供的Android SDK 开发工具包,也可以直接在Android 源码中进 行编写。

        ① Android SDK 开发:它提供给程序员一种最快捷的开发方式,基于IDE 开发环境(Android Studio)和SDK 套件(Android SDK),快速开发出 标准的Android 应用程序,但是,对于一些要修改框架代码或基于自 定义API 的高级开发,这种方式难以胜任。

        ② Android 源码开发:基于Android 提供的源码进行开发,可以最大体现 出开源的优势,让用户自定义个性的Android 系统,开发出更高效、 更与众不同的应用程序,这种方式更适合于系统级开发,对程序员要 求比较高。

API:Application Programming Interface,应用程序接口

SDK:Software Development Kit,软件开发工具包

IDE:Integrated Development Environment,集成开发环境

• Android 源码开发过程:

        ① 搭建开发环境:根据两种开发方式的不同,搭建开发环境略有不同。 如果侧重于系统底层源码开发,则采用第二种开发方式(Android 源码 开发);如果侧重于应用软件开发,则采用第一种开发方式(Android SDK 开发)。

        ② 下载Android 源码:得益于Android 的开源特点,Android 源码中包含 大量宝贵的技术知识,我们可以在阅读源码过程中更深入的了解 Android 系统的奥秘,为我们编写更高效、更有特点的应用程序打下基 础,同时能展现给读者一个更庞大系统的设计蓝图,为系统设计师及 项目经理提供参考价值。同时,Android 的源码中提供的应用程序示例、 设计模式、软件架构,为我们编写大型应用程序提供经验。

        ③ 编译Android 源码:通过编译Android 源码,生成我们开发环境及目 标系统,为我们做系统底层开发、系统定制与优化做准备,通过分析 编译过程,让我们学习到大型工程的代码管理与编译原理。

        ④ 配置开发环境:为了更有效的开发,我们通常会对开发环境做配置, 不同的程序员可能会有不同的编程习惯。

• 11.6 Android 源码目录结构

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Three.js 字体

在 Three.js 中,我们可以通过 FontLoader 加载字体,并结合 TextGeometry 创建 3D 文本。加载字体是因为字体文件包含了字体的几何信息,例如字体的形状、大小、粗细等,而 TextGeometry 则是根据字体信息生成 3D 文本的几何体。 在…

机器人C++开源库The Robotics Library (RL)使用手册(三)

进入VS工程,我们先看看这些功能函数及其依赖库的分布关系: rl命名空间下,主要有八大模块。 搞定VS后将逐个拆解。 1、编译运行 根据报错提示,配置相应错误的库(根据每个人安装位置不同而不同,我的路径如下:) 编译所有,Release版本耗时大约10分钟。 以rlPlan运动…

【GUI-PyQt5】简介

1. 简介 GUI:带图形的用户接口程序,也就是桌面应用。 2. 分类 2.1 基本窗口控件 QMainWindowQwidgetQlabelQLineEdit菜单工具栏 2.2 高级组件 QTableViewQListView容器多线程 2.3 布局管理 QBoxLayoutQGridLayoutQFormLayout嵌套布局 2.4 信号与…

Mysql学习笔记之SQL-4

这篇文章开始介绍SQL语句的最后一个部分,DCL(Data Control Language)数据库控制语言。 1.简介 DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访 问权限。 这一部分比较简单,主…

Chrome被360导航篡改了怎么改回来?

一、Chrome被360导航篡改了怎么改回来? 查看是否被360主页锁定,地址栏输入chrome://version,看命令行end后面(蓝色部分),是否有https://hao.360.com/?srclm&lsn31c42a959f 修改步骤 第一步&#xff1a…

STM32-笔记18-呼吸灯

1、实验目的 使用定时器 4 通道 3 生成 PWM 波控制 LED1 ,实现呼吸灯效果。 频率:2kHz,PSC71,ARR499 利用定时器溢出公式 周期等于频率的倒数。故Tout 1/2KHZ;Ft 72MHZ PSC71(喜欢设置成Ft的倍数&…

内部类(2)

大家还,今天我们继续来学习内部类的知识,今天我们来看看其余几种内部类类型,那么话不多说 我们直接开始。 注:它是一个static的一个常量 一旦初始化就不能够进行修改了. 注:1.一般情况下我们定义常量的时候,会定成大写的: 2.a不…

Go Energy 跨平台框架 v2.5.1 发布

Energy 框架 是Go语言基于CEF 和 LCL 开发的跨平台 GUI 框架, 具体丰富的系统原生 UI 控件集, 丰富的 CEF 功能 API,简化且不失功能的 CEF 功能 API 使用。 特性? 特性描述跨平台支持 Windows, macOS, Linux简单Go语言的简单特性,使用简单…

欧科云链OKLink:比特币与以太坊“双重启动”将如何撬动市场?

近日,OKLink 与 137Labs 联合举办 X Space,围绕宏观经济环境、政策及机构投资的影响等话题,分享如何把握 Web3 中的潜在机会与辨别风险。OKG Research 首席研究员 Hedy、BuilderRocket Accelerator 研究合伙人 Vivienna、VC 分析员 Bunny、BU…

探索仓颉编程语言:功能、实战与展望

目录 引言 一.使用体验 二.功能剖析 1.丰富的数据类型与控制结构 2.强大的编程范式支持 3.标准库与模块系统 4.并发编程能力 三.实战案例 1.项目背景与目标 2.具体实现步骤 (1).导入必要的模块 (2).发送 HTTP 请求获取网页内容 (3).解析 HTML 页面提取文章信息 (…

JavaFX FXML模式下的布局

常见布局方式概述 在 JavaFX FXML 模式下,有多种布局方式可供选择。这些布局方式可以帮助您有效地组织和排列 UI 组件,以创建出美观且功能良好的用户界面。常用布局容器及布局方式 BorderPane 布局 特点:BorderPane 将空间划分为五个区域&…

OpenFeign介绍以及使用

介绍 OpenFeign 是一个声明式的 Web 服务客户端,用于简化在 Java 应用中调用 HTTP API 的过程,在 Spring Cloud 体系里被广泛应用,它有以下关键特性: 声明式调用:基于注解,开发人员只需定义接口并添加注解…

李永乐线性代数:A可逆,AX=B相关推论和例题解题思路

例题1: 思路讲解: 这个 (A-2E)可逆,所以有P(A-2E) E, 也就是(A-2E)的逆矩阵是P; 那么PA (A-2E)的逆 * A B P(A-2E,A)(E,B) 所以就可以直接求出B,也就是(A-2E)的逆 * A 例题2: 思路讲解:…

【Compose multiplatform教程18】多平台资源的设置和配置

要正确配置项目以使用多平台资源,请执行以下操作: 添加库依赖项。 为每种资源创建必要的目录。 为限定资源创建其他目录(例如,深色 UI 主题或本地化字符串的不同图像)。 依赖项和目录设置 要访问多平台项目中的资源…

Doris的SQL原理解析

今天来介绍下Doris的SQL原理解析,主要从语法、解析、分析、执行等几个方面来介绍,可以帮助大家对Doris底层有个清晰的理解~ 一、Doris简介 Apache Doris是一个基于MPP架构的高性能、实时的分析型数据库,能够较好的满足报表分析、即席查询、…

Excel for Finance 07 `FV PV` 函数

Excel 的 FV 函数用于计算一笔投资在未来的价值,基于固定的利率和定期付款。这是一个金融函数,常用来分析储蓄计划、贷款、或投资的增长。 语法: FV(rate, nper, pmt, [pv], [type])参数说明: rate(必需)&…

【运维】部署Gitea

部署Gitea Gitea文档 系统:Ubuntu 20.04.6 LTS 步骤: 准备数据库 使用内置 SQLite,无需额外准备。 下载安装 下载最新版本的 Gitea 并安装: wget -O gitea https://dl.gitea.com/gitea/version/gitea-version-linux-amd64 chm…

Redis KEYS查询大批量数据替代方案(推荐SCAN 命令)

文章目录 前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)3. 使用哈希(Hash)4. 使用 Redis 模块(如 RediSearch) 总结 前言 在使用 Redis 时,KEYS 命令虽然简单直接…

Apache Doris 创始人:何为“现代化”的数据仓库?

在 12 月 14 日的 Doris Summit Asia 2024 上,Apache Doris 创始人 & PMC 成员马如悦在开场演讲中,围绕“现代化数据仓库”这一主题,指出 3.0 版本是 Apache Doris 研发路程中的重要里程碑,他将这一进展总结为“实时之路”、“…

3. 指针、数组

目录 一、指针和数组 🍐 数组名指向首地址 🍊 例子 二、数组作为函数参数 🍋 数组名作为函数参数,为什么必须传递数组大小? 三、指针和字符数组 🍌怎么样存储一个string? &#x1f349…