[Android] Android架构体系(2)

news2024/12/26 3:27:03

文章目录

  • Bionic
    • 精简对系统调用的支持:
    • 不支持 System V IPC:
    • 有限的 Pthread 功能:
    • 有限支持C++:
    • 不再支持本地化和/或宽字符:
    • Bionic新增的特性
      • 系统属性
      • 硬编码写死的UID/GID
      • 内置了DNS解析
      • 硬编码写死的服务和协议
  • 硬件抽象层
  • Linux内核
    • 匿名共享内存(ASHMem)
    • Binder-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)的目录中,并进行 SystemV进程间通信。

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 构中的内存管理提供一个统一的标准。

内存不足时的进程终止器

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

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

RAM Console

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

Sync driver

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

定时输出和 GPIO

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

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

wakelock

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

参考

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

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

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

相关文章

找不到满意的机器视觉工程师工作,想找到满意的工作很难,人太多了,只能先就业后择业

找不到满意的机器视觉工程师工作,想找到满意的工作很难,人太多了,只能先就业后择业

ICCV2023 | PTUnifier+:通过Soft Prompts(软提示)统一医学视觉语言预训练

论文标题:Towards Unifying Medical Vision-and-Language Pre-training via Soft Prompts 代码:https://github.com/zhjohnchan/ptunifier Fusion-encoder type和Dual-encoder type。前者在多模态任务中具有优势,因为模态之间有充分的相互…

Docker(二)安装指南

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! 安装 Docker Docker 分为 stable test 和 nightly 三个更新频道。 官方网站上有各种环境下的 安装指南,这里主要介绍 Docker 在…

Vue学习笔记9--vuex(专门在Vue中实现集中式状态(数据)管理的一个Vue插件)

一、vuex是什么? 概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于…

LeetCode、2462. 雇佣 K 位工人的总代价【中等,最小堆+双指针】

文章目录 前言LeetCode、2462. 雇佣 K 位工人的总代价【中等,最小堆双指针】题目及类型思路及代码实现 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后…

rust获取本地外网ip地址的方法

大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info的使用。 get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址&a…

【踩坑日志】SpringBoot读取nacos配置信息并提取信息中的IP地址(配置属性解析异常+排错记录)

缘起 :项目需读取nacos中动态的TDengine数据库连接信息并提取IP,一个并不复杂的操作,但作为一个nacos知识浅薄的菜鸡,我愣是捯饬了几个小时……惭愧惭愧…… 异常代码 Data Component public class TaosLink { // Value("…

在PyCharm中创建Flask项目

在 PyCharm 中创建 Flask 项目的步骤如下: 打开 PyCharm,并选择 "Create New Project"(新建项目)。在弹出的窗口中,选择左侧的 "Python" 选项,然后选择右侧的 "Flask" 项目…

【JavaEE】_网络通信原理

目录 1. 网络发展史 2. 网络通信基础 1.1 IP地址 1.2 端口号 1.3 协议 1.3.1 概念 1.3.2 五元组 1.4 协议分层 1.4.1 协议分层的优点 1.4.2 协议分层的分类 1.4.3网络设备所在分层 1.4.4 两台主机通过TCP/IP协议通讯过程 1.5 封装与分用 1.5.1 封装 1.5.2 分用…

【EI会议征稿通知】第四届工业制造与结构材料国际学术会议(IMSM 2024)

第四届工业制造与结构材料国际学术会议(IMSM 2024) 2024 4th International Conference on Industrial Manufacturing and Structural Materials(IMSM 2024) 第四届工业制造与结构材料国际学术会议(IMSM 2024&#x…

TypeScript依赖注入框架Typedi的使用、原理、源码解读

简介 typedi是一个基于TS的装饰器和reflect-metadata的依赖注入轻量级框架,使用简单易懂,方便拓展。 使用typedi的前提是安装reflect-metadata,并在项目的入口文件的第一行中声明import ‘reflect-metadata’,这样就会在原生的R…

【图解数据结构】深度解析时间复杂度与空间复杂度的典型问题

🌈个人主页:聆风吟 🔥系列专栏:图解数据结构、算法模板 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️上期回顾二. ⛳️常见时间复杂度计算举例1️⃣实例一2️⃣实例二3️⃣实例三4️⃣实例四5…

Stability AI发布全新代码模型Stable Code 3B

Stable Code 3B: Coding on the Edge 要点: Stable Code 3B 是一个包含 30 亿个参数的大型语言模型 (LLM),可实现准确且响应灵敏的代码补全,其水平与大 2.5 倍的 CodeLLaMA 7b 等模型相当。即使在 MacBook Air 等普通笔记本电脑上没有 GPU&…

4D毫米波雷达——RADIal数据集、格式、可视化 CVPR2022

前言 本文介绍RADIal数据集,来着CVPR2022的。 它是一个收集了 2 小时车辆行驶数据的数据集,采集场景包括:城市街道、高速公路和乡村道路。采集设备包括:摄像头、激光雷达和高清雷达等,并且还包括了车辆的 GPS 位置和…

【Docker】contos7安装 Nacos容器部署单个部署集群

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Docker】contos7安装 Nacos容器部署单个&…

基于springboot+vue的社区团购系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

安卓Android studio读写EM4305卡源码

本示例使用的发卡器&#xff1a; https://item.taobao.com/item.htm?id718720660087&spma1z10.5-c.w4002-21818769070.15.57dc6f89txUhXE <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xml…

蓝桥杯备赛 day 2 —— 二分算法(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 二分的概念 &#x1f4c1; 整数二分 &#x1f4c1; 二分的模板 &#x1f4c1; 习题 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文章主要是准备蓝桥杯竞赛同学所写&#xff0c;为你更好准备蓝桥杯比赛涉及…

【音视频原理】图像相关概念 ② ( 帧率 | 常见帧率标准 | 码率 | 码率单位 )

文章目录 一、帧率1、帧率简介2、常见帧率标准3、帧率 刷新率 二、码率1、码率简介2、码率单位 一、帧率 1、帧率简介 帧率 Frame Rate , 帧 指的是 是 画面帧 , 帧率 是 画面帧 的 速率 ; 帧率 的 单位是 FPS , Frames Per Second , 是 每秒钟 的 画面帧 个数 ; 帧率 是 动画…

弗洛伊德循环查找算法-原理

本文灵感来自哔哩哔哩视频 视频链接: 弗洛伊德循环查找算法 算法代码(java) package rain;class ListNode {int value;ListNode next;public ListNode(int value) {this.value value;this.next null;}Overridepublic String toString() {return "ListNode{" &q…