--- title: "Test an Android app" description: "What the Android template does, and why it cannot run yet." --- **Android environments are Beta and have no backend in this build.** No Android emulator hosts are configured, allocation fails closed with a reason, and no run can start. Nothing on this page describes something you can run today. Desktop is in the same position; iOS is on the waitlist. ## What it is for `android-app-qa` installs your APK on an Android environment, walks the flow you describe, screenshots every screen, and reports where it stopped working. Its output contract requires `flow_completed`, a `screens` array and `stopped_at`, plus a screenshot per screen and a recording of the walkthrough. The template ships and is returned by the gallery with its gate attached rather than hidden: ```json { "template": { "template_id": "android-app-qa", "environment_class": "android", "...": "…" }, "availability": { "status": "beta", "reason": "Android environments are in Beta. This template cannot be started until your workspace has Android Beta access — request it from Environments and we will tell you when it is on.", "gated_by_environment_classes": ["android"] } } ``` Hiding it would make the roadmap invisible. Rendering a start button on it would be a lie. So the gallery returns it with its gate, and a surface renders the gate. ## What happens if you try Allocation refuses before anything starts: ```json 409 { "detail": { "code": "environment_class_unavailable", "reason": "environment_class_unavailable", "what": "This run needs a android environment, which cannot start here.", "why": "Android environments are in Beta and are not running in this deployment yet, so runs cannot start.", "suggested_fix": "Run this Worker in a code or browser environment.", "fix_action": { "action": "request_capacity", "environment_class": "android" }, "environment_class": "android", "set_by": "control" } } ``` Check before you offer the option: ```ts const { classes } = await obol.workers.environments(); if (!classes.android.runnable) { classes.android.availability; // "beta" classes.android.reason; // the sentence to show a person classes.android.waitlist_joined // whether this workspace has asked } ``` `runnable` is the conjunction of availability, backend readiness and entitlement. Reading `availability` alone and treating `beta` as usable is the mistake this field exists to prevent. ## Until then A mobile web flow can be exercised in a browser environment today — see [Run browser QA](/workers/browser-qa). A native build cannot; there is no substitute for the emulator, and Obol does not offer one dressed up as something else.