EmbeDroid — Android Emulator Inside VS Code
Run and control your Android emulator in a VS Code tab — no separate window.
Tired of the Android emulator floating over your editor in its own window?
EmbeDroid puts the emulator screen inside VS Code, right next to your code —
just like Android Studio's "Running Devices" panel, but for VS Code.

What it does
- 📱 Boots your Android emulator inside VS Code — pick a virtual device from
the sidebar and its screen opens in an editor tab.
- 🖱️ Fully interactive — click to tap, drag to swipe, type with your
keyboard, scroll with your mouse wheel.
- 🧰 Device controls in the toolbar — Back, Home, Recents, Volume, Power,
Rotate, and Screenshot.
- 🚀 Perfect for Flutter & React Native — keep your app, your code, and your
hot-reload all in one window.
How to use it
- Click the Android robot icon in the Activity Bar (left sidebar).
- Under Available AVDs, click a virtual device — it boots in the background
(no popup window).
- Under Running Devices, click the device — its screen opens in a VS Code tab.
- Use it like a real phone: tap, swipe, type, rotate, take screenshots.
What you need
- Android SDK with the
emulator and platform-tools packages — you already
have this if Android Studio is installed.
- At least one virtual device (AVD) created in Android Studio's
Device Manager (AVD Manager). EmbeDroid boots and displays your existing
AVDs — it doesn't create them.
- VS Code 1.85+ on macOS, Windows, or Linux.
That's it. The scrcpy streaming engine is bundled with the extension — nothing
else to install on your machine or the device (Android 5.0+).
Install
From the VS Code Marketplace — search "EmbeDroid" in the Extensions view, or:
code --install-extension utpalbarman.embedroid
For contributors
Built spec-first — the specs in spec/ are the source of truth:
00 overview · 01 requirements ·
02 feasibility · 03 design ·
04 tasks · ADRs. Agents start at
CLAUDE.md.
Architecture (short)
emulator (-no-window) ──adb──▶ scrcpy-server ──socket──▶ ScrcpyStream (host)
│
LocalBridge (ws://127.0.0.1 + token)
│
Webview: WebCodecs decode → <canvas>,
pointer/keyboard/scroll → control messages
Key modules: src/sdk/SdkLocator, src/services/{Avd,Device}Service,
src/lifecycle/EmulatorLifecycle, src/stream/ScrcpyStream,
src/bridge/LocalBridge, src/webview/{WebviewManager, main}.
Develop & run locally
Prereqs: Android SDK (emulator + platform-tools), Node ≥ 18. The scrcpy
server is bundled (media/vendor/scrcpy-server-v3.2.jar) — no system scrcpy
needed.
npm install
npm run build # bundles dist/extension.js + media/webview.js
Then open this folder in VS Code and press F5 ("Run Extension").
Package a .vsix:
npm run package # → embedroid-<version>.vsix
Releasing
Releases are automated: push a vX.Y.Z tag and CI publishes to the Marketplace
and creates a GitHub Release with the .vsix.
npm version X.Y.Z --no-git-tag-version
git commit -am "chore(release): X.Y.Z" && git push origin main
git tag vX.Y.Z && git push origin vX.Y.Z # ← triggers publish
Full runbook, one-time secret setup, and troubleshooting: RELEASE.md.
Not yet done
- Broadway.js software-decode fallback (for builds without WebCodecs).
- Coordinate-transform unit tests (T-404); full rotation reflection.
- Clipboard sync, APK drag-drop (FR-25/26); gRPC transport (Approach B).
License
MIT — see LICENSE.