Caspian Emulator
Android emulator management for VS Code — no Android Studio required.
Launch emulators, manage AVDs, install APKs, view logcat, mirror screens, manage apps, and browse device files — all without leaving your editor. Capture Play Store screenshots and sweep your app across languages, font scales, and display sizes in one command. The extension can download and set up the entire Android SDK automatically.

Zero-Setup Android Development
Don't have the Android SDK installed? No problem. Caspian Emulator can download and configure everything for you:
- Click "Download & Install Android SDK" when prompted
- The extension downloads the SDK command-line tools, installs adb, the emulator, and a system image
- A default virtual device is created automatically — ready to launch
No Android Studio. No manual path configuration. Just install the extension and go.
Features
Automatic SDK Setup
- Downloads Android SDK command-line tools from Google
- Installs platform-tools (adb), emulator, and system images via
sdkmanager
- Accepts SDK licenses automatically
- Creates a default AVD (Pixel 6, Android 35) ready to launch
- Detects existing SDK installations via
ANDROID_HOME and common paths
- Requires only Java 17+ — everything else is handled
AVD Management
- Create virtual devices by name — 37 presets grouped as Google Pixel, Samsung Galaxy, Other phones, Foldables and Tablets: the Pixel 10 and 9 lines, Galaxy S25 Ultra, Galaxy Z Fold 6, Galaxy Z Flip 6, OnePlus 13, Xiaomi 14, Galaxy Tab S10 Ultra, OnePlus Pad 2, and more. Search by manufacturer or resolution as well as by name
- System image downloaded automatically if not installed (~1 GB) — and if you already have a newer one, that is used instead of downloading an older one
- Launch, stop, delete, clone, and edit AVDs from the sidebar
- Cold boot option — launch without loading snapshots
- Clone AVD — duplicate an existing virtual device for testing variations
- Boot progress notification — shows progress while emulator starts
- See running/stopped status at a glance with color-coded icons
- Correct hardware, always — presets carry the real resolution, density, and RAM of the device they name, even when your SDK's command-line tools predate that device profile. For Samsung, OnePlus and Xiaomi devices, which no Android SDK has ever carried a definition for, Caspian configures the display itself — with densities chosen so the dp size matches the real hardware, since dp is what your layouts respond to
- Resolution shown in the sidebar, with a warning icon and one-click repair for any misconfigured virtual device
- Low-memory pre-flight — warns before a launch that would hang, names the processes eating your RAM, and offers to stop the build daemons holding it. If
gradlew --stop frees nothing (it cannot stop the Kotlin compile daemon, usually the larger of the two) Caspian says so and offers to stop what is left, rather than going quiet and letting you assume it worked
- Acceleration check — tells you when WHPX/HAXM/KVM is missing instead of letting the emulator hang in software mode
- Launch failures are reported with a link to the emulator log, rather than a progress bar that spins and gives up
- Boot is tracked properly — Caspian waits for Android itself (
sys.boot_completed plus a working package manager), not just for the device to appear in adb devices, and tells you whether it is waiting, booting, or stalled
- A wedged boot is named as one — a guest that finishes its boot animation but never comes up is detected, the launch log opens automatically, and Repair is one click away
- Repair Virtual Device — stop cleanly, cold boot, or wipe data, each rung stating its cost before you commit to it
- Stopping is verified, and a force kill warns you that it costs the snapshot before it happens
- Guest RAM check — flags a virtual device with too little RAM for its system image, the cause of an emulator that boots and then stops responding
- Host memory is watched while the emulator runs, so a build started alongside it warns you before the guest starts thrashing
- GPU mode is a setting (
caspian.emulator.gpuMode), not something to hand-type into launch arguments — and when a launch dies with a graphics error, Caspian retries in software automatically, names the mode that worked, and offers to save it
- Custom emulator launch arguments via settings
Store Screenshots & Release Assets
- Screenshot mode — one toggle for a clean status bar: fixed clock, full battery, full signal, no notification icons. No more hand-typing seven
am broadcast commands
- Capture Store Screenshots — portrait and landscape in one command, saved to a named run folder
- Every capture is validated against Play Console rules (320-3840 px per side, aspect limits) so you learn about a rejection here, not in the Play Console
- A blank capture fails loudly. An emulator can boot, run your app, and still hand back a perfectly formed, entirely black PNG — correct size, correct aspect, correct format, and worthless. Caspian measures the image itself and tells you the emulator is not rendering, instead of letting black rectangles reach your store listing
- Each run writes a Markdown report with the images inline, plus a
manifest.json for scripting
- Orientation is labelled from the captured image, so tablets and foldables are correct, and an orientation-locked app is reported rather than silently duplicated
- A rotation that did not happen fails validation instead of being quietly filed under whichever orientation it measured
- Display cutout emulation — corner, double, punch-hole, tall, waterfall, or none, for checking edge-to-edge layout against a real notch inset
- Navigation mode emulation — gesture, 2-button, or 3-button, without creating a virtual device per shape
- Landscape home-screen and widget shots (opt-in) — works around the launcher refusing to rotate on a phone profile, and marks any shot taken that way in the report
Locale & Accessibility Matrix
- Run your app across languages x font scales x display sizes x orientations, capturing every combination
- Language switching uses the official per-app locale API (Android 13+) — no root, no reboot, works on Play system images
- Built-in pseudolocales:
en-XA (accented, ~30% longer text) finds truncation, ar-XB (bidi) finds RTL layout bugs — both without a translator
- Your device is always put back, including when you cancel the run or VS Code crashes mid-sweep
- Reset Device Display & Language Overrides — a panic button if a device is ever left in a modified state
Physical Phone Support
- Guided USB setup — step-by-step walkthrough: Developer Options → USB Debugging → authorize connection
- Wireless ADB — connect devices over Wi-Fi via TCP/IP or Android 11+ wireless debugging with pairing code
- QR code pairing — scan a QR code to pair instantly (Android 11+), no manual IP/port entry needed
- Unauthorized phones appear in the sidebar with a one-click "How to Connect" guide
- Auto-notification when a phone is plugged in without USB debugging enabled
App Management
- List installed apps with interactive action menu (launch, stop, clear data, uninstall)
- Launch App — start any installed app by package name
- Force Stop — kill a running app
- Clear App Data — wipe app storage, cache, and login state
- Uninstall — remove apps from the device
- App Logcat — open a logcat panel filtered to a specific app's logs
Connected Devices
- Live-updating list of all connected devices (emulators + physical USB + Wi-Fi devices)
- Active device selector — click the status bar to switch the active device
- Shows unauthorized and offline devices with contextual status messages
- Configurable polling interval (default: 3 seconds)
ADB Controls
- Install APK — select and install
.apk files with one click
- Screenshot — capture and save device screenshots as PNG
- Screen Recording — record device screen to MP4
- ADB Shell — open an integrated terminal with full shell access
Logcat Viewer
Real-time log viewer in a dedicated webview panel:
- Package filtering — show logs from a specific app only
- Regex search — filter with
/regex/ patterns or plain text
- Priority filtering (Verbose, Debug, Info, Warning, Error, Fatal)
- Export logs to file for bug reports and sharing
- Pause / resume streaming
- Color-coded output by log level with highlighted stack traces
- Auto-scroll with manual override
- Configurable max line count, font size, and line wrapping
Screen Mirror
Live device display inside VS Code — works for emulators and physical devices:
- scrcpy integration — if installed, launches with 30+ FPS, full touch and keyboard support
- Swipe gestures — click-and-drag to scroll, fling, and swipe
- Touch input forwarding — click to tap
- Navigation buttons (Back, Home, Recents)
- FPS counter for monitoring performance
- Optimized screencap fallback (~3 FPS when scrcpy is unavailable)
Device File Explorer
Browse the device filesystem from the sidebar:
- Lazy-loading directory tree with configurable root path
- Create folders on the device
- Rename files and folders
- Open text files directly in VS Code
- Download files from device to local machine
- Upload files from local machine to device
- Delete files and directories on device
- Toggle hidden file visibility
Getting Started
Prerequisites
- VS Code 1.85 or later
- Java 17+ (JDK) — required by Android SDK tools
- Android Studio is NOT required — the extension handles SDK setup
Install
Search "Caspian Emulator" in the VS Code Extensions panel, or:
code --install-extension caspian-emulator-1.4.0.vsix
First Launch
- Click the phone icon in the Activity Bar (left sidebar)
- If no Android SDK is detected, you'll see two options:
- Download & Install Android SDK — fully automated setup (~5 GB download)
- Configure Existing SDK — point to an existing SDK installation
- After setup, your virtual devices appear in the sidebar — click play to launch
Keyboard Shortcuts
| Shortcut |
Command |
Ctrl+Shift+L |
Show Logcat |
Ctrl+Shift+D |
Select Active Device |
Ctrl+Shift+O |
Show Output Log |
Settings
All settings are under the caspian namespace. Open VS Code Settings and search "caspian".
| Setting |
Type |
Default |
Description |
caspian.androidSdkPath |
string |
"" |
Android SDK root path. Leave empty for auto-detection. |
caspian.emulatorArgs |
string[] |
[] |
Extra arguments passed to emulator on launch. |
caspian.logcat.maxLines |
number |
10000 |
Maximum lines retained in the logcat viewer. |
caspian.logcat.fontSize |
number |
13 |
Font size in the logcat viewer (pixels). |
caspian.logcat.wrapLines |
boolean |
false |
Wrap long lines in the logcat viewer. |
caspian.scrcpyPath |
string |
"" |
Path to scrcpy binary. Leave empty for auto-detection. |
caspian.deviceTracker.interval |
number |
3 |
Device polling interval in seconds (1–30). |
caspian.fileExplorer.showHidden |
boolean |
true |
Show hidden files (dotfiles) in file explorer. |
caspian.fileExplorer.defaultPath |
string |
"/" |
Default root path when browsing device files. |
caspian.autoSelectDevice |
boolean |
true |
Auto-select newly connected devices. |
caspian.emulator.coldBoot |
boolean |
false |
Always cold boot emulators (ignore snapshots). |
caspian.emulator.checkHostMemory |
boolean |
true |
Warn when the host has less free memory than the AVD needs. |
caspian.emulator.memoryHeadroomMb |
number |
1024 |
Memory to leave for the host beyond the emulator's requirement. |
caspian.emulator.checkAcceleration |
boolean |
true |
Check for WHPX/HAXM/KVM before the first launch of a session. |
caspian.emulator.captureLog |
boolean |
true |
Capture emulator output so startup failures can be reported. |
caspian.emulator.bootTimeoutSec |
number |
180 |
How long to wait for Android to finish booting before reporting a stall (30–900). |
caspian.emulator.watchHostMemory |
boolean |
true |
Warn when host memory runs low while an emulator is running. |
caspian.emulator.lowMemoryFloorMb |
number |
512 |
Free memory below which the running-emulator warning fires. 0 disables it. |
caspian.avd.checkGuestRam |
boolean |
true |
Flag virtual devices with less RAM than their system image needs. |
caspian.avd.playStoreStrictAspect |
boolean |
false |
Enforce Play's documented 16:9 rule. Most modern phones are taller. |
caspian.captureDirectory |
string |
"${workspaceFolder}/.caspian/captures" |
Where capture runs are saved. Supports ${workspaceFolder} and ~. |
caspian.capture.openAfterCapture |
boolean |
true |
Open the report when a capture run finishes. |
caspian.emulator.gpuMode |
string |
"auto" |
GPU rendering mode passed as -gpu. Use swiftshader if screenshots come out black. |
caspian.emulator.gpuFallback |
boolean |
true |
Retry with software rendering when a launch fails with a graphics error. |
caspian.avd.preferInstalledSystemImage |
boolean |
true |
Use the newest installed system image at or above a preset's API level instead of downloading the exact one. |
caspian.capture.useDemoMode |
boolean |
true |
Use screenshot mode during capture runs. |
caspian.capture.settleDelayMs |
number |
500 |
Extra delay after the screen stops changing, before capturing. |
caspian.capture.maxAspectRatio |
number |
2 |
Maximum long/short ratio accepted when validating captures. |
caspian.capture.fontScales |
number[] |
[1, 1.3] |
Font scales preselected in the matrix. |
caspian.capture.locales |
string[] |
[] |
Locale tags offered in the matrix, e.g. en-US, ar. |
caspian.capture.tabletTrickForLandscape |
boolean |
false |
Lower the density to force a landscape home-screen shot. Marked in the report. |
caspian.capture.detectLeftoverOverrides |
boolean |
true |
Check connecting devices for overrides left by an interrupted run. |
caspian.demoMode.clock |
string |
"1000" |
Clock shown in screenshot mode (24-hour HHMM). |
caspian.demoMode.batteryLevel |
number |
100 |
Battery percentage shown in screenshot mode. |
caspian.demoMode.signalLevel |
number |
4 |
Signal bars shown in screenshot mode (0-4). |
caspian.demoMode.hideNotifications |
boolean |
true |
Hide notification icons in screenshot mode. |
caspian.demoMode.hideStatusIcons |
boolean |
true |
Hide alarm, Bluetooth, location, and other status icons. |
Commands
Open the Command Palette (Ctrl+Shift+P) and type "Caspian" to see all commands:
| Command |
Description |
| Caspian: Download & Install Android SDK |
Download SDK tools, emulator, and system image automatically |
| Caspian: Setup Android SDK |
Configure or browse for an existing SDK installation |
| Caspian: Connect Phone via USB |
Step-by-step guide to enable USB debugging |
| Caspian: Connect Device via Wi-Fi |
Connect over TCP/IP or Android 11+ wireless debugging |
| Caspian: Pair Device with QR Code |
Scan a QR code to pair wirelessly (Android 11+) |
| Caspian: Select Active Device |
Choose the active device for all commands |
| Caspian: Create AVD |
Create a virtual device from presets or custom image |
| Caspian: Clone AVD |
Duplicate an existing virtual device |
| Caspian: Launch Emulator |
Start an emulator for a selected AVD |
| Caspian: Cold Boot Emulator |
Launch without loading snapshots |
| Caspian: Stop Emulator |
Stop a running emulator |
| Caspian: Delete AVD |
Delete a virtual device |
| Caspian: Edit AVD Configuration |
Open AVD config.ini in the editor |
| Caspian: Install APK |
Install an APK on a connected device |
| Caspian: List Installed Apps |
View and manage installed apps |
| Caspian: Launch App |
Launch an app by package name |
| Caspian: Force Stop App |
Kill a running app |
| Caspian: Clear App Data |
Wipe app storage and preferences |
| Caspian: Uninstall App |
Remove an app from the device |
| Caspian: Show Logcat |
Open the live logcat viewer |
| Caspian: Show App Logcat |
Open logcat filtered to a specific app |
| Caspian: Show Emulator Screen |
Open the live screen mirror |
| Caspian: Take Screenshot |
Capture a device screenshot as PNG |
| Caspian: Record Screen |
Record device screen to MP4 |
| Caspian: Open ADB Shell |
Open an ADB shell terminal |
| Caspian: Create Folder on Device |
Create a new directory on the device |
| Caspian: Rename File on Device |
Rename a file or folder on the device |
| Caspian: Open File from Device |
View a remote text file in the editor |
| Caspian: Download File from Device |
Pull a file from device |
| Caspian: Upload File to Device |
Push a local file to the device |
| Caspian: Delete File on Device |
Delete a file or directory on the device |
| Caspian: Toggle Screenshot Mode |
Clean status bar for store screenshots |
| Caspian: Capture Store Screenshots |
Capture portrait and landscape into a run folder |
| Caspian: Run Locale & Accessibility Matrix |
Sweep languages, font scales, and display sizes |
| Caspian: Open Capture Folder |
Reveal the capture directory |
| Caspian: Set Display Cutout (Notch) |
Emulate a corner, double, punch-hole, tall, or waterfall cutout |
| Caspian: Set Navigation Mode |
Switch between gesture, 2-button, and 3-button navigation |
| Caspian: Reset Device Display & Language Overrides |
Undo any leftover device changes |
| Caspian: Check Device Configuration |
Diagnose and repair an AVD's display and RAM |
| Caspian: Repair Virtual Device |
Stop cleanly, cold boot, or wipe a stuck emulator |
| Caspian: Check Emulator Acceleration |
Verify WHPX, HAXM, or KVM is available |
| Caspian: Show Emulator Launch Log |
Open the captured emulator output |
| Caspian: Show Output Log |
Open the diagnostics output channel |
Documentation
Requirements
| Requirement |
Details |
| VS Code |
1.85 or later |
| Java |
JDK 17+ (Eclipse Adoptium) |
| Disk Space |
~5 GB for SDK auto-download (not needed if SDK already installed) |
| Android Studio |
Not required |
| OS |
Windows 10+, macOS (Intel & Apple Silicon), Linux (x86_64) |
License
MIT
| |