乐于分享
好东西不私藏

这个开源工具,把 iOS 模拟器和 Android 模拟器都塞进了终端里

这个开源工具,把 iOS 模拟器和 Android 模拟器都塞进了终端里

这个开源工具,把 iOS 模拟器和 Android 模拟器都塞进了终端里

相信大家一定遇到过这个问题,你在终端里写代码,突然需要切换到另一个模拟器——比如从 Pixel 7 切到 iPhone 15。

你要做什么?

打开 Android Studio,等它加载,找到 AVD Manager,点击启动。或者打开 Xcode,找到 Simulator,选设备,等它启动。全程鼠标操作,最少要点六下,等候时间不计。

开发者每天要做这件事几十次。没有人觉得这是问题,因为一直都是这样的。

simutil 的作者 Dzung Nguyen Minh 觉得这是问题,然后用 Dart 写了一个 TUI 工具,把这件事变成了一下 Enter。


simutil 是什么

simutil 界面展示

simutil 是一个跨平台终端 UI(TUI)工具,专为 Flutter / 移动端开发者设计,用来管理和启动 iOS 模拟器、Android 模拟器,以及连接真实物理设备——全部在终端里完成,不需要打开任何 IDE。

它的定位很明确:统一管理IOS/Android模拟器


核心功能:三件事,一个工具

1. 一键启动任意设备

打开 simutil,左右两栏并排展示所有可用的 iOS 模拟器和 Android 模拟器。用方向键选中,按 Enter,设备启动。

不需要 Android Studio,不需要 Xcode,不需要鼠标。键盘全程搞定。

2. Android 启动选项

针对 Android 模拟器,simutil 提供四种启动模式:

模式
说明
Normal
正常启动,保留上次状态
Cold Boot
冷启动,完整重置系统状态
No Audio
无音频模式,安静开发
Cold Boot + No Audio
冷启动 + 无音频组合

这四种模式在 Android Studio 的 AVD Manager 里都有,但要点进去好几层才能选。simutil 直接在选设备那一步就让你选好。

3. ADB 工具内置:无线连接真机

这是 simutil 最实用的隐藏功能。对于真实 Android 物理设备,它内置了三种无线连接方式:

方式一:IP 地址直连

设备 IP + 端口 → 一键 adb connect

方式二:6 位配对码(Android 11+)

手机开启「通过配对码配对」→ 输入 6 位码 → 完成

方式三:QR 码配对(Android 11+)

终端内直接渲染 ASCII QR 码 → 手机扫一下 → 连接

最后这个细节值得单独说:simutil 依赖了 ascii_qr 这个 Dart 包,能在终端里用 ASCII 字符渲染出可以被手机扫描的二维码。整个流程不需要离开终端。


技术底座:Nocterm,Flutter 风格的 TUI 框架

simutil 的 UI 层基于 Nocterm,这是一个用于 Dart 的终端 UI 框架,语法和 Flutter Widget 高度相似。

这个选择本身就是一个有意思的技术决定:作者是 Flutter 开发者,于是用 Flutter 的思维方式在终端里构建 UI——Widget 树、声明式布局、状态管理,只是渲染目标从 GPU Canvas 变成了终端字符。

依赖清单:

dependencies:
  nocterm:
 ^0.5.1     # TUI 框架(Flutter-like 语法)
  process_run:
 ^1.3.0 # 执行 adb / xcrun 等系统命令
  ascii_qr:
 ^1.0.1    # 终端内渲染 QR 码
  mason_logger:
 ^0.3.3 # 格式化日志输出
  args:
 ^2.7.0        # 命令行参数解析
  yaml:
 ^3.1.3        # 配置文件解析
  path:
 ^1.9.0        # 路径处理

安装方式

支持平台:macOS ✅ · Linux ✅ · Windows ❌

方式一:一行脚本安装(推荐)

curl -fsSL https://raw.githubusercontent.com/dungngminh/simutil/main/install.sh | bash

方式二:Homebrew(macOS / Linux)

brew tap dungngminh/simutil
brew install simutil

方式三:pub.dev 全局安装

dart pub global activate simutil

方式四:从源码构建

git clone https://github.com/dungngminh/simutil.git
cd
 simutil
dart pub get
dart pub global activate --source path .

安装完成后,直接运行:

simutil

本地开发 / 热重载

git clone https://github.com/dungngminh/simutil.git
cd
 simutil
dart pub get

# 本地运行

dart run bin/simutil.dart

# 热重载模式(开发 simutil 本身时用)

dart --enable-vm-service bin/simutil.dart

使用前提

simutil 本身不安装 Android SDK 或 Xcode,它调用的是系统里已有的工具:

  • • iOS 模拟器:需要安装 Xcode(包含 xcrun simctl)
  • • Android 模拟器:需要安装 Android SDK(包含 emulator)
  • • ADB 功能:需要安装 adb(通常随 Android SDK 一起安装)

和同类工具的对比

工具
类型
启动方式
ADB 工具
无线连接
跨平台
Android Studio AVD Manager
GUI IDE
点击多步
✅
❌
✅
Xcode Simulator
GUI IDE
点击多步
—
❌
❌
flutter emulators
CLI
命令行
❌
❌
✅
simutil TUI 一键 Enter ✅ ✅(含 QR) macOS/Linux

flutter emulators 是 Flutter SDK 自带的命令行工具,可以列出并启动模拟器,但没有 TUI 界面,没有并排浏览,没有 ADB 管理,没有无线连接。simutil 是对这个工具的功能升级,加了交互界面和实用工具集。


总结点评

这是一个很典型的「痒点工具」——解决的不是不能用,而是每天用起来不顺手的那种摩擦。

Flutter 开发者每天打开关闭模拟器无数次,在 IDE 和终端之间反复切换。simutil 的价值主张非常简洁:你本来就在终端里,凭什么要去开 IDE 只为了启动一个模拟器?

技术上,用 Dart + Nocterm 构建 TUI 这个路径也很有意思。Dart 在服务端和命令行工具领域的生态一直比较薄,Nocterm 这个框架在试图打开这个空间——simutil 刚好是一个证明它可行的实际案例。

ADB 无线连接 + QR 码配对这个功能组合尤其实用:很多 Flutter 开发者每次接真机都要找数据线,simutil 加上手机侧的一次性设置之后,之后每次打开工具扫一下就行了。

项目刚刚发布 0.3.2 版本,Stars 还在 87,处于很早期的阶段。对于每天用 Flutter 开发的同学,值得装一个试试——几乎没有上手成本,一行命令安装,simutil 直接跑起来。


GitHub:https://github.com/dungngminh/simutil