基于 Android Emulator 的图形化管理器:多开实例、真机档案伪装、网络/号码/短信模拟、Root,界面按市面模拟器(BlueStacks / MuMu / LDPlayer)的布局重做。
下载:AndroidVM-Setup-1.0.0.exe(安装版) · AndroidVM-Portable-1.0.0.exe(便携版)
界面参考 MuMu 模拟器的布局:左侧图标栏 + 设备卡片网格。
- 卡片网格:每张卡显示序号、运行状态、Android 版本、核数、内存、分辨率 / DPI
- 实时缩略图:运行中的设备每 10 秒抓一次真实截屏显示在卡片上
- 一键启停:卡片右下角 ▶ / ■ 直接启动或停止,无需进入详情
- 搜索与排序:按名称过滤,支持默认 / 名称 / 运行中优先三种排序
- 网格 / 列表两种视图切换
- 卡片菜单(右键或 ⋮):
| 菜单项 | 说明 |
|---|---|
| 设备设置 | 打开完整设置弹窗 |
| 磁盘清理 | 清理设备内应用缓存 |
| 重命名 | 修改设备名 |
| 复制 | 以当前设备为模板新建一个 |
| 备份与还原 | 备份 / 还原数据分区,带流式进度条;还原前会检查虚拟机是否在运行 |
| 创建桌面快捷方式 | 在桌面生成带 --instance=<id> 的快捷方式,双击直接启动该设备 |
| 删除 | 删除设备及其数据 |
左侧分区导航 + 右侧设置行,参考 MuMu 的设置面板:
性能(显卡渲染模式 / CPU 核心数 / 内存大小)· 显示(分辨率 / DPI)· 声音(输出到主机 / 麦克风)· 网络(网络场景 / 系统代理)· 机型(设备型号 / 真机身份)· 开发者选项(Root / 系统分区可写 / 后台运行)· 其他(数据分区大小 / 快照 / 日志目录)
点设备卡片进入,左侧是设备预览,右侧是快捷设置面板:
关闭窗口后程序收进系统托盘,不退出:
- 单击 / 双击托盘图标 → 显示主窗口
- 右键 → 设备列表(每台可单独启动 / 停止)、打开数据目录、打开日志目录、退出
- 托盘图标加载失败时会自动跳过托盘,关闭窗口恢复为直接退出
- 每实例独立 AVD、独立数据分区、独立端口(5554 / 5556 / …)
- 可同时运行多个实例,停止/重启/删除只作用于单个实例
- 新建实例自动克隆当前配置并分配空闲端口
- 内置 Google Play 官方真机库(54,328 台 / 3,879 个品牌)
- 一条命令写入
brand / device / model / name / manufacturer与ro.build.*,ro.build.fingerprint会一并变化 - 可选 ARM ABI 伪装:把
arm64-v8a提到 ABI 列表首位(Build.SUPPORTED_ABIS[0]), 镜像自带libndk_translation.so,ARM64 代码可真实执行
| 功能 | 状态 |
|---|---|
| 移动网络:信号/数据/语音/制式/漫游/运营商 | ✅ 完全可用 |
| 电话号码 / ICCID(双卡) | ✅ 完全可用 |
| 来电 / 短信注入 | ✅ 完全可用 |
| WiFi 开关 / 关联 / 状态(SSID·BSSID·RSSI) | ✅ 可用(无 IP,数据面依赖 netsim) |
| 蓝牙 | ❌ 底层 netsimd 无法启动,协议栈崩溃 |
- 10 种网络预设(2G/3G/4G/5G/WiFi/离线)+ 自定义带宽、延迟、丢包
- HTTP / HTTPS / SOCKS5 代理(自动把
127.0.0.1映射为10.0.2.2)
- 悬浮侧边工具栏:截屏 / 安装 APK / 返回·主页·最近 / 音量 / 旋转 / 电源
- 显示分辨率、DPI、音量、摄像头、磁盘查看
- 后置 / 前置分别配置:无、模拟画面、虚拟场景、宿主机真实摄像头
- 自动枚举电脑上的摄像头(
emulator -webcam-list+ WMI 兜底) - 屏幕区域框选:抓屏 → 拖动选区 → 裁剪存为素材(实验性,见 文档)
详见 _docs/摄像头.md。
| 镜像 | GMS | 桌面 UI | 可 root |
|---|---|---|---|
google_apis(推荐) |
✓ | ✓ | ✓ |
google_apis_playstore |
✓ | ✓ | ✗ |
google_atd |
✓ | ✗ | ✓ |
下载 AndroidVM-Setup-<ver>.exe 或 AndroidVM-Portable-<ver>.exe(约 76 MB)。
⚠️ 安装包和程序都要求管理员权限,启动时会弹 UAC 让用户点「是」。 这是因为要启动模拟器、读写 AVD 数据分区。安装版会装到C:\Program Files\AndroidVM\,数据目录在同级的AndroidVM\下。
安装包不含 Android SDK(约 5.4 GB),首次启动会自动查找 SDK; 找不到时界面顶部会出现橙色提示条,点「选择 SDK 目录」选中即可。
便携版的数据目录放在便携版 exe 所在目录的
AndroidVM\下, 不会写进临时目录(换机器时把 exe 和这个目录一起拷走即可)。
git clone <repo>
cd app
npm install
# 准备 SDK(放到项目根目录 android-sdk/)
# emulator + platform-tools + system-images;android-34;google_apis;x86_64
cd ..
start.bat最简单:让程序自己下。
首次启动若找不到 SDK,界面顶部会出现橙色提示条,点 「在线下载 SDK(约 1.9 GB)」,程序会从官方源或其镜像拉取并自动解压、校验 SHA-1,带实时进度条:
| 组件 | 下载大小 |
|---|---|
emulator |
≈ 439 MB |
platform-tools |
≈ 8 MB |
system-images;android-34;google_apis;x86_64 |
≈ 1491 MB |
| 合计 | ≈ 1.9 GB(解压后 ≈ 5.4 GB) |
- 镜像源切换 —— 可选 Google 官方或腾讯云镜像(国内快 2 倍以上),两边清单的 文件名 / 大小 / SHA-1 完全一致
- 断点续传 —— 中断后自动带
Range头续传,不用从头下;续传完照常校验 SHA-1
下载器直接解析官方仓库清单 XML,所以永远拿到最新版本,不需要 Java / sdkmanager。
也可以手动准备:
用官方 sdkmanager:
sdkmanager "emulator" "platform-tools" "system-images;android-34;google_apis;x86_64"或直接使用 Android Studio 的 SDK(程序会自动从
%LOCALAPPDATA%\Android\Sdk 找到),或设环境变量:
$env:AVM_SDK_ROOT = "D:\Android\Sdk"为什么 SDK 不打包进安装包? 5.4 GB 超过 GitHub 单文件 2 GB 限制,也不适合放进仓库。 官方源下载最快也最新。
pwsh -File _tools\build.ps1产物在 dist\:NSIS 安装程序 + 免安装便携版。
构建环境的坑位(TEMP 不可写、符号链接权限、代码签名)见
_docs/打包说明.md。
├── app/ Electron 应用
│ ├── main.js 主进程 + IPC
│ ├── preload.js 安全桥
│ ├── renderer/ 界面(HTML/CSS/JS)
│ ├── src/
│ │ ├── config.js 路径解析(源码/安装包两种形态)
│ │ ├── vm.js 虚拟机生命周期(按实例隔离)
│ │ ├── instances.js 多开实例注册表
│ │ ├── adb.js ADB 封装(AsyncLocalStorage 多目标)
│ │ ├── deviceprofile.js 真机档案引擎
│ │ ├── wifi.js / bluetooth.js / cellular.js
│ │ ├── network.js / proxy.js / phone.js / device.js
│ │ └── reapply-cli.js 独立进程补应用档案
│ └── build/ 图标、rcedit、afterPack 钩子
├── _data/ 真机库 + 预置档案
├── _docs/ 技术文档与截图
├── _tools/ 构建 / 图标 / 界面预览脚本
└── start.bat 源码模式启动
| 项目 | 原因 |
|---|---|
| 蓝牙不可用 | 模拟器蓝牙依赖 netsimd,本机启动失败(Access denied),协议栈 abort 崩溃 |
| WiFi 拿不到 IP | 数据面(DHCP/slirp)同样依赖 netsim,但 L2 关联与 SSID/RSSI 可读 |
| 虚拟机内 DNS 解析失败 | 同样因为 netsimd 起不来,Android 没把 eth0 认成默认网络,主路由表没有 default 项,ping 报 Network is unreachable |
| 摄像头图片 / 屏幕区域模式 | 模拟器 37.3.5.0 上 imagefile: 会静默回退成「模拟画面」,三种路径写法都试过;实时跟随屏幕区域需要 Windows 虚拟摄像头驱动 |
| 虚拟场景摄像头 | 需要 GPU 实时渲染 3D,-no-window 后台模式会退化成合成图案 |
| 过不了 Play Integrity 硬件证明 | 无真实 TEE;/proc/cpuinfo、ANDROID_EMU_* GLES 扩展、init.svc.qemu-* 等仍会暴露 |
| ARM 伪装会让启动变慢 | ABI 改成 arm64 优先后系统库解析变慢,引导可能从 60 秒涨到 200~470 秒 |
| 长跑测试偶发 system_server 崩溃 | 本环境模拟器稳定性有限,跑满 40+ 项操作后偶发系统服务消失 |
详见 _docs/真机档案.md、_docs/无线模拟.md、_docs/摄像头.md。
cd app
# 离线单测:SDK 下载器(含断点续传、镜像一致性)+ 摄像头纯函数,不需要模拟器
node run_unit_tests.js
# 完整 E2E:启动模拟器跑 42 项(含摄像头配置、实例注册表)
node -e "require('./run_tests').runE2E().then(n=>process.exit(n>0?1:0))"E2E 报告写到 _logs/test-report.txt。
本机跑 E2E 时,「DNS 连通性」一项必然失败——这是 netsimd 起不来导致的环境问题, 不是代码缺陷。其余项若失败会附带具体原因。
MIT



