You tap "Update" in the Play Store, or you sideload a newer APK from your own build server, and after a few seconds of the package installer churning, you get that bare, infuriating toast: "App not installed." No code, no explanation, just a wall. This usually happens right after you've signed your app with a different keystore, or you're trying to install an APK on top of an existing install that was signed with a different key.
What's actually happening here is Android's package manager is doing a checksum comparison on the signing certificate of the already-installed app against the one in the APK you're trying to install. If they don't match, the install is killed immediately. The system refuses to update an app to a version signed by a different developer—that's a security boundary, not a bug. It's the same reason you can't install a WhatsApp mod over the real WhatsApp without uninstalling first.
Root cause: the signing key mismatch
When you build a release APK, you sign it with a keystore. If you lose that keystore, generate a new one, or accidentally build with a debug keystore while the installed app was signed with a release keystore, the signatures won't match. Android's PackageManager compares the signatures field in both packages. Different certificates, different app identity—so it refuses the update.
But there's a second, sneakier cause: package name conflict. You might be installing an APK with the same package name but a different application ID (e.g., com.example.app vs com.example.app.debug). That also triggers "App not installed" because the system sees two packages with the same name but different signing keys.
The fix: numbered steps
- Uninstall the existing app. Go to Settings → Apps → [Your App] and tap Uninstall. This is the nuclear option, but it's the only reliable way to install an APK signed with a different key. Backup your app data first if you care about it—this wipes everything.
- Reinstall the new APK. After uninstalling, sideload the APK again. It should install cleanly because there's no conflicting package anymore.
- If you're the developer, fix your signing config. In
build.gradle, make sure thesigningConfigpoints to the same keystore you used for the original release. If you lost that keystore, you're out of luck—you'll need to bump the version code and do a fresh install on all devices. - Check for duplicate package names. Run
adb shell pm list packages | grep com.yourpackageto list all packages with that name. If you see more than one (like a debug and release variant), uninstall the debug variant manually viaadb uninstall com.yourpackage.debug.
What to check if it still fails
If you uninstalled and reinstalled and still get the error, you're dealing with something else. Check these in order:
- Is the APK corrupted? Redownload or rebuild it. A truncated download often produces this exact error.
- Is the APK built for a different architecture? Some devices (especially older ones) won't install an ARM64-only APK on an ARMv7 chipset. Check your CPU type with
adb shell getprop ro.product.cpu.abi. - Is the APK signed with a test key that's expired? Debug keystores expire after 30 years, but if you're using a self-signed cert for testing, check its validity with
apksigner verify --print-certs your.apk. - Storage space. Android gives a misleading "App not installed" when the device is out of space. Free up a few hundred MB and try again.
The good news is that this error is almost never a hardware problem. It's a signature or package mismatch, and once you uninstall the old version, the new one slides right in. If you're the developer, make a habit of keeping your keystore in a safe place and documenting the SHA-1 fingerprint—you'll thank yourself later.