前言¶
用 DSH 做游戏开发时,验证环节通常要离开当前流程:打开第三方模拟器(MEmu/LDPlayer/BlueStacks 之类),装好 Android SDK 工具,在窗口之间来回切换。这类常驻模拟器占用 GB 级存储和一大块内存,即使不测试也在吃资源;另一种做法是手动 adb screencap 把画面导回来看,延迟高、操作繁琐。
下面介绍的 lordgrimtaken/dsh-inapp-plugin(Game Lab)把这个问题收进页面:它调用机器上已有的 Android SDK emulator 工具,按需启动一个 headless AVD,把游戏装进去、在页面里玩,空闲后自动关闭。
这是什么¶
- 插件名称:dsh-inapp-plugin(页面内名称为 Game Lab)
- 维护者:LordGrimTaken
- 分类:客户端
- 版本:v1.2(package.json 为 1.2.0)
- 许可证:MIT
一句话定位:一个 DSH 插件(host + Web UI 两半),把普通 Android SDK 模拟器改造成页面内的测试台,服务于「改游戏、构建、看真机效果」的循环。它不下载、不安装任何额外模拟器,也不获取系统镜像;机器上没有 x86_64 镜像时它只报告缺口,不代下。
画面通过 adb exec-out screenrecord … - 拿到 H.264 流,页面用 WebCodecs 在 canvas 上解码;浏览器不支持 WebCodecs 时自动回退到 adb exec-out screencap -p 的 PNG multipart 流。点击、滑动、键盘、手柄按键都经 adb 下发到模拟器。
核心功能¶
按需启动的 headless AVD。 配置的 AVD(默认名 gamelab)不存在时,基于本机已安装的 x86_64 系统镜像自动创建。规格为 720x1280、最多 2 vCPU、使用宿主机 GPU,不开窗口、不用快照。离线画面会列出所有已安装的 AVD(/status.avds),可在按 Start 前挑选。
流畅的实时画面。 H.264 经模拟器编码器输出,页面用 WebCodecs 解码渲染,实测画面变化时约 19 fps。WebCodecs 不可用时自动回退到 PNG multipart 流(约 0.7-1.6 fps)。工具栏提供 Smooth/Compat 切换。
完整输入。 支持点击、拖拽/滑动、Back/Home/Recents、旋屏、硬件按键;Keyboard 面板可输入 ASCII 文本和 Enter/Space/Backspace/Esc;Pad 面板提供 D-pad、A/B、Start,照顾需要按键输入的游戏。
游戏库与 Build & play。 插件扫描 gameRoots 配置的目录,按应用名分组 APK(新版本在前,旧版本折叠显示),记住上次搜索条件,并列出 Gradle/Capacitor 工程。Play 直接安装并启动 APK。Build & play 先检测工程类型:纯 Gradle 走 gradlew assembleDebug;Capacitor 走 npm run android:apk,或 npm run build + npx cap sync android + Gradle。完成后安装最新 APK 并启动,/status 返回当前阶段。
低空闲占用。 没人观看时 PNG/H.264 循环暂停;模拟器空闲 5 分钟后停止(可配置),运行中的构建不会被空闲计时器打断。运行期间保持屏幕唤醒,避免锁屏冻结游戏。
诊断信息。 页面显示实时 fps/RAM/CPU,支持 logcat 尾部、一键截图,以及状态 API。
安装与启用¶
安装命令来自 README 原文。注意 plugin_manager 是 DSH 智能体工具,不是 shell 命令:
# 让 DSH 智能体把这个本地文件夹安装为 bundle。
# plugin_manager 是 DSH 智能体工具,不是 shell 命令。
plugin_manager install_bundle target: <克隆到本地的绝对路径>
智能体工具会把文件夹链接进 profile,加入 bundle 选择并即时激活。如果希望手动配置 profile,参考仓库内 docs/INSTALL.md。
启用步骤:
- 重新加载 Harness 页面,让客户端部分加载。
- 点击左侧边栏的 Game Lab 手柄图标。
- 点击 Start emulator,冷启动约 40-60 秒。
- 把
gameRoots指向你的游戏目录,点击 Play(或 Build & play),用工具栏交互。
系统要求:带 Web UI 的 DSH、Android SDK(ANDROID_HOME 或 ANDROID_SDK_ROOT)、已安装的 x86_64 系统镜像;Build & play 还需要 JDK,Capacitor 工程需要 Node/npm。Windows 是已测试平台,host 代码里有 POSIX 分支但尚未在 macOS/Linux 上验证。
配置¶
配置写在 profile 的 cordis.patch.yml 里,改 game-lab 这一行,或覆盖 bundle 默认值。可调字段包括 gameRoots、avdName、idleMinutes、ramMb、cores、gpuMode、maxFps。bundle 自带的示例是:
# profile 中 cordis.patch.yml 的 game-lab 行
gameRoots: [C:\Games]
请把 gameRoots 改成实际存放 APK‑或工程的目录。完整字段说明见仓库内 docs/CONFIGURATION.md。
典型用法:跑一次 Build & play¶
以下流程来自 README 的 Quick start 与实测数据:
- 把
gameRoots指向包含 Capacitor 游戏工程的目录。 - 点击 Start emulator,等待冷启动完成(开发机实测 36-62 秒到可操作)。
- 点击 Build & play。插件检测到 Capacitor 工程后依次执行
npm run build、npx cap sync android、Gradle 打包,然后安装最新 APK 并启动。开发机实测从模拟器关闭到完成这一步共 71.4 秒。 - 运行期间用 Keyboard 或 Pad 面板操作游戏,用截图按钮保存当前画面。开发机实测安装并启动一个 9.6 MB 的 APK 需 3.7 秒,点击操作往返延迟约 0.7 秒,模拟器运行时主机占约 3.1-3.7 GB 内存、约 2.1-2.4 核 CPU。
- 停止观看后 5 分钟,空闲停止触发,内存归还系统。
更完整的发现与未验证项见仓库内 docs/VERIFICATION.md。
适用场景与注意¶
适合在 DSH 里做游戏开发、希望构建后立刻看画面交互,又不想维护常驻第三方模拟器的用户。它不适合多实例并行测试或对帧率要求高的游戏:一次只能跑一个模拟器、一个直播观看者;流畅帧率跟随画面变化,静态菜单可能只有几帧,快速移动的画面约 10-20 fps。
几点注意:
- 模拟器运行时约占 3.5 GB 内存(Android 14 镜像加 QEMU 的开销)。插件只把这笔成本推迟到需要时再付,不减少单次开销;要降低占用,应换更轻的系统镜像或 AVD。
- 插件以当前 DSH 进程的权限运行,安装前应先检查源码与许可证(MIT)。
- 非 ASCII 文本输入需要先在 AVD 里安装 ADBKeyboard,否则只能输入 ASCII。
- 运行期间需要保持页面打开,否则画面流暂停;空闲 5 分钟后模拟器停止。
结尾¶
Game Lab 的价值在于把「构建—真机验证」留在 DSH 页面内,同时避开常驻模拟器的存储与内存开销。它只驱动本机已有的 Android SDK 工具,不做任何模拟器或镜像下载。
- 目录页:https://www.skillhub.cn/plugins/LordGrimTaken/dsh-inapp-plugin
- GitHub:https://github.com/LordGrimTaken/dsh-inapp-plugin