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 利用这些功能。有些功能基于硬件,例如罗盘传感器;有些功能基于软件,例如应用 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 文件中指定 minSdkVersion 和 targetSdkVersion 值:
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(36) ... } }
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 36 ... } }
如需详细了解 build.gradle 文件,请参阅配置 build。
每个后续 Android 版本都可与使用先前平台版本的 API 构建的应用兼容,因此,只要使用文档中介绍的 Android API,您的应用就能与未来的 Android 版本兼容。
不过,如果您的应用使用较新平台版本中添加的 API,但其主要功能不需要这些 API,请在运行时检查 API 级别,并在 API 级别过低时优雅降级相应功能。在这种情况下,请将 minSdkVersion 设置为应用主要功能所需的最低值,然后将当前系统的版本 SDK_INT 与 Build.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。