Android Safety 系列专题【篇七:Android AVF机制】

如上邮件,google要求所有A15以上的设备都必须支持AVF,并且AOSP在A15的分区表中新增了pvmfw,并且在XTS中引入了对AVF的一些列兼容性测试。

因此本篇就是关于这一政策引起的几个问题进行解读。

一、AVF概念理解

1、什么是AVF?

|---------------------|-------------------------------------------------------------------------------------------|
| AVF | Android Virtualization Framework,Android虚拟化框架,Android 13引入的系统级框架,允许在Android设备上创建和运行隔离的虚拟机 |
| Virtual Machine | 虚拟机,通过软件模拟的完整计算机系统,拥有独立的操作系统和资源 |
| Hypervisor | 虚拟机管理器,负责创建、管理和调度虚拟机的软件层 |
| Protected VM | 受保护虚拟机,内存被硬件隔离,宿主系统无法访问,用于安全敏感场景 |
| Microdroid | AVF提供的轻量级Android虚拟机镜像,专为虚拟化场景优化 |

AVF全称Android Virtualization Framework,翻译过来就是Android虚拟化框架。那么google为什么要推行AVF呢?

  • 在引进AVF之前:
  • 在引进AVF之后:

AVF就是如上接受保护的Protected VM,因为AVF具有隔离环境的作用,因此当即使android是root的,至少VM也是安全的。

Protected VM依赖多层硬件机制实现隔离,相比传统式Non-protected VM有如下优势:

|----------|-----------------|--------------|
| 内存隔离 | 软件隔离(Stage-2页表) | 硬件隔离 + 加密 |
| Host可访问性 | ⚠️ 可以访问 | ✅ 无法访问 |
| 安全级别 | 功能隔离级别 | 安全隔离级别 |
| 性能开销 | 较低 | 较高 |
| 用途 | 兼容性测试、功能隔离 | 密钥管理、支付处理 |
| 硬件要求 | KVM即可 | 需要TEE/内存加密支持 |

2、AVF技术架构

AVF技术还是非常复杂的,设计到上下底层,这里就提供一张AI画的图:

整个架构设计到如下模块:

  • 系统Feature声明

android.software.virtualization.framework

android.hardware.virtualization.vcpu

android.hardware.virtualization.protected_vm

  • HAL接口 (AIDL)
java 复制代码
│  │  ┌─────────────────────────────────────────────────┐    │   │
│  │  │  hardware/interfaces/virtualization/             │    │   │
│  │  │  ├── IVirtualizationService.aidl                │    │   │
│  │  │  ├── IVirtualMachine.aidl                       │    │   │
│  │  │  ├── IGlobalVmCallback.aidl                     │    │   │
│  │  │  └── types.aidl (Capability枚举)                │    │   │
│  │  └─────────────────────────────────────────────────┘    │   │
  • 框架API
java 复制代码
│  │  ┌─────────────────────────────────────────────────┐    │   │
│  │  │  android.os.VirtualizationManager               │    │   │
│  │  │  • createVirtualMachine()                       │    │   │
│  │  │  • getVirtualMachine()                          │    │   │
│  │  │  • getSupportedCapabilities()                   │    │   │
│  │  │                                                 │    │   │
│  │  │  android.system.virtualmachine.VirtualMachine   │    │   │
│  │  │  • start() / stop()                             │    │   │
│  │  │  • connect()                                    │    │   │
│  │  └─────────────────────────────────────────────────┘    │   │
  • Microdroid镜像
java 复制代码
│  │  ┌─────────────────────────────────────────────────┐    │   │
│  │  │  /apex/com.android.virt/bin/microdroid          │    │   │
│  │  │  ├── microdroid.img (系统镜像)                  │    │   │
│  │  │  ├── microdroid_kernel (内核镜像)               │    │   │
│  │  │  └── microdroid_initrd.img (initrd)             │    │   │
│  │  └─────────────────────────────────────────────────┘    │   │
  • 内核配置

CONFIG_KVM=y

CONFIG_KVM_ARM_HOST=y

CONFIG_VIRTUALIZATION=y

CONFIG_VHOST_VSOCK=y

  • 设备节点
java 复制代码
│  │  ┌─────────────────────────────────────────────────┐    │   │
│  │  │  /dev/kvm          (KVM方案)                    │    │   │
│  │  │  /dev/gunyah       (Gunyah方案)                 │    │   │
│  │  │  /dev/vhost-vsock  (VM通信)                     │    │   │
│  │  └─────────────────────────────────────────────────┘    │   │

3、AVF技术总结

  • 定义:Android Virtualization Framework , Android官方虚拟化框架,让Android能创建和管理隔离虚拟机的系统级解决方案。
  • 核心价值:硬件级安全隔离 → 即使Android被攻破,敏感数据仍安全 ; 独立执行环境 → 敏感操作在隔离VM中完成 ; 统一API → 开发者无需关心底层Hypervisor差异 。
  • 技术栈: 应用API → Framework → HAL → Kernel → Hypervisor → Hardware
  • 必要条件: CPU支持虚拟化扩展(ARMv8-A EL2); 内核启用KVM/Gunyah ;实现IVirtualizationService HAL ;系统Feature声明

二、XTS案例

1、MicrodroidTestApp.VTS

问题链接:https://jira.tinno.com/browse/PAAM-1344

失败日志:arm64-v8a MicrodroidTestApp.VTS com.android.microdroid.test.MicrodroidCapabilitiesTest#avfIsRequired fail
Device doesn't support AVF

用例分析:根据关键日志Device doesn't support AVF搜索如下代码

如上代码逻辑,如果ro.board.api_level小于202404,就不需要测试这一条,跳过下一步测试,此条PASS

如果大于202404,且没有配置FEATURE_VIRTUALIZATION_FRAMEWORK就直接报Device doesnt support AVF。因此此问题原因是我们没有配置如下feature:

在packages/modules/Virtualization/build/apex/product_packages.mk文件中有如下配置:

XML 复制代码
<permissions>
       <feature name="android.software.virtualization_framework" />
</permissions>

2、MicrodroidTestApp.CTS

问题链接:https://jira.tinno.com/browse/PAAM-1817

失败日志:arm64-v8a MicrodroidTestApp.CTS com.android.microdroid.test.MicrodroidCapabilitiesTest#supportForProtectedOrNonProtectedVms fail
A device that has FEATURE_VIRTUALIZATION_FRAMEWORK must support at least one of protected or non-protected VMs

测试用例:

根据报告日志可以看出来这里的getVirtualMachineManager().getCapabilities()获取出来的结果是0,表示都不支持

如上流程逻辑链表示当前基线根本就不支持AVF。因此最后此题需要提case到高通,因为这个芯片可能就不支持,我们是升级项目,因此最后向google申请豁免。

解决方案:最后意外之喜,正好遇上高通基线升级,升级patch有如下修改

  • 声明android.software.virtualization_framework特征能力
  • 配置hypervisor支持protected VM能力

3、Google pvmfw.img

报错日志:

解决方案:如上两个问题最后解决方式在测试之前"fastboot flash pvmfw pvmfw.img"替换pvmfw镜像,由此证明此项还和pvmfw分区有关系

相关推荐
石山岭15 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
杉氧17 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
Kapaseker21 小时前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋1 天前
Android 现代架构不需要事件总线进阶篇
android
杉氧2 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏2 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧2 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄2 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭2 天前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景2 天前
Kotlin Flow操作符学习
android·kotlin