Repository navigation
Releases: zhz8888/dsh-android-emulator-helper
Release list
v1.1.2
设置页不再松散,预览图与包版本对上
v1.1.1 之后的版本。23 个 android_* 工具的名称、参数与行为没有任何改动:这一版修的是设置页的排版节奏,并让市场预览图与该节奏一致。
包含内容
- 设置页卡片节奏收紧:字段上下内边距 10px → 7px,卡片
14px 16px 16px→12px 16px且最后一个字段不再留下内边距,卡片间距 20px → 16px。 - 提示文字不再继承浏览器默认边距:bundle 是独立编译的,无法依赖挂载处的 bare-element reset,于是每个提示、错误与说明段落都显式声明自己的
margin。此前 UA 的p { margin: 1em 0 }会在每段 12px 文字上下各加 12px——控件与它自己的说明之间凭空多出一道缝,卡片底部也总留一条空白带,这不是收紧盒子能解决的。12px 次级文字的行高同时从 1.6 对齐到平台字段套件的 1.5。 - 市场预览图重拍:
assets/下四张实拍换成收紧节奏后的页面,滚动位置、中文界面、1598 × 1588 与原来一致,文件名保持描述性原名不变(screenshots.json与两个 README 按这些名字索引,改名会直接坏掉市场列表)。 - README 的版本列表更新:两份 README 的发布段落此前停在
v1.1.1,会把 v1.1.2 的发布页说成不存在,现已把v1.1.2列在首位。 - 仓库忽略本机 agent 覆盖文件:
.claude.local.md属个人偏好,与AGENTS.md分工不同,已加入.gitignore。
自 v1.1.1 以来的变化
- 修复:设置页字段与卡片间距过宽;提示文字继承 UA 默认边距导致的空档。
- 文档:仓库文件改为相对链接、双语 README 的发布列表、AGENTS 记录节奏数值与图集时效规则、图集重拍。
- 未变:23 个工具的名称、参数与行为,设置页 5 组 17 个字段,以及两条 Fetch 路由。
安装
dsh plugin --profile <profile> add @zhz8888/dsh-android-emulator-helperDSH Desktop 则在「插件」页添加同一包名,或升级已有安装。
升级后请重启 DSH 宿主进程。 本包以
link:软链挂载,Node 对 ESM 做进程级缓存,lib/的改动在宿主重启前不会生效——否则设置页仍会按旧间距渲染。
校验
跑在 tag 指向的提交 a986bed 上(工作区干净):
pnpm run check:151 项测试全部通过;check-bundle通过(bundle id = 包名、命名空间 = patch 行 id、两份字段表与分组表逐键逐序一致、两种语言文案逐字一致、插件名与 bundle 渲染的标题与导航标签一致、两条路由两侧一致);verify-mount在真实 CordisContext与真实ToolRuntime上通过(23 个工具注册、23 个全部经注册表派发并通过参数/结果 schema 校验、dispose 后归零)。- 图集契约:
screenshots.json的四个路径都存在、都在仓库内,并被两个 README 按同一顺序内嵌;assets/只保留这四张。 - 四张新图逐张回读内容,确认与两个 README 的 alt 文字仍然一致;滚动顺序按正文首个文本行的位置(y=118/139/129/125)逐张核对;侧栏逐像素与旧图一致,证明差异只来自正文节奏而非换窗。
- 包内无运行时依赖;
@deepseek-ai/cordis、@deepseek-ai/dsh-tools、@deepseek-ai/schemastery一律为 peer 依赖。
发行侧
- npm:
@zhz8888/dsh-android-emulator-helper@1.1.2,dist-taglatest,发布于 2026-10-19。 - tarball:29 个文件、107.2 kB(解包 284,570 B),sha1
f9172795e175da4b5748aa2adbf7a28bd5d4930f、sha256f99afa6618f037932c209ed6c5c0ccbcce52cfafe3fde88322b11264fb9e77f6(以下载自 registry 的 tarball 复算而得)。 - registry 记录的
gitHead为a986bedd221a445af521c5c4b0195d0868a2a149,与 tagv1.1.2指向的提交一致。 - tag
v1.1.2为轻量 tag,指向a986bedd221a445af521c5c4b0195d0868a2a149,已推送到 GitHub 与自建 Gitea(两个远端的main与 tag 均为该提交)
A settings page that is no longer loose, and previews that match the package
The release after v1.1.1. Nothing about the 23 android_* tools' names, arguments or behaviour changed: this one fixes the settings page's spacing rhythm and brings the market previews in line with it.
What this version contains
- A tighter card rhythm: a field's vertical padding goes 10px → 7px, a card
14px 16px 16px→12px 16pxwith no padding under its last field, and the cards sit 20px → 16px apart. - Hints no longer inherit the browser's default margins: the bundle is compiled on its own and cannot lean on a bare-element reset from wherever it is mounted, so every hint, error and note now states its own
margin. Until then the UA'sp { margin: 1em 0 }added 12px above and below every line of 12px text — a visible gap between a control and the hint describing it, and a band of empty space at the foot of every card, neither of which tightening the boxes could fix. The 12px secondary text also moves to the 1.5 line-height the platform's field kit uses. - Re-shot preview gallery: the four captures under
assets/now show the tightened page in the same scroll positions, same Chinese locale, same 1598 × 1588, and under their existing descriptive filenames —screenshots.jsonand both READMEs index the gallery by those names, so a rename would have broken the market listing outright. - Release lists brought forward: both READMEs' release paragraph ended at
v1.1.1, which would have described the v1.1.2 Release page as not existing;v1.1.2now leads the list. - A local agent override is ignored:
.claude.local.mdis one developer's personal preferences rather than shared context, the same splitAGENTS.mddocuments, so it joined.gitignore.
Changes since v1.1.1
- Fixed: the settings page's over-wide field and card spacing, and the gaps the browser's default paragraph margins opened inside it.
- Documentation: relative repository links, the bilingual release lists, AGENTS recording the rhythm's numbers and the gallery's currency rule, and the re-shot gallery.
- Unchanged: the names, arguments and behaviour of all 23 tools, the 17 settings fields in 5 groups, and both Fetch routes.
Install
dsh plugin --profile <profile> add @zhz8888/dsh-android-emulator-helperDSH Desktop: add the same package name on the Plugins page, or upgrade the existing install.
Restart the DSH host process after upgrading. The package is mounted as a
link:symlink and Node caches ESM modules for the life of the process, so a change underlib/does not take effect until the host restarts — until then the settings page keeps rendering at the old spacing.
Verification
Run on the commit the tag points at, a986bed, with a clean working tree:
pnpm run check: 151 tests pass;check-bundlepasses (bundle id = package name, namespace = patch row id, the host and client field and group tables agreeing key by key and in order, the user-visible text matching word for word in both languages, the plugin name matching the heading and nav label the bundle renders, both routes present on both sides);verify-mountpasses on a real CordisContextand realToolRuntime(23 tools registered, all 23 dispatched through the registry and validated against their argument and result schemas, nothing left registered after disposal).- The gallery contract: all four paths in
screenshots.jsonexist, stay inside the repository, and are embedded by both READMEs in the same order;assets/holds exactly those four. - Each new capture was read back to confirm it still matches the alt text the two READMEs carry; scroll order was checked per shot by the first text band's position (y=118/139/129/125); the sidebar is pixel-identical to the superseded captures, which is what shows the difference is the content rhythm and not a different window.
- The package has no runtime dependencies;
@deepseek-ai/cordis,@deepseek-ai/dsh-toolsand@deepseek-ai/schemasteryare all peer dependencies.
Release artifact
- npm:
@zhz8888/dsh-android-emulator-helper@1.1.2, dist-taglatest, published 2026-10-19. - tarball: 29 files, 107.2 kB (284,570 B unpacked), sha1
f9172795e175da4b5748aa2adbf7a28bd5d4930f, sha256f99afa6618f037932c209ed6c5c0ccbcce52cfafe3fde88322b11264fb9e77f6(recomputed from the tarball downloaded off the registry). - the registry records
gitHeada986bedd221a445af521c5c4b0195d0868a2a149, the commit tagv1.1.2points at. - tag
v1.1.2is a lightweight tag pointing ata986bedd221a445af521c5c4b0195d0868a2a149, pushed to GitHub and the self-hosted Gitea mirror (both remotes'mainand tag are that commit)
v1.1.1
面向市场的门面:名称、描述、图标与预览图
v1.1.0 之后的版本。23 个 android_* 工具的行为没有任何改动:这一版改的是这个插件在插件市场里的样子——显示名、双语描述、DSH 版本下限的声明方式、图标,以及市场用于预览的四张设置页截图。
包含内容
- 显示名:插件页显示 Android Emulator Helper / Android 模拟器助手(取自
locale/en.json与locale/zh.json),设置页标题同步改为同名;侧边栏导航保留短名「Android emulator」/「Android 模拟器」,与同作者的dsh-ios-simulator-helper保持同一分工。 - 双语描述:两条描述都写明本插件为非官方助手,并以「与 Google 无隶属关系」/「Not affiliated with Google」收尾。
- DSH 版本下限:
>=0.2.0-rc.2现在同时声明在peerDependencies、engines.dsh与dsh.compatibility.dsh三处,dshReleases记录实际跑过验证的那个版本。 - 图标:手绘的
icon.svg(单色机头 +prefers-color-scheme反色)换成 ZCode 市场为上游插件提供的那张图,缩放为 192 × 192 并抠掉浅绿底色,得到无底色、无白边的透明 PNG。 - 市场预览图:
screenshots.json与assets/下四张设置页实拍,按页面滚动顺序,英文与中文 README 都已内嵌。 - 文档:两个 README 按
dsh-ios-simulator-helper的结构精简(英文 358 → 233 行,中文 271 → 217 行),开发约定(仓库结构、不变式、验证层、pnpm 策略)整理进AGENTS.md。
自 v1.1.0 以来的变化
- 新增:市场预览图及其清单;上游图标;本地化的显示名与描述;DSH 版本下限的三处声明。
- 改进:README 与 AGENTS 的分工重排,中英两份文档现在标题、表格行数与要点数完全一致。
- 未变:23 个工具的名称、参数与行为,以及设置页的 5 组 17 个字段。
icon.svg已删除,icon与files改为android-emulator.png。
安装
dsh plugin --profile <profile> add @zhz8888/dsh-android-emulator-helperDSH Desktop 则在「插件」页添加同一包名,或升级已有安装。
升级后请重启 DSH 宿主进程。 本包以
link:软链挂载,Node 对 ESM 做进程级缓存,lib/的改动在宿主重启前不会生效——否则设置页仍会显示旧名称。
校验
跑在 tag 指向的提交 8c8e0e1 上(工作区干净):
pnpm run check:151 项测试全部通过;check-bundle通过(bundle id = 包名、命名空间 = patch 行 id、两份字段表与分组表逐键逐序一致、两种语言文案逐字一致、插件名与 bundle 渲染的标题与导航标签一致、两条路由两侧一致);verify-mount在真实 CordisContext与真实ToolRuntime上通过(23 个工具注册、23 个全部经注册表派发并通过参数/结果 schema 校验、dispose 后归零)。- 新增守护:解码
android-emulator.png校验 PNG 签名、正方形、≥128 px、≤256 KiB、四角透明、可见像素不比抠掉的底色更浅、深色块只剩两只眼睛;screenshots.json与两个 README 的图集一致。 - 23 个工具名与 17 个设置字段逐项对照
lib/tools/index.js与lib/settings.js。 - 包内无运行时依赖;
@deepseek-ai/cordis、@deepseek-ai/dsh-tools、@deepseek-ai/schemastery一律为 peer 依赖。
发行侧
- npm:
@zhz8888/dsh-android-emulator-helper@1.1.1,dist-taglatest,发布于 2026-10-18 - tarball:29 个文件、106.6 kB(解包 283,725 B),sha1
31ba3587fafa8d1c2042b793d39f1792c3891017、sha25601fbd8ce41a4c2de748dfb22b25a2f173c726c7eedd6666bca364382b2f72103 - registry 记录的
gitHead为8c8e0e1b74ebff6207733c15385e9ba9c2b89eb5,与 tagv1.1.1指向的提交一致;tag 已推送到 GitHub 与自建 Gitea
A market-facing identity: name, description, icon and previews
The release after v1.1.0. Nothing about the 23 android_* tools changed: this one is about how the plugin looks in a plugin market — its display name, its bilingual description, how its DSH floor is declared, its icon, and the four settings-page screenshots a market previews it with.
What this version contains
- Display name: the plugin page reads Android Emulator Helper / Android 模拟器助手 (from
locale/en.jsonandlocale/zh.json), and the settings page heading now says the same thing; the sidebar keeps the short label "Android emulator" / "Android 模拟器", the same split the siblingdsh-ios-simulator-helperplugin uses. - Bilingual descriptions: both say the plugin is unofficial and close with "not affiliated with Google".
- The DSH floor:
>=0.2.0-rc.2is now declared in three places —peerDependencies,engines.dshanddsh.compatibility.dsh— withdshReleasesnaming the release actually exercised. - The icon: the hand-drawn
icon.svg(a monochrome head that inverted itself throughprefers-color-scheme) is replaced by the artwork ZCode's own marketplace serves for the plugin this port came from, downscaled to 192 × 192 with its pale tile keyed out — a transparent PNG with no rim. - Preview gallery:
screenshots.jsonand the four captures underassets/, in the order the page scrolls, embedded in both READMEs. - Documentation: both READMEs were condensed onto the
dsh-ios-simulator-helperoutline (English 358 → 233 lines, Chinese 271 → 217), and the development conventions — repository map, invariants, verification layers, pnpm policy — moved toAGENTS.md.
Changes since v1.1.0
- Added: the preview gallery and its manifest; the upstream icon; the localised name and descriptions; the three-place DSH floor.
- Improved: the README/AGENTS split, with the two languages now carrying identical headings, table rows and bullet counts.
- Unchanged: the names, arguments and behaviour of all 23 tools, and the 17 settings fields in 5 groups.
icon.svgis deleted;iconandfilesnow nameandroid-emulator.png.
Install
dsh plugin --profile <profile> add @zhz8888/dsh-android-emulator-helperDSH Desktop: add the same package name on the Plugins page, or upgrade the existing install.
Restart the DSH host process after upgrading. The package is mounted as a
link:symlink and Node caches ESM modules for the life of the process, so a change underlib/does not take effect until the host restarts — until then the settings page keeps showing the old name.
Verification
Run on the commit the tag points at, 8c8e0e1, with a clean working tree:
pnpm run check: 151 tests pass;check-bundlepasses (bundle id = package name, namespace = patch row id, the host and client field and group tables agreeing key by key and in order, the user-visible text matching word for word in both languages, the plugin name matching the heading and nav label the bundle renders, both routes present on both sides);verify-mountpasses on a real CordisContextand realToolRuntime(23 tools registered, all 23 dispatched through the registry and validated against their argument and result schemas, nothing left registered after disposal).- New guards:
android-emulator.pngis decoded to check the PNG signature, the square frame, the 128 px floor, the 256 KiB cap, transparent corners, no visible pixel as pale as the keyed-out tile, and exactly two dark marks — the eyes;screenshots.jsonand the two READMEs agree on the gallery. - The 23 tool names and the 17 settings fields were checked against
lib/tools/index.jsandlib/settings.js. - The package has no runtime dependencies;
@deepseek-ai/cordis,@deepseek-ai/dsh-toolsand@deepseek-ai/schemasteryare all peer dependencies.
Release artifact
- npm:
@zhz8888/dsh-android-emulator-helper@1.1.1, dist-taglatest, published 2026-10-18 - tarball: 29 files, 106.6 kB (283,725 B unpacked), sha1
31ba3587fafa8d1c2042b793d39f1792c3891017, sha25601fbd8ce41a4c2de748dfb22b25a2f173c726c7eedd6666bca364382b2f72103 - the registry records
gitHead8c8e0e1b74ebff6207733c15385e9ba9c2b89eb5, the commit tagv1.1.1points at; the tag is pushed to GitHub and the self-hosted Gitea mirror
v1.1.0
设置页重做,超时改秒,修掉 23 个工具真机实测出的 8 个缺陷
v1.0.0 之后的第一个版本。这一版把设置页按卡片重做,两处超时改成按秒填写,并修掉一轮真机全量验证发现的缺陷——其中「生成的新工程编译不过」会让 android_create_app 的主路径直接失败。
包含内容
- 23 个
android_*原生工具:工具名与参数名与原 ZCodeandroid-emulator@0.1.0插件逐字一致,为原 MCP 服务器写的工作流可直接迁移。 - 设置页重做(设置 → Android 模拟器):页面自带标题与说明,每个分组一张卡片(卡片描边承担分组分隔,不再需要横线),保存移到只在有事可做时出现的底部粘性操作栏。5 组 17 个字段全部实时生效,空值按「设置页 →
ANDROID_PLUGIN_*环境变量 → 内置默认值」回落。 - 超时按秒填写:
bootTimeoutSeconds(180)与buildTimeoutSeconds(600)取代原来的毫秒字段,跨进程时再换算;页面上每个默认值都以秒为单位写明。 - 两条精确 Fetch 路由支撑页面上的两个按钮:
GET /api/android-emulator-helper/status(检测环境)与GET /api/android-emulator-helper/inventory(刷新设备与 AVD)。
自 v1.0.0 以来的变化
- 新增:设置页卡片化与粘性操作栏;两处超时改为秒。
- 修复:
android_ui_type_text把每个%变成%25——adb shell input text只认%s表示空格,不是 URL 解码器,输入100%却读回100%25。android_ui_describe在 dump 失败时把上一屏当当前屏返回(uiautomator dump写失败仍退出 0)。现在每次调用用唯一路径,顺带消除并发调用竞争。android_create_app生成的新工程编译不过:模板没固定 JVM target,AGP 用 Java 8、Kotlin 跟随 JDK 24 用 22 →Inconsistent JVM-target compatibility。现在两侧钉到同一目标,由jdkMajor推导并钳制到 [17, 21]。android_start_emulator传入不存在的 AVD 名字时会静默启动另一个模拟器;现在直接报错并列出可用 AVD。android_preflight无条件豁免设备检查,关掉自动启动时仍报 ready;现在豁免范围与「还能不能自己起一个」一致。- 设置页两条路由在读取设置出错时会抛出而不是返回 500,而客户端正是读
body.error。 tap/swipe回显的是请求值而非实际发给 adb 的值,swipe也不返回durationMs。- 宿主半与客户端半的用户可见文案有 13 处漂移(7 个字段),两种语言逐字比对后全部对齐。
- 构建超时的错误信息现在会点名阻塞的设备状态(
unauthorized/offline),而不是只报超时。
- 仓库结构:
docs/移出版本控制;AGENTS.md记录开发规范(不进发布包)。
安装
dsh plugin --profile <profile> add @zhz8888/dsh-android-emulator-helperDSH Desktop 则在「插件」页里添加同一个包名,或直接升级已有安装。
升级后请重启 DSH 宿主进程。 本包以
link:软链挂载,Node 对 ESM 做进程级缓存,lib/的改动在宿主重启前不会生效——否则工具仍会跑旧代码。
校验
跑在 tag 指向的提交 d0e60e6 上(工作区干净):
pnpm run check:145 项测试全部通过;check-bundle通过(bundle id = 包名、命名空间 = patch 行 id、host/client 两份字段表与分组表逐键逐序一致、两种语言文案逐字一致、两条路由两侧一致);verify-mount在真实 CordisContext与真实ToolRuntime上通过(23 个工具注册、23 个全部经注册表派发并通过参数/结果 schema 校验、dispose 后归零)。- 真机(Pixel_10 / API 37 模拟器):
android_create_app→ 构建 → 安装 → 启动 → 终止 →build_and_run全链路通过;pnpm run smoke:emulator的启动/截图/日志/停止链路通过。 - 包内无运行时依赖;
@deepseek-ai/cordis、@deepseek-ai/dsh-tools、@deepseek-ai/schemastery一律为 peer 依赖。
发行侧
- npm:
@zhz8888/dsh-android-emulator-helper@1.1.0 - tarball:29 个文件、83.1 kB(解包 259,120 B),sha256
671c5178278698013e7c6474544e1b9d08c276f565a09083bc91fd8264fc7bb3(npm registry 记录的 sha1 为5a095dba4c85281b0344101ed640cfecaa354295) - tag
v1.1.0指向d0e60e6,即 npm 记录的gitHead
Settings page rebuilt, timeouts in seconds, and eight defects found by exercising all 23 tools on a real emulator
The first release after v1.0.0. It rebuilds the settings page around cards, asks for both timeouts in seconds, and fixes what a full real-machine sweep turned up — including one defect that made android_create_app's main path fail outright.
What it contains
- 23 native
android_*tools: tool and argument names are identical to the original ZCodeandroid-emulator@0.1.0plugin, so workflows written for its MCP server keep working. - Settings page rebuilt (Settings → Android emulator): the page draws its own title and intro, one card per group (the card outline separates the groups, so no rule is needed between them), and the save moves into a sticky action bar that appears only while there is something to act on. All 17 fields in 5 groups are live-editable; an empty field falls back to its
ANDROID_PLUGIN_*variable, then to the built-in default. - Timeouts in seconds:
bootTimeoutSeconds(180) andbuildTimeoutSeconds(600) replace the millisecond fields and convert at the spawn boundary; the page states each default in seconds. - Two exact Fetch routes back the page's two buttons:
GET /api/android-emulator-helper/status(run diagnostic) andGET /api/android-emulator-helper/inventory(refresh devices and AVDs).
Changes since v1.0.0
- Added: the card-based settings page and its action bar; both timeouts asked for in seconds.
- Fixed:
android_ui_type_textturned every%into%25—adb shell input textunderstands only%sfor a space and is not a URL decoder, so typing100%read back100%25.android_ui_describeserved the previous screen when a dump failed, becauseuiautomator dumpexits 0 even when it writes nothing. Each call now dumps to a path unique to itself, which also removes the race between concurrent callers.- A project from
android_create_appdid not compile: the template pinned no JVM target, so AGP used Java 8 while Kotlin followed the JDK running Gradle (24 → 22), and the build failed withInconsistent JVM-target compatibility. Both halves are now pinned to one target, derived fromjdkMajorand clamped to [17, 21]. android_start_emulatorsilently started a different emulator when given an AVD name that does not exist; it now fails and lists the AVDs that do.android_preflightexcused the device check unconditionally, reporting ready with auto-start disabled; the exemption is now exactly as wide as the recovery that justifies it.- The settings routes rejected the request instead of answering
500when reading a setting failed, while the client half readsbody.erroroff exactly that response. tapandswipereported the requested coordinates rather than the ones sent to adb, andswipeomitteddurationMs.- The host and client halves disagreed on the user-visible text in 13 places across 7 fields; both languages are now compared word for word.
- A boot timeout now names the blocking device state (
unauthorized/offline) instead of reporting only the timeout.
- Repository:
docs/is removed from version control;AGENTS.mdcarries the development conventions and does not ship.
Install
dsh plugin --profile <profile> add @zhz8888/dsh-android-emulator-helperDSH Desktop: add the same package name on the Plugins page, or upgrade the existing install.
Restart the DSH host process after upgrading. The package is mounted as a
link:symlink and Node caches ESM modules for the life of the process, so a change underlib/does not take effect until the host restarts — until then the tools keep serving the old code.
Verification
Run on the commit the tag points at, d0e60e6, with a clean working tree:
pnpm run check: 145 tests pass;check-bundlepasses (bundle id = package name, namespace = patch row id, the host and client field and group tables agreeing key by key and in order, the user-visible text matching word for word in both languages, both routes present on both sides);verify-mountpasses on a real CordisContextand realToolRuntime(23 tools registered, all 23 dispatched through the registry and validated against their argument and result schemas, nothing left registered after disposal).- Real machine (Pixel_10, API 37 emulator): the full
android_create_app→ build → install → launch → terminate →build_and_runcycle passes, as does the boot / screenshot / logs / stop chain inpnpm run smoke:emulator. - The package has no runtime dependencies;
@deepseek-ai/cordis,@deepseek-ai/dsh-toolsand@deepseek-ai/schemasteryare all peer dependencies.
Release artifact
- npm:
@zhz8888/dsh-android-emulator-helper@1.1.0 - tarball: 29 files, 83.1 kB (259,120 B unpacked), sha256
671c5178278698013e7c6474544e1b9d08c276f565a09083bc91fd8264fc7bb3(the registry records sha15a095dba4c85281b0344101ed640cfecaa354295) - tag
v1.1.0points atd0e60e6, the same commit npm records asgitHead
v1.0.0
首个正式版本:把 Android 模拟器接进 DeepSeek Harness
把 ZCode 官方 android-emulator@0.1.0 插件移植为 DSH 原生插件后的第一个正式版本。原有 23 个工具全部保留为原生 android_* 工具,并新增一个完整的设置页;本版同时按 awesome-dsh-plugin 贡献指南整理了包结构、scoped 包名与插件页显示名。
包含内容
- 23 个
android_*原生工具:SDK 探测、AVD 与模拟器生命周期(创建/启动/停止)、设备与 AVD 列举、Kotlin/Compose 工程脚手架、Gradle 构建与构建后直接运行、安装/启动/结束/打开链接、截图、logcat、以及 UI 自动化(控件树、点按、滑动、输入、按键)。工具名与参数名与原插件完全一致,为原android_emulatorMCP 服务器写的工作流可直接迁移。 - 设置页(设置 → Android 模拟器):5 组 17 个字段,全部实时生效;空值按「设置页 → 原插件
ANDROID_PLUGIN_*环境变量 → 内置默认值」回落。页面下方两个按钮分别是「检测环境」与「刷新设备与 AVD」。 android-devskill 与/android-dev [goal]命令:命令只运行环境诊断并打印结论与修复建议(DSH 用户命令不会创建模型消息)。- 结构:
dsh.bundle.patch声明的补丁层只挂载一行宿主记录;设置命名空间 = 补丁行 id =android-emulator-helper;插件页显示名不是包名,而是locale/en.json与locale/zh.json提供的 Android Emulator / Android 模拟器。
与原插件的差异
| 原插件(ZCode) | 本移植(DSH) | |
|---|---|---|
| 工具暴露 | stdio MCP server,mcp__android_emulator__* |
原生 ctx.tools.register(),android_*(名称与参数不变) |
| 配置来源 | plugin.json 的 userConfig,经 ANDROID_PLUGIN_* 注入 |
设置页 + volatile Config;环境变量仍作回落 |
| 工作目录 | process.cwd() |
exec.agent.session.header.cwd(会话工作区) |
| 数据目录 | ANDROID_PLUGIN_DATA / 临时目录 |
$DSH_HOME/android-emulator-helper,可在设置页配置 |
| 截图返回 | MCP image content(base64) | host 附件引用生成的图像块,失败时退化为文本 |
| 斜杠命令 | 注入一段提示词给模型 | 直接运行诊断并输出结论 |
| 进程调用 | 直接 node:child_process |
保持不变 |
保留直接 spawn 是有意的取舍:gradlew、adb、emulator 的行为与原插件逐字节一致,且不必为 adb exec-out 的二进制流另写一层适配。代价是绕过了 DSH 的 subprocess seam——没有统一的过程管理、环境变量清洗、输出 spill 与卸载期终止。本插件的每个外部调用都有显式 timeout 与 SIGTERM,且不读写任何凭据环境变量。
安装
已发布到 npm:
dsh plugin --profile <profile> add @zhz8888/dsh-android-emulator-helperDSH Desktop 则在「插件」页里添加同一个包名。package.json 声明了 dsh.bundle.patch,DSH 的 reconcile 会把本包追加进 dsh.profile.bundles,启动时合并补丁层并挂载唯一一行宿主记录。
校验
pnpm run check:63 项测试全部通过;check-bundle(bundle id = 包名、命名空间一致、host/client 两份字段表一致、两个路由)与verify-mount(真实 CordisContext+ 真实ToolRuntime上挂载 23 个工具)均通过。- 用上面的 npm 包名在临时 profile 里真实装过一次:包落在
node_modules/@zhz8888/dsh-android-emulator-helper/(含locale/),--dump-config输出- id: android-emulator-helper/name: '@zhz8888/dsh-android-emulator-helper',补丁层确实挂上。 - 包内无运行时依赖;
@deepseek-ai/cordis、@deepseek-ai/dsh-tools、@deepseek-ai/schemastery一律为 peer 依赖,由宿主提供。
发行侧
- npm:
@zhz8888/dsh-android-emulator-helper@1.0.0—— https://www.npmjs.com/package/@zhz8888/dsh-android-emulator-helper - tarball:29 个文件、打包 74.0 kB(解包 233,924 B),sha256
0940eec7206d010eb07d697a94cef6c31b83f669c35d08a4d89f8d89252e9c09 - npm 记录的
gitHead为b664b64,与 tagv1.0.0指向的提交一致 - 源码:https://github.com/zhz8888/dsh-android-emulator-helper (GitHub 与 Gitea 两个远端的
main与v1.0.0均已对齐)
First stable release: the Android emulator inside DeepSeek Harness
First stable release of the DSH-native port of the official ZCode android-emulator@0.1.0 plugin. All 23 original tools are preserved as native android_* tools, and a full settings page joins them. This version also reshapes the package for the awesome-dsh-plugin contributing guide: scoped package name, listing metadata, and a plugin-page name that comes from locale/.
What it contains
- 23 native
android_*tools: SDK discovery, AVD and emulator lifecycle (create/start/stop), device and AVD listing, Kotlin/Compose project scaffolding, Gradle build and build-and-run, install/launch/terminate/open-URL, screenshots, logcat, and UI automation (element tree, tap, swipe, text, key events). Tool and argument names are identical to the original, so workflows written for theandroid_emulatorMCP server keep working. - Settings page (Settings → Android emulator): 17 fields in 5 groups, all live-editable; an empty field falls back to the original plugin's
ANDROID_PLUGIN_*variable, then to the built-in default. Two buttons at the bottom run the environment diagnostic and refresh the device/AVD inventory. android-devskill and the/android-dev [goal]command: the command runs the environment diagnostic and prints the verdict and the fixes (DSH user commands deliberately create no model message).- Structure: the patch layer declared by
dsh.bundle.patchmounts exactly one host row; settings namespace = patch row id =android-emulator-helper. The plugin page shows a name rather than the package name — Android Emulator / Android 模拟器, read fromlocale/en.jsonandlocale/zh.json.
Differences from the original
| Original (ZCode) | This port (DSH) | |
|---|---|---|
| Tool exposure | stdio MCP server, mcp__android_emulator__* |
native ctx.tools.register(), android_* (names and arguments unchanged) |
| Configuration | plugin.json userConfig via ANDROID_PLUGIN_* |
settings page + volatile Config; env vars still fall back |
| Working directory | process.cwd() |
exec.agent.session.header.cwd (session workspace) |
| Data directory | ANDROID_PLUGIN_DATA / temp |
$DSH_HOME/android-emulator-helper, configurable |
| Screenshot | MCP image content (base64) | host attachment reference; text fallback |
| Slash command | injects a model prompt | runs the diagnostic directly |
| Process execution | direct node:child_process |
unchanged |
The direct spawn is a deliberate trade-off: gradlew, adb and emulator behave byte-for-byte as they did in the original, and adb exec-out needs no binary-stream adapter. The cost is bypassing DSH's subprocess seam — no managed process ranges, env scrubbing, output spill or teardown termination. Every call here has an explicit timeout and SIGTERM, and the plugin reads and forwards no credential-bearing environment variables.
Install
Published on npm:
dsh plugin --profile <profile> add @zhz8888/dsh-android-emulator-helperDSH Desktop: add the same package name on the Plugins page. package.json declares dsh.bundle.patch, so DSH's reconcile step appends this package to dsh.profile.bundles, merges the patch at boot, and mounts exactly one host row.
Verification
pnpm run check: 63 tests pass, together withcheck-bundle(bundle id = package name, namespace, both field tables, the two routes) andverify-mount(23 tools registered on a real CordisContextand the realToolRuntime).- Installed for real from the registry in a throwaway profile: the package lands in
node_modules/@zhz8888/dsh-android-emulator-helper/(withlocale/), and--dump-configprints- id: android-emulator-helper/name: '@zhz8888/dsh-android-emulator-helper', so the patch layer is mounted. - No runtime dependencies;
@deepseek-ai/cordis,@deepseek-ai/dsh-toolsand@deepseek-ai/schemasteryare peer dependencies provided by the host.
Release artifact
- npm:
@zhz8888/dsh-android-emulator-helper@1.0.0— https://www.npmjs.com/package/@zhz8888/dsh-android-emulator-helper - tarball: 29 files, 74.0 kB packed (233,924 B unpacked), sha256
0940eec7206d010eb07d697a94cef6c31b83f669c35d08a4d89f8d89252e9c09 - npm records the
gitHeadb664b64, the commit tagv1.0.0points at - Source: https://github.com/zhz8888/dsh-android-emulator-helper (both remotes — GitHub and Gitea — carry the same
mainandv1.0.0)