bug(desktop): dev 模式退出后残留 adb server 进程——清理只覆盖 bundled/prepared 来源,且未启用 Android 自动化时打开设置面板也会拉起 adb
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 401
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
**提交人**: 匿名
**客户端版本**: 0.0.0
---
## 现象
以 dev 模式(`pnpm dev:desktop`)运行 desktop 后关闭应用,系统里残留一个 adb server 守护进程(命令行形如 `adb -L tcp:5037 fork-server server --reply-fd `,监听 127.0.0.1:5037),需要手动 `adb kill-server` 才能清掉。
## 根因(已定位到代码)
两个独立问题叠加:
### 1. 退出清理只覆盖 bundled/prepared 来源的 adb
`apps/desktop/src/main/mcp-integrations/android.ts`:
- `spawnAdb` 里只有 `resolution.source === 'bundled' || 'prepared'` 时才记录 `managedAdbCommandUsed`;
- dev 模式下自带 adb 文件缺失(`apps/android-platform-tools-bin/win32-x64/` 下只有 NOTICE.txt / source.properties,没有 adb.exe),解析自动回退到 Android SDK 的 adb(source=`sdk`);
- 于是 `disposeAndroidAdb()`(退出链 sync 阶段)因 `managedAdbCommandUsed` 为空直接 `return`,从不执行 `adb kill-server` → server 残留。
- packaged 下若用户配置了 `adbPathOverride` / PATH 优先,同样存在该盲区。
### 2. 未启用插件时打开设置面板仍会触发 adb 探测
- Android 自动化是内置插件但默认禁用(`apps/desktop/src/main/maker-host/plugins/types.ts` 的 `DEFAULT_DISABLED_PLUGIN_IDS` 含 `android`);
- 但 `apps/desktop/src/renderer/components/settings/ComputerUseSection.tsx` mount 时**无条件**调用 `window.electronAPI.maker.android.status()`(不检查 `effectiveEnabled`),status → `adb devices -l` → 5037 无 server 时自动 fork 一个 server;
- 首次探测还会因 server 冷启动超过 3s 而超时,走冷启动重试(日志:`adb devices timed out; waiting for a cold daemon startup before retrying`),重试期间才把 server 拉起来。
## 复现步骤
1. dev 模式启动 desktop(`pnpm dev:desktop`),本机装有 Android SDK(或 PATH 里有 adb);
2. 打开「设置 → 电脑使用 / Computer Use」面板(Android 自动化插件保持默认禁用即可);
3. 观察:出现 adb server 进程监听 5037,日志出现 `adb devices timed out` 及冷启动重试;
4. 关闭应用;
5. 观察:adb server 进程残留,需手动 `adb kill-server`。
## 期望行为
1. 应用退出时,收掉**本会话确实拉起**的 adb server(无论解析来源是 bundled / prepared / sdk);已有的 `serverPreExistedBeforeUs` 探测可继续防止误杀用户自有的 server(如 Android Studio)。
2. Android 自动化插件未启用时,打开设置面板不应触发 `adb devices` / 拉起 server(状态展示用 fallback,或先探活 5037 再决定是否启动)。
## 建议修复方向(供参考)
- `android.ts`:把实际解析来源(含 `sdk`)纳入 `managedAdbCommandUsed` 记录,退出清理仍以 `serverPreExistedBeforeUs` 为防误杀闸门;
- `ComputerUseSection.tsx`:status 探测受 `effectiveEnabled` 门控;或 `status()` 内先 `isPortListening` 探活,无 server 时不触发启动。
---
**版本区域**: CN
**OS**: win32 x64 (10.0.26100)
**界面语言**: zh-CN
Contributor guide
Assessment
This issue has not been assessed yet.