Every Appium test runs on one of three things: a real physical device, an Android emulator, or an iOS Simulator. The naming matters — "emulator" and "simulator" are not synonyms, and neither is a replacement for a real device. Choosing the wrong environment for the wrong test is one of the most common mistakes in mobile QA. This lesson explains what each environment actually is and how to decide which to use.
Android Emulators
The Android Emulator is a full system emulator. It uses a virtual machine (QEMU under the hood) to emulate an ARM or x86 CPU, RAM, storage, and all the peripherals of a real Android device. The emulator runs a complete Android OS image, including the full Linux kernel.
Because it emulates hardware, the Android Emulator can run app code that is not compiled for the host machine's architecture. You can run an ARM APK on a macOS Apple Silicon machine through emulation, though it is slower than running the same APK natively on x86.
Strengths:
- Free, runs on any developer machine
- Easily scriptable — start, run, stop, delete via
emulatorCLI - Perfectly repeatable environment: same AVD config gives the same device every time
- ADB gives you root-level access: inject GPS coordinates, simulate low battery, change network conditions
Limitations:
- Significantly slower than real devices (though hardware acceleration with HAXM or KVM helps)
- Cannot test hardware sensors authentically: camera shows a virtual scene, GPS must be injected, NFC is unavailable
- Does not replicate OEM customisations — Samsung One UI, MIUI, or OnePlus OxygenOS will never match a stock emulator
iOS Simulators
The iOS Simulator is fundamentally different from the Android Emulator. It is not an emulator — it does not emulate ARM hardware. Instead, it compiles the app for the Mac's native architecture (x86_64 or ARM64) and runs it inside a sandboxed macOS process. The Simulator is a simulation of iOS behaviour, not a replication of iOS hardware.
This architectural decision makes the Simulator very fast — apps launch in seconds. But it also means the Simulator has hard limitations:
What the Simulator cannot do:
- Test the real camera (photos are served from the Simulator's own album)
- Test Face ID or Touch ID in any meaningful way (it can mock the authentication result, but not the sensor)
- Test NFC, Bluetooth hardware, barometer, proximity sensor
- Replicate the exact rendering pipeline of a physical display
- Install apps from TestFlight or the App Store
Strengths:
- Instant startup compared to Android Emulator
- Multiple Simulator instances can run in parallel on one Mac
xcrun simctlgives command-line control over installation, app data, permissions, and device state- No Apple Developer account required
Real Devices
Real devices provide the only ground truth. They run actual hardware, actual OEM software, and actual iOS or Android builds. Tests that pass on emulators/simulators but fail on real devices are common, and the reverse is rare.
Real devices are essential for:
- Hardware-dependent features (camera, NFC, biometrics, GPS accuracy)
- OEM skin compatibility testing (Samsung, Xiaomi, Huawei)
- Performance profiling and rendering benchmarks
- Network conditions testing on actual cellular radios
- Crash reproduction that only manifests under real memory pressure
Managing real devices:
- A USB-connected device is the simplest setup — ADB connects automatically on Android, and Xcode/Appium connects via WDA on iOS
- Remote real device labs (BrowserStack, Sauce Labs, AWS Device Farm) let you run against hundreds of device models without owning them
- In-house device labs require physical maintenance (charging, OS updates, storage cleanup)
Decision framework
Use this to pick the environment for a given test:
| Test type | Best environment |
|---|---|
| Fast CI regression, no hardware | Emulator / Simulator |
| OEM skin compatibility | Real Android devices (by OEM) |
| Hardware features (camera, NFC, biometrics) | Real device only |
| Release sign-off testing | Real devices (representative sample) |
| Parallel CI across many OS versions | Cloud device farm |
| Local development and debugging | Emulator / Simulator |
A mature mobile test strategy uses all three environments: emulators and simulators in CI for fast feedback, cloud real devices for pre-release matrix testing, and a small in-house device lab for issues that require hands-on debugging.
Telling Appium which environment to target
You specify the target via capabilities. For a locally running Android emulator:
UiAutomator2Options options = new UiAutomator2Options();
options.setDeviceName("emulator-5554"); // from `adb devices`
options.setPlatformVersion("13");
options.setApp("/absolute/path/to/app.apk");For a real iOS device:
XCUITestOptions options = new XCUITestOptions();
options.setUdid("00008101-001A2B3C4D5E6F78"); // from Xcode Devices window
options.setPlatformVersion("17.2");
options.setApp("/absolute/path/to/app.ipa");The capabilities are the only thing that changes between environments. Your test logic stays the same.