设备兼容性概览

Android 设计为可在许多不同的设备上运行,例如手机、平板电脑和电视。如此多的设备可为您的应用提供庞大的潜在受众群体。为了让应用能够在所有设备上取得成功,它必须能够容忍功能变化,并提供可适应不同屏幕配置的灵活界面。

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

不过,如有必要,您可以指定应用的功能要求,并控制哪些类型的设备可以从 Google Play 商店安装您的应用。本文档介绍了如何控制哪些设备可以访问您的应用,以及如何让您的应用做好准备以覆盖合适的受众群体。

“兼容性”是什么意思?

就 Android 开发而言,兼容性分为两种类型:设备兼容性和应用兼容性。

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

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

不过,您需要考虑您的应用是否与每种潜在的设备配置兼容。由于 Android 能够在多种设备配置上运行,因此某些功能可能无法在部分设备上使用。例如,某些设备可能未配备罗盘传感器。如果应用的核心功能需要使用罗盘传感器,则该应用仅与包含该功能的设备兼容。

控制应用在设备上的可用性

您的应用可通过平台 API 利用 Android 支持的各种功能。一些功能基于硬件(如罗盘传感器);一些基于软件(如应用 widget);一些基于平台版本。并非每台设备都支持所有功能,因此您可能需要根据应用所需的功能来控制应用在设备上的可用性。

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

设备功能

为了根据设备功能管理应用的可用性,Android 为可能并非适用于所有设备的任何硬件或软件功能定义了功能 ID。例如,罗盘传感器的功能 ID 为 FEATURE_SENSOR_COMPASS,应用 widget 的功能 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 文件,请参阅配置 build

每个后续的 Android 版本都会兼容使用以前平台版本中的 API 构建的应用,因此您的应用既能与 Android 的未来版本兼容,又能与已载述的 Android API 兼容。

但是,如果您的应用使用的是较新平台版本中添加的 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 将这些变体归纳成组,使其更易于定位:

  • 四种广义尺寸:小、标准、大和特大
  • 多种广义密度:mdpi(中)、hdpi(高)、xhdpi(超高)、xxhdpi(超超高)等

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

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

如需了解如何为不同屏幕创建备用资源,以及如何在必要时限制应用仅支持特定屏幕尺寸,请参阅屏幕兼容性概览以及大屏设备应用质量指南

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

除了根据设备特性限制应用的可用性之外,您可能还需要出于业务或法律原因限制应用的可用性。例如,显示伦敦地铁时刻表的应用对英国境外的用户不太可能有用。对于这种情况,Google Play 商店在 Play 管理中心内提供了过滤选项,可让您基于非技术原因(例如用户的语言区域或无线运营商)控制应用的可用性。

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

其他资源:

应用资源概览
有关 Android 应用如何构建以将应用资源与应用代码分开的信息,包括如何针对特定设备配置提供备用资源。
Google Play 上的过滤器
有关 Google Play 商店阻止您的应用安装在不同设备上的不同方式的信息。
Android 中的权限
Android 如何通过一种权限系统来限制应用对特定 API 的访问权限,该系统要求用户同意您的应用使用这些 API。