Contents
APK compatibility by Android version comes down to two numbers in the app’s manifest. minSdkVersion is the floor: your Android release must be at or above it, or the install fails. targetSdkVersion is the version the developer tested against, and it changes behavior instead of blocking installs. Android 10 is API 29, Android 15 is API 35, Android 17 is API 37, and every APK declares the number it needs.
How Android Version Compatibility Works
Android checks the manifest before it copies any files, and the check takes two fields. minSdkVersion names the oldest Android release the app supports. targetSdkVersion names the release it was built and tested against. The device’s API level is compared against the first one, and the second one only affects which platform behaviors are switched on.
Three outcomes follow from that comparison:
- Device API at or above minSdkVersion. The install proceeds to the signature and architecture checks.
- Device API below minSdkVersion. The installer aborts. From ADB you see
INSTALL_FAILED_OLDER_SDK; from the Play Store you see “This app isn’t compatible with your device.” - Device far above targetSdkVersion. The app installs, but Android may apply compatibility behaviors the developer never tested. That is where crashes on modern phones usually come from.
Google documents both fields in the uses-sdk element reference, and the API numbers appear in the table below.
Why an APK Refuses to Install on Your Android Version
The message you see tells you which of the three checks failed. Match your error to its row:
| Message or error code | Which check failed | What to do |
|---|---|---|
| “This app isn’t compatible with your device” (Play) | minSdkVersion above your API level | Install an older app release, or update Android |
INSTALL_FAILED_OLDER_SDK |
Same check, sideload path | Update Android or find a version that supports it |
INSTALL_FAILED_UPDATE_INCOMPATIBLE |
Signature clash with an installed copy | Uninstall the existing app, then install again |
INSTALL_FAILED_NO_MATCHING_ABIS |
No libraries for your CPU | Look for an arm64 or universal APK |
INSTALL_FAILED_DEPRECATED_SDK_VERSION |
targetSdk below Android’s floor | Sideload with adb install --bypass-low-target-sdk-block |
| App installs, then crashes on launch | Behavior change behind targetSdkVersion | Update the app, or check its release notes for system requirements |
That fifth row is the newest one. Android 14 blocks installs targeting API 22 and lower, Android 15 raises the floor to 23, and each release keeps pushing it up. The ADB flag above is a deliberate escape hatch for sideloaded copies. The install troubleshooting guide walks through each code with screenshots.
Android Version and API Level History
Apps declare API levels rather than marketing names, because the numbers never change. This is the mapping you will see quoted on download pages:
| Android version | API level | Released | Notes |
|---|---|---|---|
| Android 10 | 29 | September 3, 2019 | Common floor for older apps |
| Android 11 | 30 | September 8, 2020 | Scoped storage becomes default |
| Android 12 | 31 | October 4, 2021 | Splash screens enforced |
| Android 12L | 32 | March 7, 2022 | Tablet and foldable pass |
| Android 13 | 33 | August 15, 2022 | Notification permission added |
| Android 14 | 34 | October 4, 2023 | Blocks very low target SDKs |
| Android 15 | 35 | October 15, 2024 | Minimum target rises again |
| Android 16 | 36 | June 10, 2025 | Large-screen and edge-to-edge focus |
| Android 17 | 37 | June 16, 2026 | Current release |
Three details worth knowing about the tail of that table. Android 16 shipped on June 10, 2025 and Android 17 on June 16, 2026, so “the latest Android” answers change every summer. Fire OS tracks the same numbering: Fire OS 16 corresponds to API 36. And the Play Store now keys its rules to these integers rather than to version names.
How Fire OS, Wear OS, TV, and Automotive Number Android
Every Android fork reports the same API integers Google assigns to each release, so Fire OS 16 means API 36, Android TV builds match phone releases number for number, and Wear OS and Android Automotive declare the same minSdkVersion and targetSdkVersion values in their manifests. The label changes. The number does not.
| Platform | Version label | API level | Install notes |
|---|---|---|---|
| Fire OS | Fire OS 16 | 36 | Same base as Android 16 |
| Android TV / Google TV | Android 14 | 34 | Numbering matches phones |
| Wear OS | Android version in Settings, System, About | Same integers | Separate Play Store track |
| Android Automotive | Android version in vehicle settings | Same integers | Separate Play Store track |
| ChromeOS Android layer | Updates on its own schedule | Can lag a phone | Read it from the Android container |
Fire OS is the clearest example, because version 16 maps straight to API 36 and Android 16. Wear OS and Android Automotive run separate Play Store tracks, so an app can exist for phones and be missing from the watch. A mirror app that fails on a Galaxy Watch is usually hitting that split. That is a catalog problem.
Backward and Forward Compatibility Explained
Android runs old apps on new systems far more reliably than the reverse. The two directions fail differently.
New Android, Old APK
Old apps usually install and run. Behavior changes are gated behind targetSdkVersion, so an app built for Android 9 still behaves like an Android 9 app on Android 17. The failures people hit are removed APIs and tightened background limits, which show up as crashes or notifications that never arrive. Emergency exceptions exist for very old targets, covered in the error table above.
Old Android, New APK
The install simply does not happen. minSdkVersion is enforced before anything else, and there is no hidden override. Your real choices are:
- Update Android. The permanent fix, assuming your device still receives updates.
- Install an older app release. Archives keep prior versions, and older releases often declare a lower minimum. The APK update guide covers downgrading safely, including why a signature must still match.
- Run it elsewhere. An emulator image, a second device, or a cloud Android session.
The Play Store’s Own Deadline
Google Play adds a third rule on top of the technical one. New apps and updates must target API 36 from August 31, 2026 (with extensions to November 1, 2026). Apps still below API 35 stop being offered to new users on devices running a newer Android. Existing installs keep working; discovery is what changes. Google publishes the exact dates in its target API level requirements.
Google Play Target API Deadline Timeline
Google Play requires every new app and every update to target a specific API level, and the current floor is API 36 from August 31, 2026, with a short extension window to November 1, 2026 for developers who request more time. Two deadlines matter right now.
| Deadline | Requirement | What changes for apps below it |
|---|---|---|
| August 31, 2025, extension to November 1, 2025 | New apps and updates target API 35 | Older builds reach new users only on devices at or below their own target level |
| August 31, 2026, extension to November 1, 2026 | New apps and updates target API 36 | The same reach limit keeps applying, and apps below API 35 lose visibility first |
Existing installs are never removed. Google publishes both dates in its target API level requirements, and the matching platform reference is the targetSdkVersion documentation. An app that ignores the deadline keeps working for people who already installed it.
Behavior Changes Gated by targetSdkVersion
targetSdkVersion decides which platform behaviors Android applies to an app, so a package built for API 29 installs on Android 16 yet keeps the storage rules, notification rules, and background limits from its own era rather than the newest platform rules. That is why an old app can fail on a brand new phone.
| Behavior | Arrived in | Applies from targetSdkVersion | What the app then experiences |
|---|---|---|---|
| Scoped storage | Android 11, API 30 | 30 | Direct writes to shared folders fail, so exports vanish |
| Notification permission | Android 13, API 33 | 33 | Alerts are dropped until POST_NOTIFICATIONS is granted |
| Exact alarm scheduling | Android 12, API 31 | 31 | Alarms drift, and SCHEDULE_EXACT_ALARM must be declared |
| Foreground service types | Android 14, API 34 | 34 | The service start throws a SecurityException without a declared type |
None of those rows block an install. The app arrives, launches, then fails the moment it touches a restricted API. Only the developer can raise targetSdkVersion, so an update is the fix.
How to Check an APK’s Minimum Android Version
Four methods, ordered by how much effort they cost.
Read the Store or Download Page
Google Play lists Requires Android on every app page. Archives and mirrors print the same value on their download pages. This answers the question in five seconds for anything you have not downloaded yet.
Use Android Studio’s APK Analyzer
Open Android Studio, choose File then Profile or Debug APK, and read minSdkVersion from the manifest summary. This works on any local file, including one you received over a messaging app.
Read the Manifest With ADB
Install the app on a device, then run:
adb shell dumpsys package com.example.app | grep -E "minSdk|targetSdk|versionName"
It prints the values Android is actually enforcing for that installed copy.
Check the Architecture at the Same Time
The same inspection should tell you which native libraries ship inside the package, which matters on Chromebooks and PCs. Architecture, ABI names, and split packages are covered in APK file size and architecture.
Split APKs, XAPK Files, and adb install-multiple
Google Play turns an Android App Bundle into several small APKs instead of one file, and a plain adb install command accepts only one file at a time, so a bundle needs the install-multiple command to arrive complete on the device. One file is never the whole app.
| Piece | What it holds | How to install it |
|---|---|---|
base.apk |
Code, manifest, resources | adb install base.apk |
config.arm64_v8a.apk |
Native libraries for one CPU | Install together with base using adb install-multiple |
config.en.apk |
One language pack | Same command, all files in one call |
| XAPK | Container holding base plus splits | Extract it, then run install-multiple on every APK inside |
| Universal APK | Every ABI in one file | adb install app-universal.apk |
install-multiple takes every path in a single call and treats them as one package, so the files must match each other. Send only an x86 split to an arm64 phone and ADB returns INSTALL_FAILED_NO_MATCHING_ABIS. Command examples are in APK file size and architecture.
How to Check Your Android Version
Open Settings, scroll to About phone or About tablet, and read Android version. Tap the version number if you want the Easter egg, but the number itself is what you need. Map it using the table above.
On a TV the path differs slightly: Settings, then Device Preferences or System, then About. On Wear OS, Settings, then System, then About. The same number applies everywhere, because it comes from the same Android base.
If the settings screen shows a build number only, you are looking one line too far down. Compatibility reads the Android version, not the security patch date.
What to Do If an APK Needs a Newer Android
Three options in order of how often they work:
- Update the device. Settings, System, System update. Devices released within the last three years usually receive two to three years of updates, so a 2022 phone may already be at its ceiling.
- Roll back to an older app version. The prior release frequently declared a lower minimum. Install it from an archive, but keep the signature consistent with the copy already on the device or uninstall first.
- Use an emulator. On a computer, an emulator image runs any current API level, which makes it the answer when the phone is stuck. See the PC guide for setup.
Do not attempt to modify minSdkVersion by rebuilding the manifest. A repacked APK fails the signature check and gets rejected by INSTALL_FAILED_UPDATE_INCOMPATIBLE.
How to Downgrade to an Earlier App Version
To roll back an app you remove the newer copy first, then install an older release signed with the same key, because Android refuses to place a lower version code over a higher one and Android returns the INSTALL_FAILED_VERSION_DOWNGRADE error when you try. Uninstalling first clears both the version check and the saved data.
- Uninstall the app. Settings, then Apps, then the app, then Uninstall. For a system app, choose Uninstall updates, which restores the factory version.
- Confirm the signing key. An older release signed with a different key fails with
INSTALL_FAILED_UPDATE_INCOMPATIBLE, which is what happens after a developer turns on Play App Signing. - Install the older package. Run
adb install old-app.apk, or open the file from a file manager on the phone. - Expect data loss. Uninstalling removes logins and saves, so export what you can before step one.
Debuggable builds also accept the adb install -d flag, which relaxes the version check for packages that allow it. Release builds rarely do, so uninstalling stays the reliable route. Prior versions live in archives, and how to update APK files lists the safe order.
What to Do If an APK Needs an Older Android
Almost never a problem. Apps declaring a floor below your version run fine, because Android runs new apps on old behavior through targetSdk gating. The rare failures are hardware features the app declares as required, such as a specific camera or sensor, which is a device mismatch rather than a version mismatch. The permissions checklist in how to check APK permissions covers that inspection.
Test your device against the full device support list, then run the version check above on the app you actually want.
Key Takeaways
- Two manifest numbers decide compatibility: minSdkVersion blocks the install, targetSdkVersion changes behavior.
- Android 10 = API 29 through Android 17 = API 37, released June 16, 2026.
- INSTALL_FAILED_OLDER_SDK means your device is below the app's minimum. There is no override.
- From August 31, 2026, Play Store apps below API 35 lose reach on newer Android devices.
Frequently Asked Questions
What Android version do I need to install an APK?
Whatever the app declares as its minimum SDK. That number sits on the Play Store listing under Requires Android, and inside the APK manifest as minSdkVersion. If your device's Android release is older, the installer refuses the package.
Can Android 10 install an APK built for Android 14?
Only if the developer set the minimum to Android 10 or lower. Apps that declare API 34 as the floor report INSTALL_FAILED_OLDER_SDK on Android 10, and no setting overrides that check.
What is minimum SDK version?
minSdkVersion is the oldest Android release the app supports. Android compares it to the device API level before installing, and refuses the package when the device sits below the floor. It cannot be changed after the APK is built.
What is target SDK version?
targetSdkVersion is the Android release the developer tested against. It does not block installation. It switches platform behaviors on or off, which is why old apps can run on new Android yet still fail Play Store policies.
How do I check an APK's Android requirement?
Read Requires Android on the Play Store page, or check the download page on an APK archive. For a local file, open it in Android Studio's APK Analyzer and read the minSdkVersion value from the manifest.
How do I check my Android version?
Open Settings, then About phone, and read the Android version entry. The numbers on the following line, the build number, do not matter for compatibility. Compare your Android version against the table in this guide.
Why will an APK not install on my Android version?
The usual cause is a minimum SDK above your device. Other causes are a signature clash with an installed copy, a CPU architecture mismatch, or a target SDK so old that recent Android versions block the install outright.
Can I install an older APK on newer Android?
Usually yes. Android keeps most apps working across releases, with behavior changes gated behind targetSdkVersion. The exceptions are apps using APIs Google removed, which crash or lose features rather than refusing to install.
Can I install a newer APK on older Android?
No, when the APK's minimum exceeds your device. The installer stops before copying a single file. Your options are an older app release, an Android update, or running it in an emulator with a newer image.
Which Android version supports all APKs?
The newest one, as long as its API level meets or exceeds every app's minimum. Android 17, API 37, released June 16, 2026, runs current releases and most older ones, though very old apps can break on removed APIs.
What is an API level?
An API level is the integer Google assigns to each Android release, starting at 1 and now at 37. Apps declare API numbers rather than version names, so minSdkVersion 35 always means Android 15 regardless of the marketing label.
Does the Play Store block old apps?
Yes, increasingly. From August 31, 2026, new apps must target API 36, and apps still below API 35 stop being offered to new users on devices running anything newer than their target.