一、 问题概述Google Play
提示“您的设备与此版本不兼容”,无法安装应用。
遇到问题的设备为Xiaomi Mi A3,查了下这台手机的基本信息,Android One系统,版本分为9.0、10.0、11.0。
二、 问题分析
Google Play的过滤器 通常有以下5种情况
- 设备兼容性:根据设备的硬件和操作系统版本,过滤出与设备兼容的应用程序。
- 国家/地区限制:某些应用程序可能在特定国家或地区受限,过滤器可根据用户所在地排除或仅显示特定地区的应用程序。
- 年龄限制:过滤器根据应用程序的年龄评级(如PEGI、ESRB等)来限制显示适合特定年龄段的应用程序。
- 定价状态:付费应用,必须位于可使用付费应用的国家/地区。如果设备有 SIM 卡,SIM 卡运营商会确定付费应用是否可用。如果设备没有 SIM 卡,请使用设备的 IP 地址确定设备是否位于可使用付费应用的国家/地区。
- CPU 架构 (ABI):如果应用包括针对特定 CPU 架构(例如 ARM EABI v7 或 x86)的原生库,它只在支持该架构的设备上可见。
大多数过滤器都由应用清单文件 AndroidManifest.xml 内的元素触发。当设备直接通过应用地址“play.google.com/store/apps/… 访问后应用,得到Google Play给出的提示为"您的设备与此版本不兼容",那么大概率是由于AndroidManifest.xml
导致。
清单元素 | 过滤器名称 | 过滤器名称 |
---|---|---|
<supports-screens> | 屏幕尺寸 | minSdkVersion 或 targetSdkVersion 设为 4 或更大值时,所有属性的默认值均为 "true"。这样,应用将被视为默认支持所有屏幕尺寸。 |
<uses-configuration> | 设备配置:键盘、导航、触摸屏 | 应用可以请求某些硬件功能,Google Play 将只在具备所需硬件的设备上显示该应用。 |
<uses-feature> | 设备功能 | 应用可以要求设备具有某些功能。Android 2.0(API 级别 5)中引入了此功能。android:required默认值均为 "true" |
<uses-library> | 软件库 | 应用可以要求设备上具有特定的共享库。例如com.google.android.maps |
<uses-permission> | 用户权限 | 如果应用请求硬件相关权限,Google Play 会假定该应用需要对应的硬件功能,即使可能没有相应的 声明也是如此。然后,Google Play 会根据 声明暗含的功能要求进行过滤。 |
<uses-sdk> | SDK版本 | 应用可以要求的 API 级别范围。 |
项目中会有多个AndroidManifest.xml文件,且有些是在依赖库中,不易排查。可以直接检查Apk的AndroidManifest.xml
文件,这里有多种方式获取,你可以反编译拿到或者通过aapt(AndroidAssetPackagingTool)命令,aapt工具在sdk目录中,版本可自行选择。
通过命令 aapt dump badging xxx.apk
获取到apk包的详细信息,有时候因为apk包本身的问题,可能出现 “ERROR: dump failed because no AndroidManifest.xml found”,那么需要换一个apk包。
三、 问题解决
拿到apk的详细信息后,即可逐个feature排查。虽然可以通过 “adb shell dumpsys” 命令拿到手机所支持的Libraries和Features信息,但是因为Android的手机款式多,想要拿到一些冷门型号的真机难度较大,且用户配合此类操作也较难,所以最好还是结合apk包获取的信息在AndroidManifest.xml
中增加相应的配置代码。例如
当然,如果你是应用的开发者,Google Play Console
的提供了 Device catalog 功能,超过22574台通过Google Play
兼容性测试的Android设备,方便快捷的获得应用所支持和不支持的设备列表以及应用不支持该设备的原因,帮助开发者决策。