Quick answer: The phone's installer hides the real reason. Install the same file with adb install to get the exact failure code. The usual causes are an APK without a v2 or newer signature (required when targeting Android 11+), zipalign run after signing, trying to sideload an .aab, a test-only APK, or a file corrupted in transfer.
Your testers download the APK, tap it, and get a one-line dialog with no detail. That message covers several different failures. The first step is always to get Android to tell you which one it is.
Step 1: get the real error
Connect the phone with USB debugging enabled and install the exact same file:
adb install -r game.apk
adb prints a specific code. INSTALL_PARSE_FAILED_NO_CERTIFICATES, INSTALL_FAILED_UPDATE_INCOMPATIBLE, INSTALL_FAILED_NO_MATCHING_ABIS, INSTALL_FAILED_TEST_ONLY and INSTALL_FAILED_OLDER_SDK each have a different fix, several of which have their own posts linked below.
Cause 1: missing or outdated signature
Apps targeting Android 11 (API level 30) or higher must be signed with APK Signature Scheme v2 or newer; v1 (JAR) signing alone is rejected. Engines do this by default, but custom pipelines that re-sign with jarsigner produce v1-only APKs. Check:
apksigner verify --verbose --print-certs game.apk
The output lists which schemes verified. Re-sign with apksigner, not jarsigner.
Cause 2: zipalign after signing
v2 and newer signatures cover the whole file. Running zipalign after signing changes the file and invalidates the signature. The order must be: build, zipalign, then apksigner sign.
zipalign -p -f 4 unsigned.apk aligned.apk
apksigner sign --ks release.keystore --out game.apk aligned.apk
Cause 3: it is not an APK
An Android App Bundle (.aab) is for Google Play, not for phones. Renaming it to .apk produces exactly this message. Build an APK for sideloading, or convert the bundle:
bundletool build-apks --bundle=game.aab --output=game.apks --mode=universal \
--ks=release.keystore --ks-key-alias=upload
unzip game.apks universal.apk
Other causes
- Corrupted download. Messaging apps and some cloud links mangle or truncate large files. Compare file sizes or checksums, or share through a link that serves the original file.
- Test-only APKs. APKs built from Android Studio's Run action can be marked test-only, which the package installer refuses.
- Device too old. A
minSdkVersionabove the device's Android version gives a parse or SDK error. - Conflicting install. If an app with the same package and a different signature is installed, the dialog says the package conflicts with an existing package; uninstall it first.
A smoother way to get builds to testers
Sideloaded APKs invite every one of these problems. Google Play's internal testing track delivers correctly signed, device-appropriate builds to up to 100 testers within minutes of upload, and they update automatically.
Reports from testers
Once testers can install the game, the next problem is getting useful reports back. Bugnet imports your Google Play and App Store reviews every hour with device and OS details, files one- and two-star reviews that describe a bug as reports automatically, and its SDKs for Unity, Godot and Unreal mobile builds capture errors with the device attached.
Related problems
- How to Fix “INSTALL_PARSE_FAILED_NO_CERTIFICATES” When Installing Android Game Builds
- How to Fix INSTALL_FAILED_UPDATE_INCOMPATIBLE When Installing Android Game Builds
- How to Fix INSTALL_FAILED_NO_MATCHING_ABIS When Installing Android Game Builds
Frequently asked questions
Why does Android say “App not installed as package appears to be invalid”?
The installer hides the real reason. Common causes are a v1-only signature, zipalign run after signing, trying to install an .aab, a test-only build or a corrupted download.
How do I find the real install error on Android?
Install the same file with adb install -r and read the INSTALL_ error code it prints.
Can I install an .aab file on my phone?
No. Use bundletool build-apks with --mode=universal to produce an installable APK, or distribute through a Google Play testing track.
The phone dialog never tells you why. adb install always does.