虚拟化环境中的精简版 Android 操作系统 Microdroid
随着移动设备的普及和应用场景的多样化,安全性和隐私保护成为了移动操作系统的重要课题。Google推出的Microdroid,是一个专为虚拟化环境设计的精简版Android操作系统,旨在提供一个安全、隔离的执行环境。本文将详细介绍Microdroid的架构、功能、使用方法及其目标。
Microdroid项目介绍
Microdroid是一个极简版的Android操作系统,专为在受保护的虚拟机(pVM)中运行而设计。它基于Android的源代码构建,但去除了系统服务器、硬件抽象层(HAL)、图形用户界面(GUI)等组件,仅保留了必要的核心功能。Microdroid的目标是为需要高安全性和隔离性的应用提供一个轻量级的运行环境。
在Android虚拟化框架(AVF)中,pVM(Protected Virtual Machine,受保护的虚拟机)是一个关键概念。pVM是一种虚拟机,它在硬件和软件层面上提供了更高的安全性和隔离性,确保在虚拟机中运行的应用程序和数据不会受到外部环境的干扰或攻击。
pVM,即Protected Virtual Machine,是一种受保护的虚拟机,旨在提供一个高度隔离和安全的运行环境。与传统的虚拟机不同,pVM通过硬件支持的虚拟化技术(如ARM的TrustZone或Intel的SGX)以及软件层面的安全措施,确保虚拟机内的应用程序和数据的完整性和保密性。
功能特色
-
精简设计:
Microdroid去除了大部分不必要的组件,仅保留核心功能,使其在资源消耗和启动时间上具有显著优势。 -
高安全性:
通过在pVM中运行,Microdroid提供了一个高度隔离的环境,确保应用程序和数据的安全性和完整性。 -
支持NDK API:
Microdroid支持部分NDK API,包括用于实现libc和Bionic的所有API,方便开发者进行原生代码开发。 -
调试功能:
提供了adb、logcat、tombstone和gdb等调试工具,方便开发者进行调试和问题排查。 -
启动时验证和SELinux:
Microdroid在启动时进行验证,并使用SELinux进行安全策略管理,进一步提升系统安全性。 -
Binder RPC支持:
通过vsock支持Binder RPC,实现主机与pVM之间的高效通信。
不支持的功能
android.\*
文件包中的 Android Java API,java.\*
文件包中的 Core Java API 属于支持的功能,但需要在虚拟机中激活 ART APEX。- SystemServer 和 Zygote
- 图形/界面
- HAL
Microdroid架构
Microdroid的架构与Cuttlefish类似,包含以下分区映像,这些映像在一个复合磁盘映像中进行了分组:
bootloader
:验证并启动内核。boot.img
:包含内核和init ramdisk。vendor_boot.img
:包含虚拟机专用的内核模块,例如virtio。super.img
:包含系统和供应商逻辑分区。vbmeta.img
:包含经过验证的启动元数据。
这些分区映像整合在一个虚拟化APEX中,并通过VirtualizationService打包成一个复合磁盘映像。此外,VirtualizationService还负责创建以下分区:
payload
:由Android的APEX和APK支持的分区。instance
:用于按实例持久保留启动时验证数据的加密分区。
启动序列
Microdroid 启动序列在设备启动后触发。关于设备启动的具体内容,在架构文档的 pVM 固件部分中有详细的讨论。图 1 显示了 Microdroid 启动序列过程中的具体步骤:
以下是对这些步骤的说明:
-
crosvm 将引导加载程序加载到内存,pvmfw 开始执行。在跳转到引导加载程序之前,pvmfw 会执行两项任务:
- 验证引导加载程序,检查其是否来自可信来源(Google 或 OEM)。
- 确保同一 pVM 在使用同一实例映像进行多次启动的过程中,会始终如一地使用相同的引导加载程序。具体而言,pVM 最初会使用空白的实例映像进行启动。pvmfw 会存储该实例映像中的引导加载程序的身份信息,并对其进行加密。当 pVM 下次使用同一实例映像启动时,pvmfw 会解密已保存的该实例映像的身份信息,并验证当前的身份信息是否与先前保存的信息完全相同。如果身份信息不同,pvmfw 将拒绝启动。
引导加载程序启动 Microdroid。
-
引导加载程序访问实例磁盘。与 pvmfw 类似,引导加载程序会在一个实例磁盘中存储同一实例上次启动时使用的分区映像的相关信息,包括公钥信息。
-
引导加载程序验证 vbmeta 和链式分区(例如
boot
和super
)。如果验证成功,则会推导出下一阶段的 pVM Secret。然后,Microdroid 会将控制权移交给内核。 -
由于引导加载程序已经在第 3 步验证了 super 分区,所以内核会无条件地安装 super 分区。与完整版 Android 一样,super 分区包含了多个通过 dm-verity 安装的逻辑分区。随后,控制权将移交给
init
进程,该进程会启动各种原生服务。init.rc
脚本也与完整版 Android 中的十分相似,只不过针对 Microdroid 的需求进行了一些调整。 -
init
进程启动 Microdroid 管理器,该管理器会访问实例映像。Microdroid 管理器服务使用前一阶段传递的密钥解密映像,并读取该 pVM 信任的客户端 APK 和 APEX 的公钥及回滚计数器信息。这些信息稍后会在安装客户端 APK 和请求的 APEX 时,分别用于zipfuse
和apexd
。 -
Microdroid 管理器服务启动
apexd
。 -
apexd
在/apex/<name>
目录下安装 APEX。在 APEX 的安装方式上,Android 与 Microdroid 只有一个差别:在 Microdroid 中,APEX 文件来自虚拟块设备(例如/dev/vdc1
),而非来自常规文件 (/system/apex/*.apex
)。 -
zipfuse
是 Microdroid 的 FUSE 文件系统。zipfuse
会将客户端 APK(基本上是一个 Zip 文件)作为文件系统进行安装。在底层,pVM 会将 APK 文件作为一个虚拟块设备通过 dm-verity 进行传递,就像 APEX 一样。APK 中包含一个配置文件,其中包括了应用开发者针对该 pVM 实例请求的 APEX 的列表。在激活 APEX 时,该列表会被apexd
使用。 -
启动流程返回到 Microdroid 管理器服务。然后,管理器服务会使用 Binder RPC 与 Android 的
VirtualizationService
进行通信,以便能够报告崩溃或关闭等重要事件,并接受诸如终止 pVM 之类的请求。管理器服务还会从 APK 的配置文件中读取主二进制文件的位置,并加以执行。
文件交换 (AuthFS)
Android 组件使用文件进行输入、输出和状态记录,并将这些文件作为由 Android 内核控制访问的文件描述符(AIDL 中的 ParcelFileDescriptor
类型)进行传递,是十分常见的。AuthFS 就提供了这样的功能,以便能够跨 pVM 边界在互不信任的端点之间交换文件。
基本而言,AuthFS 是一个远程文件系统,它会对每次访问操作进行透明的完整性检查,类似于 fs-verity
。这些检查使前端(例如 pVM 中运行的文件读取程序)能够检测不受信任的后端(通常为 Android)是否包含经过篡改的文件内容。
要进行文件交换,后端 (fd\_server
) 会在通信开始时提供每个文件的配置,以表明它是输入(只读)还是输出(读写)。如果是输入,前端会强制要求相关内容与 Merkle 树顶层的已知哈希完全匹配,以实现访问时验证。如果是输出,AuthFS 会在内部将相关内容的哈希树保存为写入操作的观察结果,并在回读数据时强制执行完整性检查。
目前,底层传输是基于 Binder RPC 进行的。但是为了优化性能,此机制今后可能会有所变化。
密钥管理
pVM 具有一个稳定的密封密钥和一个认证密钥,前者非常适合用于受保护的持久性数据,后者非常适合用于生成由 pVM 验证生成的签名。
Binder RPC
大多数 Android 接口都用 AIDL 表示,而 AIDL 是基于 Binder Linux 内核驱动程序构建的。为了在 pVM 之间提供接口支持,Binder 协议经过重写,以便能够通过套接字使用(对于 pVM,该套接字为 vsock)。通过这种方式,Android 现有的 AIDL 接口就能在 pVM 这个新环境中使用。
要设置连接,终端(例如 pVM 载荷)需要创建一个 RpcServer
对象、注册一个 root 对象,并进入监听新连接的状态。要连接到该服务器,客户端需要使用 RpcSession
对象并获取 Binder
对象,然后像在 Binder 内核驱动程序中使用 Binder
对象一样使用该对象。
Microdroid的目标
Microdroid的主要目标是提供一个安全、隔离的运行环境,以比常规Android环境更高的机密性和完整性运行应用的某一部分。
- Microdroid的目标之一是支持在各种设备上运行,类似于云游戏串流的方式,用户可以在云端运行应用,并将其串流到本地设备上使用。
- Microdroid利用Linux KVM(Kernel-based Virtual Machine)虚拟化技术,可以在虚拟机中运行,提供高效的虚拟化支持,使得Microdroid可以在不同的硬件平台上运行。
通过在pVM中运行,Microdroid能够有效地隔离应用程序和数据,防止数据泄露和未授权访问。
总结
Microdroid作为一个精简版的Android操作系统,通过在受保护的虚拟机(pVM)中运行,为需要高安全性和隔离性的应用提供了一个轻量级的运行环境。通过本文的介绍和示例代码,希望能够帮助开发者更好地理解和使用Microdroid,开发出更加安全和稳定的应用程序。
相关文章:

虚拟化环境中的精简版 Android 操作系统 Microdroid
随着移动设备的普及和应用场景的多样化,安全性和隐私保护成为了移动操作系统的重要课题。Google推出的Microdroid,是一个专为虚拟化环境设计的精简版Android操作系统,旨在提供一个安全、隔离的执行环境。本文将详细介绍Microdroid的架构、功能…...

NFTScan Site:以蓝标认证与高级项目管理功能赋能 NFT 项目
自 NFTScan Site 上线以来,它迅速成为 NFT 市场中的一支重要力量,凭借对各类 NFT 集合、市场以及 NFTfi 项目的认证获得了广泛认可。这个平台帮助许多项目提升了曝光度和可见性,为它们在竞争激烈的 NFT 市场中创造了更大的成功机会。 在最新更…...

Vue:模板 MVVM
Vue:模板 & MVVM 模板插值语法指令语法 MVVMdefineProperty数据代理 模板 Vue实例绑定一个容器,想要向容器中填入动态的值,就需要使用模板语法。模板语法分为插值语法和指令语法。 插值语法 插值语法很简单,使用{{}}包含一…...

Kafka 消息丢失如何处理?
今天给大家分享一个在面试中经常遇到的问题:Kafka 消息丢失该如何处理? 这个问题啊,看似简单,其实里面藏着很多“套路”。 来,咱们先讲一个面试的“真实”案例。 面试官问:“Kafka 消息丢失如何处理&#x…...

Mysql报错注入之floor报错详解
updatexml extractvalue floor 是mysql的函数 groupbyrandfloorcount 一、简述 利用 select count(),(floor(rand(0)2))x from table group by x,导致数据库报错,通过 concat 函数,连接注入语句与 floor(rand(0)*2)函数,实现将…...

EPS原理笔记
EPS UE(user equipment),移动用户设备 LTE(Long Term Evolution),无线接入网部分,E-UTRAN EPC(system Architecture Evolution、Evoloed Packet Core),核心网部分,主要包括MME、S-GW、P-GW、HSS,连接Intern…...

LeetCode 876. 链表的中间结点
题目描述: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点࿰…...

划界与分类的艺术:支持向量机(SVM)的深度解析
划界与分类的艺术:支持向量机(SVM)的深度解析 1. 引言 支持向量机(Support Vector Machine, SVM)是机器学习中的经典算法,以其强大的分类和回归能力在众多领域得到了广泛应用。SVM通过找到最优超平面来分…...
题目:100条经典C语言笔试题目(1-5)
题目: 1、请填写 bool , float, 指针变量 与“零值”比较的if 语句。 提示:这里“零值”可以是 0, 0.0 , FALSE 或者“空指针” 。例如 int 变量 n 与“零值”比较的 if 语句为: (1)请写出bool flag 与“零值”比较…...
python代码编写规范及注意事项
目录 1. 注意1.1 变量与常量解释:建议的修复: 1.2 Too many arguments 和 Too many local variables解决方案1. 减少参数数量2. 减少局部变量数量3. 调整 Pylint 配置 总结 1. 注意 1.1 变量与常量 解读下面的pylint问题 C0103: Constant name “file_p…...

【Linux】命令行参数 | 环境变量
🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 前几天在搞硬件&…...

python 使用进程池并发执行 SQL 语句
这段代码使用了 Python 的 multiprocessing 模块来实现真正的并行处理,绕过 Python 的全局解释器锁(GIL)限制,从而在多核 CPU 上并发执行多个 SQL 语句。 from pyhive import hive import multiprocessing# 建立连接 conn hive.…...

我也谈AI
“随着人工智能技术的不断发展,我们已经看到了它在各行业带来的巨大变革。在医疗行业中,人工智能技术正在被应用于病例诊断、药物研发等方面,为医学研究和临床治疗提供了新的思路和方法;在企业中,人工智能技术可以通过…...

算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
大佬们好呀,这一次讲解的是二叉树的深度搜索,大佬们请阅 1.前言 ⼆叉树中的深搜(介绍) 深度优先遍历(DFS,全称为DepthFirstTraversal),是我们树或者图这样的数据结构中常⽤的⼀种…...

编写第一个 Appium 测试脚本:从安装到运行!
前言 最近接到一个测试项目,简单描述一下,需求就是:一端发送指令,另一端接受指令并处理指令。大概看了看有上百条指令,点点点岂不是废了,而且后期迭代,每次都需要点点点,想想就头大…...

mysql查表相关练习
作业要求: 单表练习: 1 . 查询出部门编号为 D2019060011 的所有员工 2 . 所有财务总监的姓名、编号和部门编号。 3 . 找出奖金高于工资的员工。 4 . 找出奖金高于工资 40% 的员工。 5 找出部门编号为 D2019090011 中所有财务总监,和…...

airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告
一:主要内容 框架功能、框架架构及测试报告效果 airtest安装、环境搭建 框架搭建、框架运行说明 框架源码 二:框架功能及测试报告效果 1. 框架功能: 该框架笔者用来作为公司的项目的前端自动化,支持pc和app,本文…...

Prometheus套装部署到K8S+Dashboard部署详解
1、添加helm源并更新 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update2、创建namespace kubectl create namespace monitoring 3、安装Prometheus监控套装 helm install prometheus prometheus-community/prome…...
python使用pymysql
为了封装这个数据库操作为一个通用方法,我们可以创建一个函数,该函数接受数据库连接参数(如主机名、用户名、密码、数据库名)、SQL语句以及必要的参数(用于参数化查询)。下面是一个简单的封装示例ÿ…...
Vue3 + TypeScript 组件和文件命名规范及 setup 导入顺序规范
前言 在 Vue3 项目中,合理的文件命名规范和导入顺序不仅有助于提高代码的可读性,还能增强团队协作的效率。特别是在使用 TypeScript 和 Composition API 的项目中,清晰的组件和文件结构尤为重要。本文将详细介绍 Vue3 TypeScript 项目中的组…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...