When you try to install an APK that wasn’t obtained from the Play Store, Android runs a series of checks before allowing the package to be placed on the device. If any check fails, the system aborts the installation and shows the generic “App not installed” toast. The message is intentionally vague, which makes troubleshooting feel like guesswork.
Typical reasons include:
minSdkVersion or targetSdkVersionThe guide below walks you through each check, shows how to read the underlying error code with adb logcat, and offers concrete fixes.
Preparing your phone and workstation reduces the chance of data loss and makes the debugging process smoother.
Settings > About phone, tap Build number seven times, then return to Settings.Settings > System > Advanced > Developer options, enable USB debugging.adb binary) if you haven’t already.A corrupted download is the simplest cause of the error. If the APK came from a website, check its SHA‑256 checksum against the value provided by the author.
shasum -a 256 /path/to/app.apk
If the checksums differ, re‑download the file from a trusted source.
Android 8.0 (Oreo) and later moved the permission from a global switch to per‑app control.
Settings > Security > Unknown sources → enable.If you prefer using the command line, you can grant the permission directly:
adb shell pm grant com.android.chrome android.permission.REQUEST_INSTALL_PACKAGES
Every APK declares a minSdkVersion. If your device runs an Android version lower than this value, the installer will reject the package.
To inspect the manifest without installing, use aapt dump badging (part of the Android build‑tools) or the simpler apktool:
aapt dump badging app.apk | grep sdkVersion
Typical output:
uses-sdk: minSdkVersion='21' targetSdkVersion='30'
If the minSdkVersion is higher than your device’s API level, you have three options:
If you are trying to update an existing app, the new APK must be signed with the same certificate as the installed version. A mismatch triggers INSTALL_FAILED_UPDATE_INCOMPATIBLE and the generic “App not installed” toast.
Two common scenarios:
To see the certificate fingerprint of the installed package, run:
adb shell dumpsys package com.example.app | grep -i cert
Compare it with the fingerprint of the APK you intend to install:
keytool -printcert -jarfile app.apk
If they differ, either obtain the correct signed APK or uninstall the existing app:
adb uninstall com.example.app
Android checks both the free space on the internal storage and the space required for the app’s native libraries. A common mistake is to have enough “available” space but not enough “free” space after accounting for cached data.
Check free space with:
adb shell df /data
If the free space is below the size shown by aapt dump badging (look for packageSize), free up space by clearing cache (Settings > Storage > Cached data) or moving media to an SD card.
Corrupted cache can cause the installer to misinterpret a valid APK.
Settings > Apps & notifications > See all apps.After clearing, try installing the APK again.
Using the command line gives you the exact error code, which is far more useful than the generic toast.
adb install -r -d app.apk
Flags explained:
-r – reinstall the app, keeping its data if the signatures match.-d – allow version code downgrade (useful when the APK’s versionCode is lower than the installed one).If the command succeeds, you’ll see Success. If it fails, the output will contain a specific error such as INSTALL_FAILED_INSUFFICIENT_STORAGE or INSTALL_PARSE_FAILED_NO_CERTIFICATES. Note the exact phrase for the next troubleshooting step.
Below is a quick reference for the most frequent errors and what to do about them.
| Error code | Meaning | Fix |
|---|---|---|
| INSTALL_FAILED_INSUFFICIENT_STORAGE | Not enough free space. | Free storage, clear cache, or install on SD card if supported. |
| INSTALL_FAILED_UPDATE_INCOMPATIBLE | Signature mismatch with existing app. | Uninstall the old version or obtain a correctly signed APK. |
| INSTALL_PARSE_FAILED_NO_CERTIFICATES | APK is not signed or signature stripped. | Re‑sign the APK with a valid keystore (see Step 9) or download a signed version. |
| INSTALL_FAILED_OLDER_SDK | Device Android version lower than minSdkVersion. | Find a compatible version or upgrade the OS. |
| INSTALL_FAILED_DEXOPT | Dalvik/ART could not optimize the dex files. | Clear Dalvik cache via recovery, or reinstall a non‑obfuscated build. |
If you must install an unsigned or differently signed APK (e.g., a modded version) and you are willing to accept the loss of previous data, you can re‑sign it with your own keystore.
keytool -genkeypair -v -keystore mykey.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias myalias
apksigner (included in Android Build‑Tools) to sign:
apksigner sign --ks mykey.jks --out app-signed.apk app.apk
apksigner verify --verbose app-signed.apk
adb install.Remember that a re‑signed APK cannot replace an app that was originally signed with a different certificate. You must uninstall the original first.
Some devices block installation of certain file types (e.g., carrier‑branded firmware). As a last resort, you can flash the APK as a zip via a custom recovery (TWRP). This method is advanced and voids warranties, so proceed only if you are comfortable with flashing.
.apk to .zip and ensure the zip contains a proper META-INF/com/google/android/updater-script).If flashing fails, revert to the previous backup you made before entering recovery.
minSdkVersion ≤ your device’s Android version?adb install report?Working through the list in order usually isolates the problem within a few minutes.
The “App not installed” error is intentionally vague, but it’s rarely a mystery once you know which system checks are failing. By verifying the APK, adjusting permissions, confirming compatibility, and using ADB for precise feedback, you can resolve the issue without resorting to risky workarounds.
Keep a copy of the successful adb install command in a notes app; the next time you sideload a new build, you’ll already have the correct flags ready.









