minSdk, targetSdk, and compileSdk. The current release is Android 17 (API level 37, 2026), and the table below lists every version back to Android 1.0 with its API level, VERSION_CODES constant, codename, release year, and the share of active devices an app reaches if it requires that version. Coverage comes from Statcounter GlobalStats; the one-row-per-release format follows apilevels.com.
Which API level is which Android version?
Coverage measured August 2026 (Statcounter GlobalStats, mobile devices, worldwide). “Runs on” is cumulative: the share of devices on that version or newer — the reach of an app whoseminSdk is that API level.
The bolded row is the floor Duet ships. Duet — Modaal’s cross-platform parity framework for native iOS and Android apps — sets
minSdk = 26 in every scaffolded Android target’s Gradle files, with compileSdk = 36 and targetSdk = 36, so a new Duet app installs on ≈98.3% of active Android devices.
August 2026 device share by Android version, newest to oldest. The marked span is the reach of an app with minSdk 26.
How do you read this table?
- “Runs on” prices a
minSdkchoice. It is the sum of Statcounter’s monthly shares for that version and everything newer; requiring API 26 excludes the ≈1.7% of devices below it. - The source measures usage, not installs. Statcounter derives shares from web traffic across its network, so a phone used daily counts for more than one in a drawer. It is an independent proxy for the active install base, not Google’s own distribution data.
- Rows marked ”—” sit below Statcounter’s measurement floor for the month — each under 0.05% of traffic.
- Two rows can share a number. Android 13 and 12L both show 72.0% because 12L’s own share is 0.02%, which disappears in rounding.
- Codenames live on in the constants. Releases are branded by number, and each still carries a dessert codename that surfaces in the
Build.VERSION_CODESconstants —TIRAMISUis API 33,BAKLAVAis API 36. - Minor SDK releases share their version’s row. Android 16 and 17 also ship mid-cycle SDK levels (36.1, 37.1), documented alongside the version-code constants;
minSdkstays the integer API level.
What minSdk should you use?
Pick the lowest API level whose excluded devices you can accept, and let the table price the choice: as of August 2026,minSdk 26 reaches ≈98.3% of active devices, minSdk 29 reaches ≈94.6%, and minSdk 31 reaches ≈82.1%.
The three numbers in a build file do different jobs, defined by the uses-sdk element: minSdk is the oldest version the app installs on, targetSdk declares which version’s behavior changes the app has been tested against, and compileSdk is the API surface the code compiles against. Only minSdk costs you devices. targetSdk and compileSdk stay current regardless — Google Play requires a recent targetSdk for new submissions and updates.
Raising minSdk buys the ability to call newer platform APIs unconditionally — no runtime version checks, no compatibility fallbacks — and shrinks the device matrix you test. The cost is the coverage delta between the two rows, and the table states it exactly.
Common questions
What minSdk should I use in 2026?
What minSdk should I use in 2026?
For most new apps, API 26–29. Below 26 the added reach is under 2% of devices; above 31 you exclude nearly a fifth. Duet-scaffolded Android targets ship
minSdk 26 — the ≈98.3% row — and raise it per project only when a needed API demands it.What's the difference between minSdk, targetSdk, and compileSdk?
What's the difference between minSdk, targetSdk, and compileSdk?
minSdk gates installation — devices below it never see the app. targetSdk opts the app into the behavior rules of that version; the system applies compatibility behavior for newer devices. compileSdk only affects compilation. An app commonly compiles against and targets the newest API while keeping a much lower minSdk.What happens on devices older than the minSdk?
What happens on devices older than the minSdk?
Google Play filters the app out of search and its store page shows it as incompatible, per the
uses-sdk filtering rules. The system also refuses to install the APK directly, so sideloading doesn’t bypass the floor.How fresh are these coverage numbers?
How fresh are these coverage numbers?
The measurement date is printed above the table — the numbers are from that month’s Statcounter GlobalStats data, and the page is refreshed at least quarterly and whenever the Android SDK versions Modaal pins change. The chart regenerates from the same numbers as the table.
Do Android versions still have dessert names?
Do Android versions still have dessert names?
Yes, as codenames: public branding uses the number, and each release’s dessert name lives in its
VERSION_CODES constant — Android 17 is Cinnamon Bun, Android 16 is Baklava. The last release marketed under its dessert name was Android 9 Pie in 2018.Modaal scaffolds an app on the floor this page prices. Set up the Android toolchain covers the SDK install; the components it pins live in the API 36 row above.
Sources and further reading
- Statcounter GlobalStats — Android version market share — the coverage data (mobile devices, worldwide)
- apilevels.com — the reference whose one-row-per-release format this table follows
- Build.VERSION_CODES — every API level and its constant, from the platform itself
- SDK Platform release notes — what each platform release added
- The uses-sdk element —
minSdkandtargetSdksemantics and Play filtering - Google Play’s target API level requirement — the policy floor on
targetSdk - Android version history — community-maintained release chronology (Wikipedia)
Read next
How Android apps work
The anatomy behind these numbers: the manifest, activities, Jetpack Compose, and the Gradle build that names minSdk.
Set up the Android toolchain
The one-banner install of the pinned SDK components — the API 36 platform, build tools, and your first emulator.