sodcalculator

10 Tech How-To

Android Emulators for App Testing & Automation

Guide 10-12155 · Updated · Step by step

Android emulators let businesses test apps and run automated UI checks without buying a rack of physical devices. This guide covers setting up an emulator, installing your app, writing and running automated tests, and integrating everything into a CI pipeline. You’ll need a computer with Android Studio or a standalone SDK, plus basic familiarity with the command line.

What You’ll Need

  • A computer running Windows, macOS, or Linux (8GB+ RAM recommended, 16GB for smoother performance)
  • Android Studio (includes the emulator and SDK tools) or the standalone Android command-line tools
  • Java Development Kit (JDK) 17 or newer
  • Your app’s APK or the source code if you plan to build it yourself
  • For automation: a test framework like Espresso, Appium, or Maestro (pick one based on your needs)

Step-by-Step

  1. Install Android Studio and the SDK. Download Android Studio from the official site and run the installer. During setup, accept the default SDK components. If you prefer command-line only, install the Android command-line tools and run sdkmanager to fetch the platform-tools and emulator packages.
  2. Create a virtual device (AVD). Open Android Studio, go to Tools > Device Manager, click Create Device. Choose a hardware profile (e.g., Pixel 7) and a system image (e.g., API 34, Android 14). Download the image if prompted. Give the device a name and click Finish.
  3. Start the emulator. In Device Manager, click the play button next to your AVD. The emulator window will open. Alternatively, from the terminal run emulator -avd YourDeviceName. Wait until the home screen appears—this can take a minute on first boot.
  4. Install your app. With the emulator running, build your app in Android Studio (Run > Run ‘app’) or install an existing APK using adb install app-debug.apk. Verify the app appears in the launcher.
  5. Write an automated UI test. For Espresso (native Android), add the test dependencies to your build.gradle file, then create a test class in app/src/androidTest/java/. For Appium, set up a test project in your preferred language (Java, Python, JS) and point it to the emulator’s address (usually http://localhost:4723).
  6. Run the test from the command line. For Espresso, use ./gradlew connectedAndroidTest. For Appium, start the Appium server, then run your test script (e.g., pytest test_login.py). The emulator will execute the test steps automatically.
  7. Capture screenshots and logs. Use adb exec-out screencap -p > screen.png to save a screenshot. For logs, run adb logcat -d > app.log. These artifacts help debug failures.
  8. Set up CI integration. In your CI tool (GitHub Actions, GitLab CI, Jenkins), add a job that creates an AVD (using sdkmanager and avdmanager), starts the emulator headless (emulator -no-window -no-audio), waits for boot (adb wait-for-device), then runs your test command. Store test reports as artifacts.
  9. Scale with multiple configurations. Create several AVDs with different API levels and screen sizes. Run tests in parallel by launching multiple emulators (each with a different -port). This catches device-specific bugs early.

Common Mistakes

  • Using the wrong system image. For testing, choose a Google APIs image (not a Play Store image) unless you specifically need Play services. Play Store images have restrictions on root access that can break automation.
  • Not waiting for the emulator to fully boot. The emulator may show the home screen but still be initializing. Always run adb wait-for-device and then poll sys.boot_completed before starting tests.
  • Ignoring screen resolution differences. Tests that pass on a Pixel 6 may fail on a tablet because element positions differ. Use resource IDs or accessibility labels instead of coordinates.
  • Running tests on the host CPU without acceleration. On Windows/macOS, ensure hardware acceleration (HAXM or Hyper-V) is enabled. Without it, the emulator is painfully slow and tests time out.
  • Forgetting to clean up after tests. Leftover test data can affect subsequent runs. Reset the device state between tests using adb shell pm clear package.name or by wiping the AVD data.

Tips

  • Use snapshots for speed. Boot the emulator once, configure it, then save a snapshot. Subsequent starts from the snapshot take seconds instead of minutes.
  • Keep your emulator image updated. New API levels and security patches matter. Recreate your AVDs periodically to match current devices.
  • Combine emulator and physical device testing. Emulators cover most scenarios, but real devices catch issues like battery drain, network variability, and hardware sensors. Use emulators for CI and physical devices for final QA.
  • Record test execution. Use adb shell screenrecord to capture video of a failing test. This is invaluable for reproducing bugs.
  • Use the emulator’s extended controls. Simulate network latency, battery level, and GPS location to test edge cases without extra hardware.

Troubleshooting

  • Emulator won’t start or is extremely slow. Check that hardware acceleration is enabled (BIOS setting for Intel VT-x/AMD-V). In Android Studio, go to Help > Check for Updates to ensure you have the latest emulator. If still slow, reduce the resolution and RAM in the AVD settings.
  • ADB can’t see the emulator. Run adb devices. If it shows as offline, restart adb with adb kill-server and adb start-server. If it doesn’t appear at all, ensure the emulator is running and the correct port (default 5554) is free.
  • App install fails with ‘INSTALL_FAILED_NO_MATCHING_ABIS’. Your APK contains native libraries for a different CPU architecture. Choose an AVD with the matching ABI (most modern images are x86_64). Rebuild your app for that architecture.
  • Tests fail with ‘No such file or directory’ for test results. Ensure the test runner is configured correctly in your build file. For Espresso, check that testInstrumentationRunner is set to androidx.test.runner.AndroidJUnitRunner.
  • Emulator crashes on startup. Delete the AVD and recreate it. Also check your system’s RAM and disk space—the emulator needs at least 2GB free. Try running with -no-snapshot to rule out snapshot corruption.

Frequently Asked Questions

Is an emulator as good as a physical device for testing?

For most UI and logic tests, yes. Emulators are faster to provision and integrate with CI. However, they can’t simulate real network conditions, GPS accuracy, or hardware sensors perfectly. Use a mix of both.

Which automation framework should I choose?

Espresso is best for native Android apps and integrates with Android Studio. Appium works across Android and iOS, useful if you have a cross-platform team. Maestro is a newer, simpler option that’s great for quick UI flows.

How do I test on multiple Android versions?

Create separate AVDs for each API level (e.g., 29, 31, 34). In CI, run your test suite against each AVD in parallel. This catches version-specific behavior changes.

Can I run the emulator on a server without a GPU?

Yes, use the -no-window and -no-accel flags, but it will be slow. For headless CI, enable software rendering with -gpu swiftshader_indirect. It’s slower but works.

How do I automate app permissions (like location or camera)?

Use adb shell pm grant package.name android.permission.ACCESS_FINE_LOCATION before the test. In Espresso, you can use GrantPermissionRule to handle runtime permissions automatically.

What’s the best way to handle flaky tests?

Add explicit waits for UI elements instead of fixed sleeps. Use Espresso.onView(...).check(matches(isDisplayed())) with a timeout. Also, ensure your app’s animations are disabled on the emulator (Settings > Developer options > Turn off animations).

Related

General steps for current mainstream versions; menus can differ by device and version. See the disclaimer or report an error.

More in this bed

The whole Tech How-To bed →