Android 旨在在许多不同的设备上运行,例如手机、平板电脑和电视。设备的广泛选择为您的应用提供了巨大的潜在受众。为了使您的应用在所有设备上都能取得成功,它必须容忍功能差异,并提供一个灵活的用户界面,以适应不同的屏幕配置。
为了帮助实现设备兼容性,Android 提供了一个动态应用框架,您可以在其中提供特定于配置的应用资源(位于静态文件中),例如针对不同屏幕尺寸的不同 XML 布局。然后,Android 会根据当前设备配置加载相应的资源。通过对应用设计和附加应用资源进行预先考虑,您可以发布一个优化各种设备上用户体验的单个应用包 (APK)。
但是,如果需要,您可以指定应用的功能要求,并控制哪些类型的设备可以从 Google Play 商店安装您的应用。本文档说明了如何控制哪些设备可以访问您的应用,以及如何准备应用以吸引合适的受众。
“兼容性”是什么意思?
关于 Android 开发,有两种类型的兼容性:设备兼容性和应用兼容性。
由于 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
文件中指定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(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_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(超超高)等
默认情况下,您的应用与所有屏幕尺寸和密度兼容,因为系统会根据需要针对每个屏幕调整您的 UI 布局和图像资源。为常见的屏幕密度提供优化的位图图像。
尽可能使用灵活的布局来优化用户体验。在存在针对大型配置更改(例如纵向和横向,或大窗口和小窗口尺寸)的布局时,请考虑提供对较小的配置更改灵活的备用布局。这改善了平板电脑、手机和折叠屏等外形尺寸上的用户体验。在多窗口模式下窗口大小发生变化时,它也有帮助。
有关如何为不同的屏幕创建替代资源以及如何在必要时将应用限制到特定屏幕尺寸的信息,请阅读屏幕兼容性概述并查看大屏幕应用质量指南。
出于业务原因控制应用的可用性
除了根据设备特性限制应用的可用性外,您可能还需要出于业务或法律原因限制应用的可用性。对于此类情况,Google Play 商店在 Play 管理中心提供了筛选选项,让您可以出于非技术原因(例如用户区域设置或无线运营商)控制应用的可用性。
技术兼容性筛选(例如必需的硬件组件)始终基于 APK 或 AAB 文件中包含的信息。但是,非技术原因的筛选(例如地理位置)始终在Google Play 管理中心中处理。
其他资源
- 应用资源概述
- 有关 Android 应用如何构建以将应用资源与应用代码分离开的信息,包括如何为特定设备配置提供替代资源。
- Google Play 上的筛选器
- 有关 Google Play 商店如何防止您的应用安装在不同设备上的不同方法的信息。
- Android 上的权限
- Android 如何使用权限系统限制应用对某些 API 的访问,该系统要求用户同意您的应用才能使用这些 API。