World’s largest virtual agentic engineering & quality conference

WHENAUG 19-21
WHEREVirtual · Global
Register Now
Mobile App TestingAutomation

Android App Testing: Build a Device Matrix From Real Data

A reproducible method for deciding which Android API levels and which OEM devices belong in your test matrix, built on verified distribution data.

Author

Wasiq Bhamla

Author

Author

Shivam Singh

Reviewer

Last Updated on: August 7, 2026

Key Takeaways

An Android app testing device matrix is the set of API level and OEM combinations you actually run tests against. Build it by ranking real distribution data on two axes, Android version share and device vendor share, then tiering the intersections into P0, P1, and P2 by the cumulative percentage of your users each tier covers.

What Goes Into an Android Device Matrix?

  • API level axis: The share of live devices per Android version. StatCounter put Android 16 first worldwide in July 2026 at 25.71%, while every version from Android 13 downward still summed to 43.37%.
  • OEM axis: Device vendor share in the regions you serve. StatCounter put Samsung first among Android makers in July 2026 at 19.14% of all mobile devices, with Xiaomi second at 10.13%.
  • Vendor skins: One UI, HyperOS, and ColorOS layer their own background and permission behavior over stock Android, so an OEM device tests firmware behavior an emulator cannot reproduce.
  • Coverage target: Each tier states the percentage of the installed base it covers, which turns device count into a number you can defend in a planning review.
  • Worldwide distribution data is a starting prior. Where your Play Console install base disagrees with it, your own numbers win.

How Many Devices Are Enough for Android App Testing?

Enough is whatever covers a share of your installed base you are willing to state out loud. Summing StatCounter's July 2026 worldwide shares, the top four Android versions reach 71.09% of devices, so pairing those with the top three Android OEMs gives a matrix of eight to twelve devices. Running that matrix on real hardware is what TestMu AI's real device cloud is for.

The Device Matrix Problem in Android App Testing

Summing every Android version from 13 downward in StatCounter's July 2026 worldwide Android version share gives 43.37% of devices. Most Android app testing plans are built from whatever handsets happen to be in the team's desk drawer.

This creates a specific failure mode. Development happens against the newest API level because Google Play requires it, while close to half the installed base runs versions that are three or four releases behind.

Teams already know fragmentation exists. What they lack is a repeatable way to turn it into a device list someone can sign off on, which is what the rest of this guide builds.

  • Device choice is usually inherited from whoever set up the last test plan, then left alone.
  • Coverage is expressed as a device count, so nobody can tell whether twelve devices is generous or negligent.
  • The matrix rarely changes when a new Android version ships, so it drifts further from the installed base every quarter without anyone noticing.
  • Emulator-only pipelines miss the OEM firmware behavior that produces a large share of field crashes.

Where the Real Android Distribution Data Lives

Before you can rank API levels you need a source, and the obvious one no longer works. The Android distribution dashboard no longer publishes a platform version breakdown. It now carries only Vulkan and OpenGL ES distribution tables, and its stated collection window ended on November 24, 2025.

The distribution figures that Android Studio shows in its New Project wizard come from a JSON file Google publishes separately. Fetching that file directly on August 7, 2026 returns this:

$ curl -sI https://dl.google.com/android/studio/metadata/distributions.json

HTTP/1.1 200 OK
Content-Length: 21101
Date: Fri, 07 Aug 2026 11:12:46 GMT
Last-Modified: Wed, 10 Dec 2025 23:26:48 GMT

$ curl -s https://dl.google.com/android/studio/metadata/distributions.json \
    | jq '[.[] | .apiLevel] | max'

36

The Android Studio distribution file was last modified in December 2025 and tops out at API level 36, but Android 17 shipped as API level 37 on June 16, 2026 per the Android Developers Blog. The distribution data a developer sees while choosing minSdk inside the IDE predates the current Android release and does not contain it.

That is workable as long as you know it.

SourceRefresh cadenceUse it for
Android Studio distributions.jsonIrregular; last modified December 2025Cumulative minSdk reach, because it is Google's own basis for the IDE recommendation
StatCounter GlobalStatsMonthly, with per-country breakdownsCurrent version mix and OEM share, including the regional splits that drive device choice
Your Play Console install baseContinuousThe final word. It describes your users rather than the global average

In Play Console, the numbers you need are on the Statistics page: set the metric to active devices, then break it down by Android version and again by device model. The device catalog gives you the OEM rollup for the second axis.

Note

Note: Android version share tells you what to test. Getting the hardware to test it on is the other half. TestMu AI gives you 10,000+ real Android and iOS devices with no lab to maintain. Start testing free

Axis One: Ranking Android API Levels

This table combines the July 2026 worldwide version mix from StatCounter with the cumulative reach implied by Google's Android Studio distribution file.

Android versionAPI levelShare, July 2026minSdk reach
Android 17370.35%Not present in distributions.json
Android 163625.71%7.4%
Android 153517.46%26.7%
Android 143413.04%43.9%
Android 133314.88%57.8%
Android 123110.14%69.2%
Android 11308.2%82.9%

The two right-hand columns answer different questions. Share tells you what to test. The minSdk reach column, derived from Google's per-API-level figures, tells you what you give up by refusing to support a level at all.

The Android 17 row shows the staleness problem in one line. It has real users at 0.35% in the StatCounter data, and no entry at all in the file Android Studio reads.

Android 13 is the row that catches teams out. It sits fourth by recency but third by share at 14.88%, ahead of Android 14.

A separate constraint comes from the store. Per Google Play target API level requirements, new apps and app updates must target Android 16 (API level 36) or higher from August 31, 2026, with an extension available to November 1, 2026, while existing apps must target API level 35 or higher to stay available to new users on newer devices.

That requirement governs what you compile against, not what you run on.

Axis Two: Ranking Android OEMs

Two devices on the same API level can behave differently, so the second axis uses worldwide mobile vendor market share for July 2026. StatCounter reports vendor share across all mobile devices, so the right-hand column rebases each figure against Android's 68.38% share of mobile in the same month to give its approximate share of Android devices.

Android OEMShare of all mobileApprox. share of AndroidSkin
Samsung19.14%28.0%One UI
Xiaomi10.13%14.8%HyperOS
Vivo5.79%8.5%Funtouch OS / OriginOS
Oppo5.7%8.3%ColorOS
Realme4.14%6.1%Realme UI
Motorola3.99%5.8%My UX
Google Pixel1.63%2.4%Stock Android

One methodological note before you use this table. StatCounter's vendor dataset includes an Unknown bucket at 10.34% for July 2026, which would otherwise rank third. It is unidentified traffic rather than a manufacturer, so exclude it when ranking real OEMs and treat the rebased column as approximate for the same reason.

The Pixel row deserves attention for the opposite reason. At an estimated 2.4% of Android devices it is a rounding error in the installed base, yet it is the device most Android engineers develop and test on. Stock Android is the least representative build in the ecosystem.

Vendor skins matter because they change runtime behavior your app depends on:

  • Aggressive battery optimization on several OEM skins terminates background work and delays notifications in ways stock Android does not.
  • Permission dialogs and autostart managers differ per skin, so an onboarding flow verified on a Pixel can stall on a device with an extra vendor-level prompt.
  • Default fonts, display density, and system gesture areas vary, which moves layout boundaries and changes what a screenshot test considers a regression.
  • Regional mix reorders this whole table, so pull the same StatCounter vendor report filtered to each country that matters to you and weight the ranking by that country's share of your install base.

Screen geometry is a third axis. Per StatCounter screen resolution stats, the most common worldwide mobile resolution in July 2026 was 414x896 at 13.23%, followed by 360x800 at 9.14%, and density buckets vary independently of resolution, which this guide to DPI and screen resolution covers in depth.

Building the Matrix: P0, P1, and P2 Tiers

With both axes ranked, the matrix is their intersection, tiered by how much of the installed base each tier accounts for. The tiers below use worldwide July 2026 figures; substitute your own analytics wherever you have them.

  • Rank Android versions by share and keep adding rows until you pass your coverage target. The top four versions reached 71.09% in July 2026.
  • Rank OEMs by share in your priority regions, excluding the Unknown bucket, and keep the top three to five.
  • Within each OEM, pick the model with the highest install count in your Play Console device catalog, not the newest flagship. A Galaxy A-series handset and a Galaxy S Ultra share a skin but differ on chipset, RAM, and thermal headroom.
  • Pair the highest-share version with the highest-share OEM to form P0, and require every release to pass on that tier.
  • Fill P1 with the next combinations by share, plus one deliberately old device that still sits above your minSdk floor.
  • Put form factor outliers in P2, meaning a tablet, a foldable, and a low-RAM budget handset.
  • Write the cumulative coverage percentage next to each tier, because that number is what justifies the device count.
TierCompositionExecution targetWhen it runs
P0Top two Android versions on the top two OEMs, about four devicesReal devices. OEM firmware behavior is the whole point of this tierEvery pull request and release candidate. A failure here blocks the release
P1Next three to four version and OEM pairs, including one device near the minSdk floorMixed. Emulators for logic and layout, real devices for the OEM-specific pathsNightly and before every release. A failure here is triaged, not automatically blocking
P2Tablet, foldable, low-RAM handset, and any region-specific deviceReal devices for foldables and low-RAM; emulators are acceptable for tablet layoutWeekly and before major releases that touch layout or background work

Now do the coverage arithmetic, one axis at a time. A P0 of Android 16 and Android 15 covers 43.17% of the version axis (25.71 + 17.46), and Samsung plus Xiaomi covers an estimated 42.8% of the OEM axis once both are rebased against Android's share of mobile.

Report those two numbers separately and resist the temptation to multiply them. The axes are correlated, because newer Android versions are concentrated on newer and more expensive handsets, so 43.17% times 42.8% understates real cell coverage by an unknown margin. Two honest per-axis figures beat one invented product.

Adding Android 14 and 13 to P1 lifts version coverage to 71.09%, and adding Vivo lifts OEM coverage to roughly 51%. That is the shape of the curve: the first four devices buy most of the coverage, and each device after the eighth buys progressively less.

Tiering exists to protect feedback latency. P0 has to stay small enough that a pull request still returns a verdict in minutes, while P2 runs weekly and can afford to be broad. When you need month-over-month share movement to set your promotion threshold, Android device statistics tracks how these populations shift.

What Actually Breaks at Each API Level

A matrix is only worth running if each row can fail differently from the others.

Android 13 (API 33) introduced a runtime notification permission. Google's notification permission documentation states that on Android 13 or higher an app's notifications are off by default, and the app must wait to send notifications until the user grants POST_NOTIFICATIONS.

That single change splits a notification test into two paths, granted and denied, and only devices on API 33 or higher exercise it.

Android 15 (API 35) changed display and background rules for apps targeting it. Per Google's Android 15 behavior changes, apps targeting API 35 are edge-to-edge by default, and portions of the app may be obscured unless insets are handled.

  • Data sync foreground services are limited to a total of 6 hours in a 24-hour period, after which the system calls the service's onTimeout method.
  • BOOT_COMPLETED receivers can no longer launch dataSync, camera, mediaPlayback, phoneCall, mediaProjection, or microphone foreground services.
  • TLS versions 1.0 and 1.1 are disallowed for apps targeting Android 15, which surfaces as a network failure rather than a UI defect.
  • Requesting audio focus requires the app to be the top app or to be running a foreground service, otherwise the request returns AUDIOFOCUS_REQUEST_FAILED.

Android 17 (API 37) tightened large screen behavior. The Android Developers Blog announcement for Android 17 states that it removes the developer opt-out for orientation and resizability restrictions on large screen devices, which promotes tablets and foldables from optional to required.

Map each of these to the tier that covers it. Notification permission paths belong in P0 because they gate re-engagement, foreground service timeouts belong in P1 because they need longer runs, and large screen resizability belongs in P2 alongside the tablet and foldable.

Automated Android App Testing Across the Matrix

Automated Android app testing divides along one line before it divides along any other. Google's testing fundamentals guide states that the most important distinction for app developers is where tests run.

That line decides which parts of your matrix a test can even reach. Local tests never touch a device, so no cell of the matrix applies to them.

PropertyLocal testsInstrumented tests
Where they runThe development machine's Java Virtual MachineAn Android device, physical or emulated, in Google's wording
Speed and fidelityGoogle describes them as usually small and fastGoogle states they have more fidelity than local tests, though they run much more slowly
Android framework accessNone, which is what keeps them fastFull, including permissions, storage, and background execution
Matrix relevanceNone. A JVM has no API level and no OEM skinTotal. Every cell in the matrix is an instrumented run

Google recommends running instrumented tests only in cases where you must test against the behavior of a real device. That recommendation is what keeps a twelve-device matrix affordable, because it caps how much work has to cross the device boundary at all.

Applied to the tiers, that gives a straightforward allocation:

  • Business logic, view models, formatters, and parsing stay in local tests and never enter the matrix at all.
  • The API-level behaviors from the previous section are instrumented by definition, because permission prompts, foreground service timeouts, and insets only exist on a device.
  • P0 carries a thin instrumented smoke suite: launch, sign in, the primary conversion path, and the notification permission path.
  • P1 carries the full instrumented regression suite, which is where the wall-clock cost lives and where parallel execution pays for itself.
  • P2 carries layout and form-factor checks, which are the tests most sensitive to density buckets and folded versus unfolded state.

One myth to drop before you size any of this. Google publishes no numeric test-pyramid proportions. Its strategy guidance describes many small tests and relatively few big tests, and calls that a baseline that does not need to be followed strictly, so any precise split you see quoted is somebody's house rule presented as a standard.

Test your website on the TestMu AI real device cloud

Framework Fit: Espresso, UI Automator, and Appium

The matrix decides what you run on; the framework decides what you can write. Espresso, UI Automator, and Appium differ mainly on process boundary, which sets their limits.

CapabilityEspressoUI AutomatorAppium
Process scopeInside the app process; Google states it cannot test external processesOutside the app process, covering user apps and system appsOutside the app, driving the device through the UiAutomator2 driver
SynchronizationAutomatic; Google describes it as removing waits, syncs, sleeps, and polls by acting only when the UI is at restManual waits are usually requiredExplicit waits, managed by the test author
Cross-app flowsNot supportedSupported, including Settings and the launcherSupported
Needs app sourceYes; Google notes its full power is unlocked by those familiar with the codebase under testNo, which allows testing minified release buildsNo
Runs iOS tooNoNoYes, with one test structure across platforms

Espresso's core statement chains a matcher, an action, and an assertion, and Google documents its API surface as ViewMatchers passed to onView, ViewActions passed to perform, and ViewAssertions passed to check.

// Espresso: matcher, action, assertion in one chain
onView(withId(R.id.name_field))
    .perform(typeText("Steve"))
    .check(matches(isDisplayed()));

Espresso deliberately blocks direct access to activities and views, so there is no getView or getCurrentActivity in the API. Its synchronization guarantee also means only one UI action or assertion occurs at any given time, which is why it is reliable but a poor fit for cross-app journeys. The Espresso tutorial covers that API surface in more depth.

A common split keeps Espresso for developer-owned tests that run on every commit against a small P0 tier, and uses Appium for the broader matrix where the same suite must cover Android and iOS. Both can execute against a device cloud: Espresso ships as an app APK plus a test APK bound to a device list, while Appium selects devices through capabilities.

Running the Matrix Without Buying the Devices

A matrix built from the tables above needs eight to twelve physical devices spanning several OEMs and four Android versions, kept charged, updated, and connected. That is a procurement and maintenance problem before it is a testing problem.

Three ways to solve it are worth weighing. A self-hosted device farm gives you full control and fixed hardware, at the cost of capital spend plus the ongoing work of OS updates and failed handsets. Firebase Test Lab is the Google-native option and integrates tightly with Android tooling, though its catalog leans toward stock Android and covers fewer OEM skins than the vendor mix above demands. A commercial real device cloud rents the OEM breadth directly.

TestMu AI's real device cloud covers the third path. It provides 10,000+ real Android and iOS devices spanning Samsung, Xiaomi, Oppo, Vivo, Motorola, OnePlus, and Google Pixel among 20+ manufacturers, with Android coverage from Android 9 through the current release and minor version variants included where behavior differs.

Four capabilities map onto specific rows of the matrix:

  • Foldables including Galaxy Z Fold and Z Flip cover the P2 large screen row that Android 17 resizability changes now make mandatory.
  • Per-session device logs, crash reports, and ANR logs isolate whether a failure is a genuine regression or specific to one OEM build, which is the daily triage question on a multi-device matrix.
  • Network condition simulation exercises the low-bandwidth paths that budget devices in emerging markets actually experience.
  • New flagship devices are added within weeks of market release, so P0 can track the devices your users are moving to.

Selecting a matrix cell in an automated run is a capability change, so switching cells needs no test code edit. The Appium with Java documentation shows the device and platform version capabilities in full.

// One matrix cell: OEM device + API level, selected by capability
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("deviceName", "Galaxy S20");
caps.setCapability("platformVersion", "11");
caps.setCapability("platformName", "Android");
caps.setCapability("isRealMobile", true);
caps.setCapability("build", "Android Device Matrix - P1");

One caveat if you also run Appium against your own hardware. The UiAutomator2 driver documents that appium:deviceName is not used to select the device under test and that appium:udid must always be set for parallel runs. A cloud grid resolves deviceName and platformVersion against its own catalog instead, so the same capability name behaves differently on a local Appium server.

Because each cell is just a capability set, the pipeline can iterate the matrix as a data structure. Running those cells concurrently is what keeps a twelve-device tier from adding twelve times the wall clock, and this walkthrough of Appium parallel testing covers that setup.

Refreshing the Matrix on Triggers

A matrix decays. StatCounter's worldwide Android version series shows Android 16 going from 0.81% in July 2025 to 25.71% in July 2026, passing Android 15 in March 2026 at 21.83% against 20.51%, so any matrix frozen in mid-2025 was materially wrong within nine months.

Four triggers are worth wiring up:

  • A version in your install base crosses a share threshold you set in advance, for example 10%, which promotes it into P1.
  • A Google Play target API level deadline approaches, which changes what you compile against and adds a new behavior-change test pass.
  • Crash or ANR reports concentrate on a device or OS version that is absent from every tier, which is the clearest evidence the matrix has a hole.
  • A flagship launches in a region that matters to you, or a supported version falls below the threshold and can be retired from P1 down to P2.

Retirement is the step teams skip, and it is why matrices only ever grow. Set the removal threshold when you set the addition threshold, and record the coverage percentage after each revision so the trend is visible.

Run iOS + Android tests written by your AI agent.

Appium

Conclusion

Open Play Console, go to Statistics, set the metric to active devices, and break it down once by Android version and once by device model. Write down the top four versions and top three OEMs with their percentages. That table replaces the inherited device list and takes about ten minutes.

Then pair them into P0, P1, and P2 tiers, write the cumulative coverage for each axis next to each tier, and set the thresholds that will trigger the next revision.

To run those tiers without assembling a device lab, TestMu AI's app test automation platform executes Appium, Espresso, XCUITest, and Detox suites against real hardware, and the broader Android testing guide covers the test types that fill each cell once the matrix exists.

Author

...

Wasiq Bhamla

Blogs: 8

  • Twitter
  • Linkedin

Wasiq Bhamla is a Test Automation specialist having more than 15 years of experience in Manual and Automation testing. He has vast experience in automating Desktop, Web, API, Android, and iOS-based applications. He is also an active open-source contributor on GitHub, a freelancer, a mentor, and a blogger. You can also follow him on Twitter.

Reviewer

...

Shivam Singh

Reviewer

  • Linkedin

Shivam Singh is a Lead Member of Technical Staff at TestMu AI (formerly LambdaTest), architecting the Real Device Cloud that runs automated app and web tests on real Android and iOS devices. He designed the architecture for real-device app and web automation and wrote the microservices from scratch in Golang, including the XCUITest and Espresso execution layers for iOS and Android. His platform reached peak parallel concurrency of 150+ for app automation while handling roughly 500,000 tests a month, and he leads the team that keeps the automation grid running. He brings over eight years of engineering experience and holds a B.Tech in Computer Science.

Open in ChatGPT Icon

Open in ChatGPT

Open in Claude Icon

Open in Claude

Open in Perplexity Icon

Open in Perplexity

Open in Grok Icon

Open in Grok

Open in Gemini AI Icon

Open in Gemini AI

Copied to Clipboard!
...

3000+ Browsers. One Platform.

See exactly how your site performs everywhere.

Try it free
...

Write Tests in Plain English with KaneAI

Create, debug, and evolve tests using natural language.

Try for free
...
TestMu Conf 2026

World's largest virtual agentic engineering & quality conference

...

AUG 19-21, 2026

REGISTER NOW

Android Device Matrix FAQs

Did you find this page helpful?

More Related Blogs

TestMu AI forEnterprise

Get access to solutions built on Enterprise
grade security, privacy, & compliance

  • Advanced access controls
  • Advanced data retention rules
  • Advanced Local Testing
  • Premium Support options
  • Early access to beta features
  • Private Slack Channel
  • Unlimited Manual Accessibility DevTools Tests