[Android] Android架构体系(2)

文章目录

  • Bionic
    • 精简对系统调用的支持:
    • 不支持 System V IPC:
    • 有限的 Pthread 功能:
    • 有限支持C++:
    • 不再支持本地化和/或宽字符:
    • Bionic新增的特性
      • 系统属性
      • 硬编码写死的UID/GID
      • 内置了DNS解析
      • 硬编码写死的服务和协议
  • 硬件抽象层
  • Linux内核
    • 匿名共享内存(ASHMem)
    • Binder
    • Logger
    • ION 内存管理
    • 内存不足时的进程终止器
    • RAM Console
    • Sync driver
    • 定时输出和 GPIO
    • wakelock
  • 参考

[Android] Android架构体系(1)

Bionic

抛开合法性问题不提,相对于GLibC,Bionic 也可以算是非常轻量级的了,而且对于Android所要达成的目标,Bionic 也更为有效。Bionic 中去掉的下列这些特性的原因或是认为没有必要或是认为太过复杂。

精简对系统调用的支持:

由于系统用是使用得非常频繁的,所以 Boinic 想要通过尽量减少对它们的封装的方式,降低因使用系统调用而引起的开销。系统调用的 stub 函数是在bionic/libc/SYSCALLS.TXT 的帮助下自动生成的,甚至有些系统调用都不会被导出。

不支持 System V IPC:

在 Boinic 没有导出的系统调用中,有一部分是用来处理UNIX System V 进程间通信(IPC,Inter-Process-Communication)和共享内存的。这是由于 Android 的设计使然,去掉这种形式的 IPC,而改用Android自己的IPC。

有限的 Pthread 功能:

一方面,Bionic 本身就支持 Pthread (即不需要一个单独的libpthread.so)。

但是另一方面,Bionic 对 Pthread 的支持也不是很全面,不少特性已经不再支持了,其中最值得注意的就是现在已经不能使用的pthread cancel()这个用来杀线程的函数了。

对 mutex 的支持也被阉割掉了,取而代之的是更为高效的内核快速 mutex(futex(2)系统调用),此外较为高级的IPC对象(比如rwlocks)也已经不复存在了。

有限支持C++:

尽管确实是支持 C++的(而且事实上Android 的大多数代码也是用C++写的),但是异常处理已经不支持了。与之类似,STL (Standard Template Library,标准模板库)也已经不再包含在其中了一一尽管也不是严格地不让使用 STL,不过得要手工添加一些代码才行(部分代码可以在external/stlport 项目中找到)。

不再支持本地化和/或宽字符:

Bionic 原生只需要ASCII–尽管通过 libutils.so还是可以使用Unicode的。

去掉这些东西还是很有道理的,特别是考虑到 Android 中大部分代码是跑在虚拟机里的,而使用虚拟机本身就意味着不需要 App
的开发者使用这些功能。 例如,虚拟机有自己的线程管理和 Unicode 支持 (通过ICU)。不过,去掉这些特性还是会给原生代码的开发者带来一些麻烦,特别是那些想要把一些库从 Linux 移植到 Androd 上来的程序员。

Bionic新增的特性

Bionic 也在标准 LibC 中新增了一些特性,这些都是为 Android 而特别优化的,这些新增的特性包括:

系统属性

系统属性是 Android 特有的特性,它支持系统或应用在一个简明的由“键/值”构成的存储空间中记录各种配置和操作参数。它类似于 Java 中“属性”的概念(而且事实上它是可以通过 Java 的 System.properties 访问的)。Android 极度依赖于这一机制,系统属性是在一段共享内存中实现的,系统中的所有进程都能以只读权限访问它,但只有 imit 进程才有对它进行设置(写)的权限。

硬编码写死的UID/GID

与传统的 UNIX系统中依赖于 passwd 和 group 文件进行权限管理的方式不同,Android 中选择使用硬编码写死的id,并模拟getpwnam(3)及其相关函数的方法进行权限管理。我们只要考虑一下 Android 的安全模型,就会觉得这一做法也不无道理:

Android 中每个应用都会被分配到它自己的UID 和GID (从10000 开始),而且这些ID会被映射为方便人来阅读的格式 ,例如:app_uxXX (或者从JellyBean 版起,这一格式改为:uX_aYYY)。

此外Android 把数字较小的UID/GID (1000-9999)保留了下来,供它自己的子系统使用。

内置了DNS解析

Bionic 中整合进了“名称-IP”的DNS 解析代码(在传统 Linux中,这部分代码是放在 libresolv.so 中的)。

Bionic 中使用的代码更为安全(源端口和Query ID都是随机的,这样做能有效地防范“生日攻击”),并且引入了一个新奇的特性一一每个进程都可以有自己的 DNS 解析服务器列表。

这使得特定的应用可以通过重新设置net.dns.pid系统属性的方式,抓取 DNS 解析的结果或者重定向解析 DNS 请求的服务器。
DNS 配置本身也是存储在系统属性中的(net.dns#)。

硬编码写死的服务和协议

因为已经把原来 libresolvso 做的事都给包圆了,Android 中就去掉了传统 UNIX 系统中通常是放在/etc 目录下的 protocols 和 services 这两个文件。

硬件抽象层

Android 会运行在许多不同种类的设备上 (平板电脑、手机、机顶盒、跑步机等),底层硬件在适用范围和支持方面都有极大的不同。

为了解决这个问题,Android 定义了一个硬件抽象层(HAL,Hardware Abstraction Layer),其目标是通过定义一个转换层,使对各种不同类型硬件的操作趋于标准化。

硬件厂商可以在内核态中随心所欲地使用它们自己生产的设备的驱动程序但是必须提供一个接口库 (shim),以Android (特别是 Dalvik) 预期的方式与操作系统对接。

硬件抽象层上定义了从 Android 的角度看来,摄像头、GPS、传感器以及其他的硬件组件应该是个什么样子。

这并不会妨碍厂商扩展或修改硬件的功能,只需要厂商把接口库放到/system/lib/hw 目录里去就行了,然后 HAL(硬件抽象层)(也就是 libhardwareso) 会自动加载它们。打印某台Android设备使用的HAL接口库,例如:
在这里插入图片描述

Linux内核

Linux 内核得益于它开源和免费授权的本质,为 Android 提供了一个极为出色的基底。

尽管它现在已经和 Linus Torvalds 最初的版本差了不止十万八千里,但是 Linux 内核仍在以不可思议的速度演进着一每个月,甚至每一周都会增加新的特性。Android 所能拥有的功能在很大程度上会受到内核的影响。

较为有名的例子当数 zRAM 和对 64 位的支持。后者有助于解释为什么表Lollipop版的Android 系统会有两个最低版本,因为 Linux 内核是从3.7 版开始才支持 ARM64(AArch64)的。

谷歌在选择内核版本时也会受到一些限制,因为它只能从http://www.kernel.org 网站中选择那些被标为长期支持 (long term)的内核版本。

与其他 Linux 内核相比,Android 内核被编译得稍有差异。因为配置文件生成时同时使用了Android 的基础配置和默认内核发布版本中的建议配置模板。

如 source.android.com 网站中 kernel

前文中已经提到过,Android 在内核中引入了一些它特有的特性(Androidism)。

其中的一些被放在内核的 core 中,用条件编译语句#ifdef 加了一层保护,而剩下的则被放在了drivers/staging/android 目录中。

这些Android 特有的特性包括:

匿名共享内存(ASHMem)

这是一种允许进程间共享内存的机制。应用可以打开一个字符设备节点 (/dev/ashmem)并创建一段内存空间,然后再把它映射 (map)到进程内存中去。这需要把工作限定在非全局可写(no world-writable)的目录中,并进行 System V进程间通信。

Binder

Binder 是 Android 中所有进程间通信的关键,它源自于 BeOS。Binder 表现为一个所有进程都能够打开的字符设备节点 (/dev/binder)。

Android 中的各种服务都注册在 Binder 这里,客户端可以在 servicemanager 的帮助下连上相应的服务。Binder 提供了一个有效的高级进程间通信机制。

Logger

提供基于内核的 ring buffer,用以高速记录日志。Android 的日志并不是记录在文件中的,而是由一个字符设备节点 (/dev/log)来承载的。

Android Lollipop 版中专门为此新增了一个用户态守护进程logd。

ION 内存管理

ION 内存管理器是在冰激凌三明治版中被引入的,其功能是向内核驱动和用户态下的类似模块(通过/dev/ion) 提供高效的内存分配服务。ION 替换掉了旧的Android 特有的组件 PMEM,ION 的设计目标是为各种不同的 SoC 架构中的内存管理提供一个统一的标准。

“SoC” 是 “System on Chip” 的缩写,翻译为中文是 “芯片上的系统”。它指的是一种将计算机或电子系统的所有核心功能集成到单个芯片上的设计。一个SoC通常包括处理器核心(CPU)、内存、输入输出接口、电源管理等各种组件,使得整个系统可以在一个芯片上完成。

在移动设备、嵌入式系统和其他一些电子产品中,SoC是一种常见的设计方式,因为它可以实现更高的集成度、更小的体积和更低的功耗。不同的SoC可以针对不同的应用场景和需求进行优化。

内存不足时的进程终止器

这个组件改进自 Linux 原有的OOM(Out-Of-Memory)进程终止器一一它会在内存不足时,杀掉一些进程,以释放内存空间。

不过 Android 中的这个组件是使用启发式的方法来寻找要被杀掉的进程的,而 Linux 原有的进程终止器是以一种更具确定性的方式控制杀进程的行为的,而且还允许定义内存压力等级。Android Lollipop 版中为此专门增加了一个用户态守护进程 Imkd。

“lmkd” 是指 “Low Memory Killer Daemon”,即低内存杀手守护进程。在 Android> 系统中,lmkd 是为了改进 Linux 原有的 Out-Of-Memory (OOM) 进程终止器而引入的。

Android 的低内存杀手(lmkd)是一个用户态守护进程,其任务是在内存不足时通过启发式方法选择并终止一些进程,以释放内存空间,从而维护系统的稳定性。相比于Linux 原有的 OOM 进程终止器,Android 的低内存杀手采用了一种更灵活的方式来选择要终止的进程,并允许定义不同的内存压力等级。

该组件在 Android Lollipop版本中引入,目的是提高系统在低内存情况下的性能和稳定性。低内存杀手会根据系统的内存状态动态地选择适当的进程进行终止,以应对不同的内存压力。

RAM Console

这是一种保存内核崩溃时输出的诊断用数据(程转储和最近的日志)的机制。不过较新版本的Android 系统已经弃用了这一特性,转而采用 Linux 内核中自有的一个功能了。

Sync driver

这是最新引入的 Android 特有的特性,引入它是为了快速同步基元(primitive),它主要是用在 Android 图形栈(特别是 surfaceflinger)中的。

定时输出和 GPIO

使得用户态程序在用户态空间里就能访问 GPIO 寄存器,并在间隔一段时间之后自动设置GPIO 寄存器的值。

它的主要客户端是设备中的振动器(vibrator)功能框架(通过硬件抽象层)可以把一个数值(单位为毫秒)写入/sys/classtimedoutput/vibrator/enable 中,这样就启动了振动器,并让振动器振动了这个值规定的时间之后停下来。

什么是GPIO?
GPIO 是 General Purpose
Input/Output(通用输入/输出)的缩写,它是一种用于在计算机系统中进行数字输入和输出的通用接口。GPIO
可以通过软件配置为输入或输出,并且可以用于与外部电路、传感器、执行器等进行通信。

GPIO 寄存器是设备上的通用输入/输出寄存器,用于控制和读取与设备连接的 GPIO 引脚的状态。通过操作 GPIO
寄存器,可以实现对设备上的硬件进行控制,例如振动器。

在嵌入式系统和嵌入式软件开发中,程序可以通过设置 GPIO 寄存器的值来控制连接到系统的各种外围设备。在这种情况下,振动器的控制是通过访问
GPIO 寄存器进行的,通过设置寄存器的值来启动或停止振动器。

GPIO 提供了一种通用的、灵活的方式,使得用户态程序能够在用户态空间中直接访问设备的硬件接口,从而实现对硬件设备的控制和通信。

wakelock

最初这是一个单独的用来控制电源管理并阻止内核进入休眠状态的Android 特有的特性。不过 wakelocks 现在已经逐步被并入到内核自己的 wakeup source机制中去了。

参考

《最强Android书:架构大剖析》

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

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

相关文章

ZXing开源库生成二维码

引言 二维码(QR Code)作为一种快速、高容量、高密度的矩阵条码,已经在各行各业得到广泛应用。ZXing(Zebra Crossing)是一款由Google开源的Java二维码生成和解析库,提供了丰富的功能和易于使用的API。本篇博…

西瓜书学习笔记——Boosting(公式推导+举例应用)

文章目录 引言AdaBoost算法AdaBoost算法正确性说明AdaBoost算法如何解决权重更新问题?AdaBoost算法如何解决调整下一轮基学习器样本分布问题?AdaBoost算法总结实验分析 引言 Boosting是一种集成学习方法,旨在通过整合多个弱学习器来构建一个…

架构篇08:架构设计三原则

文章目录 合适原则简单原则演化原则小结 成为架构师是每个程序员的梦想,但并不意味着把编程做好就能够自然而然地成为一个架构师,优秀程序员和架构师之间还有一个明显的鸿沟需要跨越,这个鸿沟就是“不确定性”。 对于编程来说,本…

【Docker】在centos中安装nginx

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《【Docker】安装nginx》。🎯&#…

7+细胞焦亡+ceRNA+实验验证,如何脱离套路求创新?

导语 今天给同学们分享一篇生信文章“Dissection of pyroptosis-related prognostic signature and CASP6-mediated regulation in pancreatic adenocarcinoma: new sights to clinical decision-making”,这篇文章发表在Apoptosis期刊上,影响因子为7.2。…

【JAVA】我和我的第一个“对象”相遇

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-zAjv1fTLGQmnqncy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

安泰ATA-2082高压放大器如何驱动超声探头进行无损检测

无损检测技术是一种在不破坏或影响被检测物体性能的前提下,通过物理或化学方法对其内部或表面的缺陷进行检测的技术。在无损检测领域,超声检测是一种广泛应用的方法,而ATA-2082高压放大器则是实现高效、精确超声检测的关键设备之一。本期内容…

HTTPS基本概念

HTTP 与 HTTPS 有哪些区别? HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。HTTP 连接建立相…

CVE-2024-0738 Mldong ExpressionEngine RCE漏洞分析

漏洞描述 A vulnerability, which was classified as critical, has been found in ???? mldong 1.0. This issue affects the function ExpressionEngine of the file com/mldong/modules/wf/engine/model/DecisionModel.java. The manipulation leads to code injection…

Vue+Element(el-switch的使用)+springboot

目录 1、编写模板 2、发送请求 3、后端返数据 1.Controller类 2.interface接口(Service层接口) 3.Service(接口实现) 4.interface接口(Mapper层接口) 5.xml 6.效果 4、el-switch属性 1、编写模板 …

数字图像处理(实践篇)二十六 使用cvlib进行人脸检测、性别检测和目标检测

目录 1 安装cvlib 2 涉及的函数 3 实践 4 其他 cvlib一个简单,高级,易于使用的开源Python计算机视觉库。 1 安装cvlib # 安装依赖pip install opencv-python tensorflow# 安装cvlibpip install cvlib</

iLO 安装中文固件包

前言 安装中文版本的安装包&#xff0c;需要把对应的ilo安装到固定的版本上&#xff0c;ilo的版本是2.70。必须是这个版本&#xff1b; 如果不是这个版本就需要刷到对应的ilo版本 下载对应的固件包。 到这个界面选择文件&#xff0c;然后点击上载。 以上就是刷系统包的步骤。 …

MATLAB 和 Octave 之间的区别

MATLAB 和 Octave 之间的区别 MATLAB 和 Octave 有一些区别&#xff0c;但大多数都是相同的。你可以说 Octave 是 MATLAB 的免费版本&#xff0c;语法几乎与 MATLAB 相同。但是 MATLAB 比 Octave 具有更多功能&#xff0c;就像具有 Simulink 一样&#xff0c;后者用于开发和分…

前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法

文章目录 一、vue实现导出excel1、前端实现1、安装xlsx依赖2、引入3、方法4、使用4.1、将一个二维数组转成sheet4.2、将一个对象数组转成sheet4.3、合并单元格4.4、一次导出多个sheet 5、支持的文件格式 2、后端实现 二、导出文件损坏1、前端请求导出接口&#xff0c;增加返回类…

宝塔FTP文件传输服务结合cpolar内网穿透实现远程连接本地服务

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固…

C++ 20 Module

头文件包含一直是C/C的传统&#xff0c;它使代码声明与实现分离&#xff0c;但它有一个非常大的问题就是会被重复编译&#xff0c;拖累编译速度。 通常一个标准头文件iostream展开后可能达几十万甚至上百万行。笔者使用下面的示例进行测试&#xff0c;新建一个main.cc&#xf…

C++:迭代器失效问题

目录 1.vector迭代器失效问题 1.底层空间改变 ​编辑 2.指定位置元素的删除操作 2.Linux下的迭代器失效检测 1.扩容 2.删除 3.解决方法 1.vector迭代器失效问题 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是…

前端使用css去除input框的默认样式

关键点&#xff1a; /* 关键点&#xff0c;让输入框无边框 */outline:none; border:none; 1.效果图 2.html <div class"container"><input type"text" placeholder"请输入用户名"><input type"text" placeholder&q…

springboot+mysql校园社团信息管理系统-计算机毕业设计源码62756

目 录 摘要 第1章 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 第2章 相关技术 ....... 2.1开发技术 2.2 Java简介 2.3 MVVM模式 2.4 B/S结构 2.5 MySQL数据库 2.6 SpringBoot框架介绍 第3章 系统分析 6 3.1 可行性分析 6 3.2 系统流程分析 6 3.3 …

详解华为铁三角工作法完全解密.ppt

华为铁三角工作法是华为“以客户为中心”的思想在客户界面的集中体现。是一种以客户经理、方案经理和交付经理为核心的销售方法&#xff0c;将为客户服务所需要的主要能力&#xff0c;一直延伸到客户界面&#xff0c;并统一运作。 华为铁三角工作法的核心&#xff1a; - 让听…