设备兼容性概览

Android 旨在运行于各种不同的设备,例如手机、平板电脑和电视。设备种类繁多,为您的应用提供了巨大的潜在受众。为了让您的应用在所有设备上都能成功运行,它必须能够容忍功能差异,并提供一个能适应不同屏幕配置的灵活用户界面。

为了帮助实现设备兼容性,Android 提供了一个动态应用框架,您可以在其中以静态文件的形式提供特定于配置的应用资源,例如针对不同屏幕尺寸的不同 XML 布局。然后,Android 会根据当前设备配置加载相应的资源。通过对应用设计的周密考虑和额外的应用资源,您可以发布一个单一的应用软件包 (APK),以优化在各种设备上的用户体验。

但是,如有必要,您可以指定应用的功能要求,并控制哪些类型的设备可以从 Google Play 商店安装您的应用。本文档介绍了如何控制哪些设备可以访问您的应用,以及如何准备您的应用以触达合适的受众。

“兼容性”是什么意思?

在 Android 开发中,存在两种兼容性:设备兼容性应用兼容性

由于 Android 是一个开源项目,任何硬件制造商都可以构建运行 Android 操作系统的设备。但是,只有当设备能够正确运行为 Android 执行环境编写的应用时,它才“与 Android 兼容”。Android 执行环境的具体细节由Android 兼容性计划定义。每台设备都必须通过兼容性测试套件 (CTS) 才能被视为兼容。

作为应用开发者,您无需担心设备是否与 Android 兼容,因为只有与 Android 兼容的设备才包含 Google Play 商店。因此,如果用户从 Google Play 商店安装您的应用,他们使用的就是与 Android 兼容的设备。

但是,您需要考虑您的应用是否与每个潜在的设备配置兼容。由于 Android 运行在各种设备配置上,因此某些功能并非在所有设备上都可用。例如,某些设备可能不包含指南针传感器。如果您的应用的核心功能需要指南针传感器,那么您的应用只与包含该功能的设备兼容。

控制应用对设备的可用性

Android 支持您的应用可以通过平台 API 利用的各种功能。有些功能是基于硬件的,例如指南针传感器;有些是基于软件的,例如应用微件;还有一些取决于平台版本。并非所有设备都支持所有功能,因此您可能需要根据应用所需的功能来控制应用对设备的可用性。

为了让您的应用获得尽可能大的用户群,请使用单个 APK 或 AAB 支持尽可能多的设备配置。在大多数情况下,您可以通过在运行时禁用可选功能并提供应用资源以及针对不同配置(例如不同屏幕尺寸的不同布局)的替代方案来实现此目的。如有必要,您可以通过 Google Play 商店根据以下设备特性限制应用对某些设备的可用性

设备功能

为了根据设备功能管理应用的可用性,Android 为可能并非在所有设备上都可用的任何硬件或软件功能定义了功能 ID。例如,指南针传感器的功能 ID 为 FEATURE_SENSOR_COMPASS,应用微件的功能 ID 为 FEATURE_APP_WIDGETS

如有必要,您可以通过在应用的清单文件中使用 <uses-feature> 元素声明功能,从而阻止用户在设备未提供必要功能时安装您的应用。

例如,如果您的应用在缺少指南针传感器的设备上无法正常运行,您可以使用以下清单标记将指南针传感器声明为必需项

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

Google Play 商店会比较您的应用所需的功能与每个用户设备上可用的功能,以确定您的应用是否与每个设备兼容。如果设备不具备您的应用所需的所有功能,则用户无法安装您的应用。

但是,如果您的应用的主要功能不需要某个设备功能,请将 required 属性设置为 "false",并在运行时检查设备功能。如果当前设备上没有该应用功能,请相应地降级应用功能。例如,您可以通过调用 hasSystemFeature() 来查询某个功能是否可用,如下所示

Kotlin

if (!packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device doesn't have a compass. Turn off the compass feature.
    disableCompassFeature()
}

Java

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device doesn't have a compass. Turn off the compass feature.
    disableCompassFeature();
}

有关可用于通过 Google Play 商店控制应用可用性的所有筛选条件的信息,请参阅 Google Play 上的筛选条件文档。

平台版本

不同的设备可能运行不同版本的 Android 平台,例如 Android 12 或 Android 13。每个后续平台版本通常都会添加前一版本中不可用的 API。为了指示哪些 API 可用,每个平台版本都会指定一个 API 级别。例如,Android 12 是 API 级别 31,Android 13 是 API 级别 33。

您必须在 build.gradle 文件中指定 minSdkVersiontargetSdkVersion

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"

        // Defines the minimum API level required to run the app.
        minSdkVersion(30)

        // Specifies the API level used to test the app.
        targetSdkVersion(33)
        ...
    }
}

Groovy

android {
    defaultConfig {
        applicationId 'com.example.myapp'

        // Defines the minimum API level required to run the app.
        minSdkVersion 30

        // Specifies the API level used to test the app.
        targetSdkVersion 33
        ...
    }
}

有关 build.gradle 文件的更多信息,请阅读配置您的构建

每个后续版本的 Android 都为使用先前平台版本的 API 构建的应用提供兼容性,因此您的应用在使用已记录的 Android API 的同时,也能与未来版本的 Android 兼容。

但是,如果您的应用使用了较新平台版本中添加的 API,但其主要功能并不需要这些 API,请在运行时检查 API 级别,并在 API 级别过低时适当地降级相应功能。在这种情况下,将 minSdkVersion 设置为您的应用主要功能所需的最低值,然后将当前系统的版本 SDK_INTBuild.VERSION_CODES 中与您要检查的 API 级别对应的代号常量进行比较,如以下示例所示

Kotlin

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag and drop features that use ClipboardManager APIs.
    disableDragAndDrop()
}

Java

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag and drop features that use ClipboardManager APIs.
    disableDragAndDrop();
}

屏幕配置

Android 运行在各种尺寸的设备上,例如手机、平板电脑和电视。为了按屏幕类型对设备进行分类,Android 为每种设备定义了两个特性:屏幕尺寸(屏幕的物理尺寸)和屏幕密度(屏幕上像素的物理密度,称为DPI)。为了简化不同的配置,Android 将这些变体概括为易于定位的组

  • 四种通用尺寸:small(小)、normal(正常)、large(大)和 xlarge(特大)
  • 几种通用密度:mdpi(中)、hdpi(高)、xhdpi(超高)、xxhdpi(超超高)以及其他

默认情况下,您的应用兼容所有屏幕尺寸和密度,因为系统会根据每个屏幕的需要调整您的 UI 布局和图片资源。为常见的屏幕密度提供优化的位图图像。

尽可能使用灵活布局来优化用户体验。对于大型配置更改(例如纵向和横向,或大窗口与小窗口尺寸),请考虑提供可灵活适应配置较小更改的替代布局。这可以改善平板电脑、手机和折叠屏等外形设备上的用户体验。当窗口在多窗口模式下更改大小时,这也有所帮助。

有关如何为不同屏幕创建替代资源以及必要时如何将应用限制为特定屏幕尺寸的信息,请阅读屏幕兼容性概览并参阅大屏应用质量准则

出于商业原因控制应用的可用性

除了根据设备特性限制应用的可用性之外,您可能还需要出于商业或法律原因限制应用的可用性。对于这种情况,Google Play 商店在 Play 管理中心提供了筛选选项,允许您出于非技术原因(例如用户区域设置或无线运营商)控制应用的可用性。

对技术兼容性(例如必需的硬件组件)的筛选始终基于 APK 或 AAB 文件中包含的信息。但出于非技术原因(例如地理区域设置)的筛选始终在 Google Play 管理中心处理。

其他资源

应用资源概览
有关 Android 应用如何构建以将应用资源与应用代码分离的信息,包括如何为特定设备配置提供替代资源。
Google Play 上的筛选条件
有关 Google Play 商店如何阻止您的应用安装在不同设备上的不同方式的信息。
Android 上的权限
Android 如何通过权限系统限制应用对某些 API 的访问,该系统要求用户同意您的应用才能使用这些 API。