Skip to main content
Create a remote Android emulator session, open the signed stream URL in a browser, install Android-compatible app artifacts, and release the session when finished. For CLI setup, see CLI Quickstart. For reusable app artifacts, see Assets. To show the signed session inside a product, see Embed a Simulator. For taps, gestures, text, keys, buttons, and other device controls, see Control a Simulator.

Create a session

The response includes the same fields as iOS sessions, with platform: "android". Use id with lifecycle, control, screenshot, and log operations; use url for the signed interactive stream. For full runnable SDK source, see newly-app/run-cloud-examples/sdk-ios-android.

Configure the session

Supported flags: If --inactivity-timeout is omitted, run.cloud uses a 60-second inactivity timeout. Set it to none to disable inactivity auto-close. Android sessions share one pool with Expo Go 54 preinstalled. No Expo SDK profile is required. To preview projects using another Expo SDK version, install your own development APK; its native runtime is independent of the preinstalled Expo Go app. The APK must support the emulator’s Android version and CPU architecture. Use @run-cloud/sdk 0.35.0 or newer for profile-free Android creation.

Install an app

Try the onboarding app without building an Android project:
Install a local build while creating the session:
Or upload once and reuse the artifact:
An HTTPS target resolves the system VIEW handler, normally the browser. A custom scheme resolves the exported activity that registered it. The success result identifies the session, device, and lease and echoes the complete input URI without normalizing its encoding. See Open URLs and Deep Links for authentication, the REST endpoint, a complete encoded example, and platform-specific errors.

Control the app

The CLI and SDK use normalized display coordinates from 0 to 1, with the origin at the top-left:
Each operation returns a correlated acknowledgement. Digital Crown and render-debug actions are not supported on Android. Use Control a Simulator for gestures, semantic keys, buttons, orientation, timeouts, cancellation, errors, and the complete capability matrix.

Inspect accessibility

Read the current nested hierarchy without exposing the signed viewer URL:
See Read the Accessibility Tree for the SDK, React embed, response schema, secure-value redaction, and test examples.

Capture a screenshot

Capture the current Android emulator display as PNG bytes:
Screenshots require an active, user-owned Android session. Responses are image/png and are never cached. The maintained Android app screenshot example builds a native fixture, installs it, validates the PNG, and releases the session:
It writes screenshots/run-cloud-proof.png. Building from source requires JDK 17 or newer and Android SDK 35 or newer; pass --app <path> to use a prebuilt APK.

Record screen video

Start an MP4 capture, stop it, and download it through the authenticated API:
The TypeScript equivalents are cloud.android.startRecording, getRecording, listRecordings, stopRecording, and downloadRecording. See Record a Simulator for lifecycle, idempotency, retention, release, and failure behavior.

Read emulator logs

Read retained logcat entries from the current lease, including the app, system, and crash buffers, or follow new entries:
Snapshots are restricted to the active, user-owned lease, return 200 lines by default, and accept --tail values from 1 to 1,000. --follow streams only new entries. Add --json for structured snapshot output or newline-delimited JSON while following. Snapshot JSON includes since, capturedAt, entries, and truncated. Snapshot and stream responses are never cached.

Inject camera and microphone input

Start the installed app’s camera or microphone receiver, then inject a deterministic prerecorded source:
Camera input accepts MP4 and QuickTime files up to 500 MB and loops until the source changes or the session ends. Microphone input accepts AAC, M4A, MP3, MP4-audio, and WAV up to 100 MB. Each result contains the user-owned source asset; delete it through runcloud asset delete or cloud.assets.delete() when the proof is complete.

Inspect sessions

list shows active sessions by default. Pass --all to include released sessions.

Release the session

Explicit release charges the final started minute and closes the Android emulator session. If the organization reaches its run.cloud credit ceiling, active sessions are closed automatically.