设备兼容性概述

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 的未来版本兼容,同时使用已记录的 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(超超高)等

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

尽可能使用灵活的布局来优化用户体验。在存在针对大型配置更改(例如纵向和横向,或大窗口和小窗口尺寸)的布局的情况下,请考虑提供对配置中较小更改具有灵活性的备用布局。这可以改善平板电脑、手机和折叠屏等外形尺寸上的用户体验。在多窗口模式下窗口大小发生变化时,它也有所帮助。

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

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

除了根据设备特性限制应用的可用性之外,您可能还需要出于业务或法律原因限制应用的可用性。对于此类情况,Google Play 商店在 Play 管理中心提供过滤选项,让您可以出于非技术原因(例如用户语言环境或无线运营商)控制应用的可用性。

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

其他资源

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