•
Drizz raises $2.7M in seed funding
•
Featured on Forbes
•
Drizz raises $2.7M in seed funding
•
Featured on Forbes
Logo
Schedule a demo
Blog page
>
How to Test an Android app: 5 Methods from Emulator to Real Devices

How to Test an Android app: 5 Methods from Emulator to Real Devices

Testing an Android app involves the Android Emulator, Espresso, ADB on physical devices, Google Play internal testing, and cloud real-device platforms.
Author:
Posted on:
May 15, 2026
Read time:
15 Minutes

There are five ways to test an Android app, and each one is useful at a different stage. The mistake most teams make is testing only on the emulator and wondering why users on Samsung and Xiaomi devices report bugs that never showed up in development.

Here's the full stack, from the fastest feedback loop to the most accurate real-world validation:

  1. Android Emulator (instant, in Android Studio)
  2. Espresso (automated UI testing, native)
  3. ADB on a physical device (plugged in via USB)
  4. Google Play internal testing (beta distribution)
  5. Cloud real-device testing (at scale, across the OEM matrix)

This is the Android companion to our iOS testing guide. Same structure, Android-specific.

1. Android Emulator

The Android Emulator ships with Android Studio. It creates an Android Virtual Device (AVD) that runs a full Android OS on virtual hardware. You pick a device profile (Pixel 8, Galaxy S24, Nexus 5X), select an Android version, and boot it.

As we covered in our emulator vs simulator guide, the Android Emulator is a true emulator. It replicates hardware: CPU, GPU, RAM, sensors. Modern x86 system images with hardware acceleration (Intel HAXM or KVM on Linux) run at near-native speed. Since Android 11, ARM binary translation lets even ARM-only apps run on x86 emulators.

What it catches: Functional bugs, layout issues across screen sizes, API integration errors, GPS/network/sensor simulation. The emulator supports custom GPS coordinates, network throttling (3G/4G/airplane mode), incoming call simulation, and battery state changes.

What it misses: OEM skins (Samsung One UI, Xiaomi HyperOS, Oppo ColorOS). The emulator runs stock Android. A layout that renders correctly on the emulator might break on a Samsung because One UI adds different navigation bar heights, font scaling defaults, and keyboard behavior. Real GPU rendering, touch latency on capacitive screens, and memory pressure from other apps running simultaneously are also invisible on the emulator.

When to use it: During active development. Every build-run-debug cycle. It's your daily driver.

2. Espresso (automated UI testing)

Espresso is Google's native Android UI testing framework. It runs inside the Android instrumentation test runner, giving it the fastest execution speed and deepest access to Android UI elements of any Android testing option. Tests are written in Java or Kotlin.

java
@Test public void loginWithValidCredentials() { onView(withId(R.id.email_field)) .perform(typeText("user@test.com"), closeSoftKeyboard());onView(withId(R.id.password_field))    .perform(typeText("secret123"), closeSoftKeyboard());‍onView(withId(R.id.login_button))    .perform(click());‍onView(withText("Welcome"))    .check(matches(isDisplayed()));‍}

Espresso's synchronization engine is its biggest advantage. It automatically waits for the UI thread to be idle, pending AsyncTasks to complete, and animations to finish before executing the next step. This eliminates most of the sleep() hacks that plague Appium tests.

What it catches: Functional UI bugs with high stability and speed. Espresso tests run in milliseconds per action because they execute inside the app process. They integrate directly into CI via Fastlane (gradle connectedAndroidTest) or Android Studio.

What it misses: Espresso is Android-only. If you support iOS, you need a separate suite (XCUITest or a cross-platform tool). It also uses R.id references, which means tests break when developers change view IDs. And it can't interact with system dialogs (permission prompts, OEM popups, notifications) because those live outside the app process.

When to use it: For fast, stable regression testing of Android-specific UI flows. Run in CI on every PR. Best for teams with Android developers who are comfortable writing Java/Kotlin tests.

3. ADB on a physical device

Connect an Android phone to your computer via USB, enable Developer Options and USB Debugging, and interact with it via ADB (Android Debug Bridge). You can install APKs (adb install app.apk), capture logs (adb logcat), take screenshots (adb screencap), and run Espresso tests directly on the device.

What it catches: Real hardware behavior that the emulator misses. How the app renders on a Samsung with One UI. How the keyboard behaves on a Xiaomi. How the app handles the device's actual RAM constraints. Touch target accuracy on a real capacitive screen. Battery drain under real usage.

What it misses: Only what your specific device misses. Testing on one Samsung Galaxy A14 doesn't tell you how the app behaves on a Pixel 8 or a Xiaomi Redmi Note 12. Physical device testing is accurate but narrow.

When to use it: During development for "does this actually work on a real phone?" checks. For debugging device-specific issues. For exploratory testing sessions where you need to interact with the real hardware.

4. Google Play internal testing

Google Play Console offers three testing tracks: internal testing (up to 100 testers, instant approval), closed testing (limited audience, review required), and open testing (public, review required). Upload an APK or AAB to the internal testing track, add testers by email, and they install via a Play Store link.

What it catches: Real-world installation issues (APK/AAB compatibility, Play Store delivery, update paths). Testers use the app on their own phones, their own networks, their own OEM skins. They find bugs that structured testing misses: "the app crashes when I switch from the checkout to my banking app and back," or "the text is too small on my Galaxy A14 because I use Large fonts."

What it misses: Like TestFlight on iOS, Google Play internal testing depends on tester effort. There's no automation, no structured test execution, no regression suite. It's distributed manual testing with self-selected coverage.

When to use it: Before every production release. Upload the release candidate, distribute to 20-50 internal testers, give them 3-7 days, collect feedback. For structured exploration, give testers a session charter with specific areas to focus on.

5. Cloud real device testing (at scale)

This is where the Android device matrix gets covered. Android's fragmentation is orders of magnitude larger than iOS: thousands of device models from hundreds of manufacturers, each running different OS versions with different OEM skins, different screen sizes, different RAM, and different GPU capabilities.

A cloud testing platform gives you access to real Samsung, Pixel, Xiaomi, OnePlus, Oppo, and Realme devices without maintaining a physical lab. You upload your APK and run tests across the matrix in parallel.

Drizz runs tests on real Android devices using Vision AI. Tests are written in plain English: "Tap on Login," "Type 'user@test.com' in the email field," "Scroll down until 'Checkout'," "Validate 'Order Confirmed' is visible." Vision AI reads the screen visually, so there are no Espresso R.id references to maintain. The same test works across Samsung, Pixel, and Xiaomi without device-specific selectors.

The popup agent handles the Android-specific OEM dialogs that other tools can't: Samsung's "Device Care" battery optimization, Xiaomi's "Security" popup on first launch, Oppo's "Battery Saver" notification, and Huawei's "Protected Apps" screen. These popups don't exist on emulators or stock Android. They only appear on real OEM hardware, and they block automated tests unless the tool handles them.

Self-healing adapts when layouts shift across devices. System commands like SET_GPS, KILL_APP, CLEAR_APP, and PRESS_DEVICE_BACK_BUTTON provide native device control during test execution.

What it catches: Device-specific bugs across the full OEM matrix. One team found that 23% of their test failures came from device-specific rendering differences. Samsung font scaling truncating labels, Xiaomi popup blocking flows, budget devices crashing on memory-intensive screens.

When to use it: Before every release. Run your regression suite, smoke tests, and critical flows across the device matrix. Emily Chen, a Director of Engineering, described the onboarding: "Setup took literally minutes. The team was incredibly helpful during onboarding, answering all our questions promptly."

How the 5 methods fit together

During development (daily): Emulator for fast iteration. Physical device via ADB for reality checks. Espresso in CI on every PR.

Before beta: Upload to Google Play internal testing. Distribute to 20-50 testers for 3-7 days.

Before production release: Cloud real-device testing across the OEM matrix (Samsung, Pixel, Xiaomi, budget devices). Run regression, smoke, and performance tests.

After release: Monitor crash-free rates with Crashlytics or Sentry. Feed production bugs into the regression suite.

For the complete testing strategy across both Android and iOS, see our test automation strategy. For a step-by-step beginner walkthrough, see how to do mobile app testing.

FAQ

Can I test an Android app without Android Studio?

Yes. You can sideload APKs via ADB without Android Studio, use cloud platforms like Drizz for real-device testing, or distribute builds via Google Play internal testing. But Android Studio's emulator and Espresso are the standard development-time tools.

What's the difference between Espresso and Appium for Android?

Espresso runs inside the app process (fast, stable, Android-only, uses R.id references). Appium runs outside the app (slower, cross-platform, uses selectors that break more often). Espresso is better for Android-specific regression. Appium is better for cross-platform coverage. Drizz avoids selectors entirely.

How many Android devices should I test on?

At minimum: one Samsung (One UI), one Pixel (stock Android), one budget device with 3-4 GB RAM, and one device running Android 13 or 14 (older OS). Check your Firebase Analytics for the actual device breakdown of your user base.

How do I test on different Android versions?

The emulator supports multiple API levels (create separate AVDs for Android 13, 14, 15). For real devices, use a cloud platform that provides access to devices running different OS versions. Test on at least your minimum supported API level and the latest version.

Is the Android Emulator good enough for testing?

For functional testing during development, yes. For pre-release validation, no. The emulator runs stock Android and can't reproduce OEM skins, real GPU rendering, manufacturer popups, or budget-device memory constraints. Test on real devices before release.

What is the best tool for automated Android testing?

Espresso for fast, native Android testing. Appium for cross-platform (Android + iOS) with full code control. Drizz for plain-English tests on real devices with Vision AI, no selectors, and automatic OEM popup handling.

‍

About the Author:

Schedule a demo