应用与你的手机不兼容:检查 targetSdk、ABI 和 minSdk
本页目录
结论先行:手机提示“应用与你的手机不兼容”(英文系统是 “App not installed as app isn’t compatible with your phone”),背后其实是好几种不同的拒绝原因。在当前的 Android 版本上,最常见的是这几种:targetSdkVersion 太低(Android 14 拦截低于 23 的,Android 15 及以上拦截低于 24 的);原生库只有手机不支持的 ABI(典型情况是只有 32 位库,而手机只支持 64 位);minSdkVersion 高于手机的系统版本;或者声明了手机上没有的必需共享库。adb install 会打印出确切的 INSTALL_FAILED_* 代码,每个代码都对应构建配置里的一处修改。
下面用我自己构建的几个小 APK 把每种原因都复现了一遍,分别装到 Android 14(API 34)和 Android 16(API 36)模拟器上并贴出真实输出,再用本站的 APK/AAB 分析与上架体检 检查同一批文件(在浏览器里读取 Manifest 和原生库,不上传任何内容)。
第 1 步:拿到真实的错误代码
手机不会告诉你原因。连上设备(或启动模拟器),从电脑上安装:
adb install app-release.apk
下面是样例 APK 的结果。所有 APK 的包名都是 dev.example.compat,都用我的发布密钥签名,每次只改一项设置。
| 样例 | 问题 | Android 14(API 34) | Android 16(API 36) |
|---|---|---|---|
compat-target22.apk |
targetSdkVersion 22 |
INSTALL_FAILED_DEPRECATED_SDK_VERSION |
INSTALL_FAILED_DEPRECATED_SDK_VERSION |
compat-target23.apk |
targetSdkVersion 23 |
Success | INSTALL_FAILED_DEPRECATED_SDK_VERSION |
compat-armv7-only.apk |
只有 lib/armeabi-v7a/ |
INSTALL_FAILED_NO_MATCHING_ABIS |
INSTALL_FAILED_NO_MATCHING_ABIS |
compat-x86_64-only.apk |
只有 lib/x86_64/ |
INSTALL_FAILED_NO_MATCHING_ABIS |
INSTALL_FAILED_NO_MATCHING_ABIS |
compat-min35.apk |
minSdkVersion 35 |
INSTALL_FAILED_OLDER_SDK |
Success |
compat-missing-library.apk |
必需的 <uses-library> 不存在 |
INSTALL_FAILED_MISSING_SHARED_LIBRARY |
INSTALL_FAILED_MISSING_SHARED_LIBRARY |
compat-watch-feature.apk |
要求 android.hardware.type.watch |
Success | Success |
compat-fixed.apk |
target 36、min 24,arm64-v8a + armeabi-v7a + x86_64 | Success | Success |
两台模拟器都是 arm64 镜像,ro.product.cpu.abilist 只有 arm64-v8a,没有任何 32 位 ABI。近几代 Pixel 手机同样只支持 64 位。
完整的失败信息本身就说得很清楚:
Failure [INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 22]
Failure [INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 24, but found 23]
Failure [INSTALL_FAILED_NO_MATCHING_ABIS: INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]
Failure [INSTALL_FAILED_OLDER_SDK: Requires newer sdk version #35 (current version is #34)]
Failure [INSTALL_FAILED_MISSING_SHARED_LIBRARY: Reconciliation failed...: Reconcile failed: Package dev.example.compat requires unavailable shared library dev.example.missing.library; failing!]
前两行分别来自 API 34 和 API 36 模拟器,可以看到下限从 23 提到了 24。在我的模拟器上,logcat 没有记录这些失败,所以要看原因就看 adb 的输出。
第 2 步:在浏览器里检查 APK
打开 APK/AAB 分析与上架体检,场景选 Play 以外(线下分发) 或 两者都要。安装类规则 SIDE-01 属于线下分发场景,PLAY-04 属于 Google Play 场景,选“两者都要”就能同时看到。然后拖入 APK。
工具对这批样例的结果(按 2026-10-14 的规则):
compat-target22.apk
SIDE-01 fail reject targetSdkVersion=22
Android 15+ requires targetSdkVersion >= 24
Android 14+ requires targetSdkVersion >= 23
note: Installation fails on Android 14 and later (INSTALL_FAILED_DEPRECATED_SDK_VERSION).
PLAY-01 fail reject targetSdkVersion=22, required: >= 36 (phone/tablet, since 2026-08-31)
compat-target23.apk
SIDE-01 fail reject targetSdkVersion=23, Android 15+ requires targetSdkVersion >= 24
note: Installation fails on Android 15 and later (INSTALL_FAILED_DEPRECATED_SDK_VERSION).
compat-armv7-only.apk
PLAY-04 fail reject lib/armeabi-v7a/ present, lib/arm64-v8a/ missing
SIDE-01 和两台模拟器的结果完全吻合:target 22 在两台上都装不上,target 23 只在 Android 16 上装不上。
另外三种原因没有单独的检查项,要从报告里读出来:
- 只有 x86_64。PLAY-04 只标两种情况:有 32 位 ABI 却缺对应的 64 位 ABI,以及
.so的 ELF 头和所在目录不一致。只有lib/x86_64/的 APK 两条都不触发,compat-x86_64-only.apk的所有检查都通过了。问题要看原生库表格:只有一行,ABI 是x86_64,ELF 是64-bit x86-64,ARM 处理器的手机用不了。确认表里有arm64-v8a。 - minSdk。摘要里有
minSdk,拿它和手机的系统版本比(API 34 是 Android 14,35 是 Android 15,36 是 Android 16)。minSdk 设得高本身是合理选择,所以没有检查项会标它。 - 必需共享库。当前版本没有用表格列出
<uses-library>。打开 Manifest → 原始 XML,查找带android:required="true"的uses-library。
第 3 步:读取手机这一侧的信息
要对比,需要知道手机的 API 级别和支持的 ABI。用原生 adb:
adb shell getprop ro.build.version.sdk
adb shell getprop ro.product.cpu.abilist
如果你本来就在用 REA(第三方开源命令行工具),6.7.0 的 inspect-adb-device 也能读到这些属性:
export REA_ADB_PATH="$HOME/Library/Android/sdk/platform-tools/adb"
rea inspect-adb-device emulator-5582 --format json
API 34 模拟器上 normalized_result.properties 的摘录:
ro.build.version.release 14
ro.build.version.sdk 34
ro.product.cpu.abilist arm64-v8a
ro.product.model sdk_gphone64_arm64
别用 rea install-adb-package 来排查这个错误:我实测每次安装失败都只返回通用的 unreadable_output,看不到 INSTALL_FAILED_* 原文(adb 37.0.1 把 Failure [...] 写到了标准错误)。第 1 步请继续用原生 adb install。
第 4 步:在构建里修好
targetSdkVersion 太低(DEPRECATED_SDK_VERSION)
提高 targetSdk。Android 14 拒绝低于 23 的,Android 15 及以上拒绝低于 24 的(Android 15 行为变更)。别只提到下限:自 2026-08-31 起,Google Play 要求手机和平板应用达到 36(PLAY-01),而且这个安装下限在两个 Android 版本里已经提高了两次。
android {
defaultConfig {
minSdk = 24
targetSdk = 36
}
}
提高 target 会改变运行时行为(权限、后台限制、Intent 等),要实际测试新版本,不能只是重新打个包。Flutter 项目的这些值在 android/app/build.gradle(.kts) 里,常见写法是 flutter.targetSdkVersion,由 Flutter SDK 版本决定。Unity 在 Player Settings → Other Settings 的 Target API Level 里设置。
adb install --bypass-low-target-sdk-block 可以强行装上 target 过低的包,我的 target 22 样例加这个参数后在两台模拟器上都装上了。它是给开发者在自己设备上测试旧构建用的,普通用户没有这个选项,它也不会修好 APK 本身。
没有匹配的 ABI(NO_MATCHING_ABIS)
面向手机一定要带 arm64-v8a。在 x86_64 模拟器上测试就保留 x86_64;只有要支持老的 32 位设备时才加 armeabi-v7a:
android {
defaultConfig {
ndk { abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86_64") }
}
}
重点排查两种情况:为模拟器临时设置、之后一直没改回来的 abiFilters;以及只提供 32 位 .so 的第三方 SDK。Flutter 的 release 构建默认就包含 arm64 库,检查一下构建脚本里有没有 --target-platform 参数。Unity 要选 IL2CPP,并在 Target Architectures 里勾选 ARM64;Mono 后端不支持 ARM64。只勾了 ARMv7 的 Unity 包,在只支持 64 位的手机上就会这样失败。
带三种 ABI 的 compat-fixed.apk 在两台模拟器上都装上了。如果还要上架 Play,记得对 64 位库做一次 16 KB 页面大小检查。
minSdkVersion 太高(OLDER_SDK)
要么是手机系统确实太旧,要么是 minSdk 被意外抬高了,常见原因是某个依赖要求更高的版本,Manifest 合并时取了较大值。如果你本来就想支持这台手机,降低 minSdk,并替换掉把它抬高的依赖;如果不打算支持,这个提示就是对的,告诉用户最低支持的 Android 版本即可。
缺少共享库(MISSING_SHARED_LIBRARY)
<uses-library android:required="true"> 指定了一个这台手机没有的库,比如某个厂商专有库。如果应用没有它也能运行,改成 android:required="false",在运行时再判断;否则就单独出一个不依赖它的构建变体。
uses-feature:不是安装器的检查项
声明必需 android.hardware.type.watch 的样例,用 adb install 在两台手机模拟器上都装上了。在我的测试里,<uses-feature> 不会阻止安装。Google Play 和一些商店用它来决定哪些设备能看到这个应用。如果用户是在商店页面上看到“不兼容”,拿你声明的必需功能和受影响设备上 adb shell pm list features 的输出对比,把可选的功能改成 android:required="false"。
常见问题
手机说“不兼容”,adb 却给出别的代码?
以 adb 为准。如果代码是 INSTALL_FAILED_UPDATE_INCOMPATIBLE,那是和已装版本的签名冲突,请看 安装包与现有包冲突。
应用里根本没有原生代码,还会是 ABI 的问题吗?
不会。没有 lib/ 目录就没有可匹配的东西,去查 targetSdk、minSdk 和共享库。
我拿到的是 AAB,不是 APK。 AAB 不能直接安装。先用 bundletool 生成 APK,见 AAB 转 APK 教程。
现在装得上了,但一打开就崩溃。
那是另一个问题:用 adb logcat -b crash -d 读崩溃缓冲区,见 adb logcat 崩溃与墓碑排查。
参考资料:Android 14 行为变更、Android ABI、64 位要求。