一、 问题概述
Google Play提示“您的设备与此版本不兼容”,无法安装应用。

或者提示“此商品与您的设备不兼容”,无法安装应用。

遇到问题的设备为Xiaomi。
二、 问题分析
Google Play的过滤器,通常有以下5种情况:
- 设备兼容性:根据设备的硬件和操作系统版本,过滤出与设备兼容的应用程序。
- 国家/地区限制:某些应用程序可能在特定国家或地区受限,过滤器可根据用户所在地排除或仅显示特定地区的应用程序。
- 年龄限制:过滤器根据应用程序的年龄评级(如PEGI、ESRB等)来限制显示适合特定年龄段的应用程序。
- 定价状态:付费应用,必须位于可使用付费应用的国家/地区。如果设备有 SIM 卡,SIM 卡运营商会确定付费应用是否可用。如果设备没有 SIM 卡,请使用设备的 IP 地址确定设备是否位于可使用付费应用的国家/地区。
- CPU 架构 (ABI):如果应用包括针对特定 CPU 架构(例如 ARM EABI v7 或 x86)的原生库,它只在支持该架构的设备上可见。
当然,实际出现问题的场景里,绝大多数过滤器都由应用清单文件 AndroidManifest.xml 内的元素触发。

当设备直接通过应用地址:
https://play.google.com/store/apps/details?id=<applicationId>
访问后应用,得到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
文件。

三、 问题解决
拿Apk的详细信息后,即可逐个feature排查。

虽然可以通过 “adb shell dumpsys” 命令拿到手机所支持的Libraries和Features信息,但是因为Android的手机款式多,想要拿到一些冷门型号的真机难度较大,且用户配合此类操作也较难,所以最好还是结合Apk包获取的信息在AndroidManifest.xml中增加相应的配置代码。
例如:
<uses-feature android:name="android.hardware.nfc" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false" />
四、Google Play App过滤机制
当用户打开Google Play浏览或查找应用时,Google Play会对用户可见的app进行过滤,用户在Google Play上只能够看到和下载到那些能够和用户设备相兼容的app。根据uses-feature声明的软硬件特征来过滤app是其中的一种方式。
当开发者上传aab文件到Google Play后,Google Play会读取aab文件中AndroidManifest,根据uses-feature,uses-sdk,uses-permission,uses-library等配置信息来评估此app所需要的features,然后根据这些信息生成一份元数据和该aab版本关联起来,保存到数据库中。
当用户打开设备上的Google Play应用时,Google Play应用会通过getSystemAvailableFeatures()获取到当前设备所支持的软硬件特征,然后将此列表发送给Google Play,之后当用户在这台设备上通过Google Play浏览或查找应用时,Google Play会将每个应用所需要的feature和用户设备支持的feature做比较。
只有那些所有需要的feature在当前设备上都支持的app才会显示出来,如果一个app所需要的某个feature不能被当前设备满足,那么在这台设备上就不会显示这个app。
五、对Google Play审核的影响
Google Play要求app必须显式的声明所有需要的features,尤其是那些通过uses-permission可以推断出来的features。
例如在uses-permission中声明了CAMERA权限,那么显然app需要使用摄像头,而如果这时又没有声明和摄像头有关的uses-feature,那么Google Play会认为app没有声明所有需要的features,可能会导致审核失败。
六、总结
如果你是App的开发者,Google Play Console的提供了Device catalog功。
超过几万台通过Google Play兼容性测试的Android设备,方便快捷的获得应用所支持和不支持的设备列表以及应用不支持该设备的原因,帮助开发者决策。