AVD(Android虚拟设备)是一种模拟器配置,可在开发者的计算机上模拟真实的Android设备。每个AVD包含所选的操作系统版本(系统映像)、设备类型(手机、平板电脑、Wear OS)、屏幕尺寸和内存容量。根据Google Android Developers, 2026,AVD用于在不同版本和配置的Android上测试应用程序,而无需购买数十台物理设备。QEMU是模拟器运行的管理程序。
要点
AVD(Android虚拟设备)是一种描述虚拟Android设备的软件配置。与物理手机不同,AVD不需要硬件——它通过基于QEMU的Android模拟器在计算机上运行。开发者根据需要创建任意数量的AVD进行测试:针对不同的Android版本、屏幕尺寸、内存容量和像素密度。
每个AVD都绑定到特定的SDK平台。这意味着要创建带有Android 14(API级别34)的AVD,需要先通过SDK管理器安装该版本的系统映像。系统映像是操作系统的映像,包含所有系统应用程序、Google服务(如果选择了Google APIs映像)和运行时组件。Google建议使用带有Google Play服务的Google APIs映像,以获得与真实设备的最大兼容性。
AVD在开发中不可或缺,原因如下。首先,它允许在不同Android版本上测试应用程序而无需购买数十台设备。其次,AVD支持快照——保存系统状态,从而加快启动速度。第三,模拟器与Android Studio集成:APK安装、调试和日志记录的工作方式与物理设备相同。
AVD支持多种设备类型:手机(Phone)、平板电脑(Tablet)、手表(Wear OS)、电视(Android TV)和汽车系统(Android Automotive)。对于每种类型,AVD管理器都提供Google的现成配置文件:Pixel 8、Pixel 9 Pro、Nexus 7、Samsung Galaxy Tab等。设备配置文件决定屏幕尺寸、分辨率、像素密度(dpi)和导航方式(手势或按钮)。
| 设备类型 | 示例配置文件 | 分辨率 | dpi |
|---|---|---|---|
| Phone | Pixel 8 | 1080x2400 | 420 |
| Phone | Pixel 9 Pro | 1280x2856 | 490 |
| Tablet | Pixel Tablet | 2560x1600 | 320 |
| Wear OS | Pixel Watch | 384x384 | 320 |
| Android TV | Android TV 4K | 1920x1080 | 240 |
每个AVD都是一组配置文件和映像。主要配置文件是config.ini,它存储虚拟设备的参数:名称、类型、API级别、屏幕尺寸、RAM和VM堆大小。该文件位于$HOME/.android/avd/AVDName.avd/目录中,可以手动修改,但通常通过AVD管理器进行编辑。
除了config.ini,AVD目录中还存储了:userdata.img(用户数据映像——应用程序、设置、文件)、system.img(对已安装SDK平台系统映像的引用)、cache.img(缓存)和sdcard.img(SD卡映像)。执行擦除数据操作时,userdata.img被删除并创建新的空映像。快照保存在AVD目录内的单独snapshots/文件夹中。
系统映像与AVD分开下载——一个映像可以被多个虚拟设备使用。系统映像存储在Android SDK目录中:$ANDROID_SDK/system-images/android-{API}/{type}/{arch}/。映像类型:google_apis(带Google服务)、google_apis_playstore(带Google Play商店)和default(不带Google服务的纯AOSP)。
| 映像类型 | Google服务 | Google Play | 用途 |
|---|---|---|---|
| AOSP(默认) | 无 | 无 | 基础测试,纯Android |
| Google APIs | 有 | 无 | 测试Google服务、Maps、FCM |
| Google Play | 有 | 有 | 带Play商店和许可的完整测试 |
AVD管理器是Android Studio中用于创建和管理虚拟设备的图形工具。可以通过Tools→Device Manager菜单或工具栏图标打开。AVD管理器显示已创建设备的列表、它们的状态(运行中/已停止)、Android版本以及可用的操作(启动、停止、擦除数据、编辑)。
要创建新的AVD,请点击Create device按钮。从现成的配置文件列表中选择设备配置文件——Google为所有流行设备提供配置文件。选择配置文件后,指定系统映像:Android版本和映像类型。对于新项目,选择带有Google APIs映像的最新稳定版本。然后配置AVD名称、屏幕方向、RAM和VM堆大小。创建后,AVD即可启动。
# 可用系统映像列表
sdkmanager --list | grep system-images
# 使用Google APIs安装API 35的系统映像
sdkmanager "system-images;android-35;google_apis;x86_64"
# 创建名为pixel8_api35的AVD
avdmanager create avd -n pixel8_api35 \
-k "system-images;android-35;google_apis;x86_64" \
-d pixel_8
# 启动创建的AVD
emulator -avd pixel8_api35 -gpu host -memory 2048
# 所有AVD列表
avdmanager list avd
AVD管理器允许详细配置虚拟设备的硬件特性。主要参数:RAM(随机存取存储器,建议值2048–4096 MB)、VM堆(虚拟机堆大小,256–512 MB)、内部存储(内部存储空间,2–8 GB)和SD卡(虚拟SD卡)。这些参数影响应用程序的性能及其在内存不足时的行为。
其他设置包括:摄像头(模拟或连接主机网络摄像头)、传感器(加速度计、陀螺仪)、NFC、蓝牙和电池。例如,对于具有位置检测功能的应用程序测试,可以通过模拟器的控制按钮或ADB模拟设备旋转。传感器模拟允许测试在物理设备上难以重现的场景。
| 参数 | 描述 | 建议值 |
|---|---|---|
| hw.ramSize | 设备的内存 | 2048 |
| vm.heapSize | 虚拟机堆大小 | 256 |
| hw.gpuEnabled | 图形硬件加速 | yes |
| hw.gpuMode | GPU模式(host/mesa) | host |
| disk.dataPartition.size | 数据分区大小 | 4096M |
| hw.camera | 摄像头模拟类型 | emulated |
AVD的运行速度直接取决于硬件虚拟化。在Windows上使用Windows Hypervisor Platform(WHPX),在macOS上使用Hypervisor.Framework,在Linux上使用KVM。如果虚拟化被禁用,AVD将以纯软件模拟模式运行,速度慢10–20倍。要检查虚拟化是否启用,请使用-accel-check标志启动模拟器。
第二个关键因素是系统映像架构的选择。在配备Intel和AMD处理器的计算机上,x86_64映像的运行速度明显快于arm64-v8a,因为它们不需要动态翻译ARM指令。对于使用Intel处理器的Windows和macOS开发,始终使用x86_64映像。在配备ARM处理器的Mac(Apple Silicon)上,使用本机arm64-v8a映像。
# 使用硬件虚拟化和GPU加速启动
emulator -avd pixel8_api35 -gpu host -memory 4096 -cores 4
# 检查虚拟化支持
emulator -accel-check
# 无图形界面启动(用于CI)
emulator -avd pixel8_api35 -no-window -no-audio -gpu off
# 使用快照快速启动
emulator -avd pixel8_api35 -snapshot mysnapshot -no-snapshot-save
为了获得最大的AVD性能:为模拟器分配至少2–4 GB RAM,启用GPU Host(使用计算机的显卡进行渲染),关闭声音(-no-audio标志),如果不需要的话,并使用快照快速恢复到干净状态。快照保存完整的系统状态——从快照启动只需2–5秒,而不是完全加载的30–60秒。
还建议将AVD存储在SSD硬盘上——系统加载和APK安装时的I/O操作将显著加速。要同时运行多个AVD,请增加计算机的总RAM量,并对不可变的模拟器使用-read-only标志。
无需Android Studio即可从命令行完全控制AVD。avdmanager和emulator工具是Android SDK的一部分,可执行所有操作:创建、删除、启动和配置AVD。命令行在没有图形界面的CI/CD流水线以及测试自动化中特别有用。
# 使用自定义参数创建AVD
avdmanager create avd -n test_device \
-k "system-images;android-34;google_apis;x86_64" \
--device "pixel_8" \
--force
# 删除AVD
avdmanager delete avd -n test_device
# 克隆AVD(通过复制文件)
cp -r ~/.android/avd/pixel8_api35.avd ~/.android/avd/pixel8_clone.avd
# 重置AVD数据
emulator -avd test_device -wipe-data
# 在运行的AVD上安装APK
adb -s emulator-5554 install app-release.apk
启动AVD后,可以通过ADB(Android调试桥)像物理设备一样与其交互。ADB允许安装应用程序、运行intent、模拟事件(通话、短信、GPS)、截取屏幕截图和录制屏幕视频。这使得AVD成为自动化测试的完整环境。
# 已连接设备列表(包括AVD)
adb devices
# 模拟来电
adb emu gsm call +15551234567
# 模拟GPS坐标
adb emu geo fix -122.084 37.422
# 截取屏幕截图
adb exec-out screencap -p > screenshot.png
# 发送短信
adb emu sms send +15551234567 "Hello from AVD"
有时开发者需要在代码中确定应用程序是在模拟器还是物理设备上运行。这可能需要用于关闭分析(以避免污染生产数据)、启用扩展日志记录或关闭在模拟器上无法运行的硬件相关功能。Google通过Build类和系统属性提供了标准的检测方法。
object EmulatorDetector {
fun isEmulator(): Boolean {
return (Build.BRAND.startsWith("generic") &&
Build.DEVICE.startsWith("generic")) ||
Build.FINGERPRINT.startsWith("generic") ||
Build.FINGERPRINT.startsWith("unknown") ||
Build.HARDWARE.contains("goldfish") ||
Build.HARDWARE.contains("ranchu") ||
Build.MODEL.contains("google_sdk") ||
Build.MODEL.contains("Emulator") ||
Build.MODEL.contains("Android SDK")
}
}
// 使用
if (EmulatorDetector.isEmulator()) {
Log.d("App", "Running on emulator — enable debug mode")
}
附加方法——通过Build.getRadioVersion()读取系统属性并检查ro.kernel.qemu。在模拟器上,radio version返回null,qemu属性设置为1。此方法在较旧版本的Android上更可靠,因为在这些版本上Build.FINGERPRINT可能被设备制造商修改。
fun isRunningOnEmulator(): Boolean {
// 通过radio version检查——模拟器上始终为null
val radioVersion = try {
Build.getRadioVersion()
} catch (e: Exception) {
null
}
if (radioVersion.isNullOrBlank()) return true
// 通过系统属性检查
return try {
val props = ProcessBuilder()
.command("getprop", "ro.kernel.qemu")
.start()
.inputStream.bufferedReader().readText().trim()
props == "1"
} catch (e: Exception) {
false
}
}
常见问题
AVD在QEMU上运行,无法完全模拟硬件特性:真实摄像头、NFC、蓝牙。AVD非常适合UI测试、生命周期检查和操作系统版本兼容性测试。要精确测试摄像头和传感器,需要物理设备。
至少2–3个AVD:最新的API级别用于检查新功能,最低支持的(minSdk)用于兼容性测试,以及一个流行的设备型号(Pixel 8或Samsung Galaxy)用于特定屏幕的UI测试。
主要原因:硬件虚拟化被禁用(WHPX、Hypervisor.Framework、KVM),RAM不足(少于2 GB),GPU Host被禁用。启用-gpu host并将内存增加到2–4 GB——这将使模拟器加快3–5倍。
可以。模拟器通过emulator -avd AVD名称从命令行启动。这需要Android SDK、Platform-Tools和已安装的系统映像。AVD管理器也可以作为控制台工具avdmanager使用。
在AVD管理器中选择擦除数据——这将删除userdata.img并将模拟器恢复到初始状态。从命令行:emulator -avd 名称 -wipe-data。快照将被保留,除非单独删除。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。