蜗牛计划day02:Android设备兼容性

本文为三七原创译文,未经允许,不得转载。个人翻译,如有错误,望朋友们指正。

原文链接:https://developer.android.google.cn/guide/practices/compatibility.html

设备兼容性参考官方网站:http://source.android.google.cn/compatibility/index.html

Android是设计来运行在手机、平台、电视等多个不同类型的设备上的。作为一个开发者,这些设备为您的APP提供了大量的潜在用户。为了让您的应用能够在所有的这些设备上正常运行,您需要兼容一些功能的可变性并且提供灵活的用户界面来适配不同的屏幕配置。

Android提供了一个动态的应用框架来帮助您实现这一目标,您可将在特定配置的APP资源(例如不同的屏幕尺寸的不同的XML布局)放在静态文件里,Android就能根据当前配置加载合适的资源。因此,好好研究下您的应用程序设计和额外的应用资源,您就可以发布一个在大量设备上都提供了最好的体验的安装包(APK)。

但是,如果有必要,您可以指定应用程序的功能要求,并控制哪些类型的设备可以从Google Play商店安装您的应用程序。 本页面介绍如何控制哪些设备可以访问您的应用,以及如何准备应用以确保他们覆盖适当的用户群体。 有关如何让您的应用适配不同设备的更多信息,请阅读支持不同设备

“兼容性”是什么意思?

在阅读有关Android开发的更多内容时,您可能会在各种情况下遇到术语“兼容性”。有两种兼容性:设备兼容性应用程序兼容性

由于Android是一个开源项目,任何硬件制造商都可以制造一个运行Android操作系统的设备。但是,只有在设备能够正确运行针对Android执行环境编写的APP的情况下,才能说“该设备是兼容Android的”。Android执行环境的具体细节由Android兼容性程序定义,每个设备必须通过兼容性测试套件(CTS)才能被视为兼容。

作为一名应用开发人员,您无需担心设备是否与Android兼容,因为只有兼容Android的设备才会安装Google Play商店。因此,您可以放心,从Google Play商店安装您的应用的用户正在使用Android兼容设备。

但是,您需要考虑您的应用是否与每种潜在的设备配置兼容。由于Android在各种设备配置上运行,某些功能并不是在所有设备上都可用。例如,一些设备可能没有指南针传感器。如果您的应用程序的核心功能需要使用指南针传感器,那么您的应用程序仅与有指南针传感器的设备兼容。

控制您的应用程序对设备的可用性

Android支持您的应用可以通过平台API使用各种功能。有些功能是基于硬件的(比如指南针传感器),有些功能是基于软件的(比如应用部件),有些则依赖于平台版本。并非所有设备都支持所有功能,因此您可能需要根据应用程序的所需功能来控制应用程序对设备的可用性。

要为您的应用程序实现最大的用户基础可用性,您应该努力使用单个APK来支持尽可能多的设备配置。在大多数情况下,您可以通过在运行时禁用可选功能并为不同配置(例如不同屏幕尺寸的不同布局)提供应用程序资源。但是,如有必要,您可以根据以下设备特征,通过Google Play商店限制应用程序在设备上的可用性:

  • 设备功能
  • 平台版本
  • 屏幕配置

设备功能

为了让您根据设备功能管理应用的可用性,Android 为任何可能无法在所有设备上使用的硬件或软件功能定义了功能ID。例如,指南针传感器的功能ID是FEATURE_SENSOR_COMPASS,应用程序窗口小部件的功能ID是FEATURE_APP_WIDGETS

如有必要,可以通过声明应用程序清单文件中的元素<uses-feature>来防止用户在设备不提供给定功能时安装应用程序。

例如,如果您的应用程序在缺少指南针传感器的设备上没有意义,则可以根据需要使用以下清单标签声明指南针传感器:

1
2
3
4
5
<manifest ... >
<uses-feature android:name="android.hardware.sensor.compass"
android:required="true" />
...
</manifest>

Google Play商店会将您应用所需的功能与每个用户的设备上提供的功能进行比较,以确定您的应用是否与每个设备兼容。如果设备没有提供您的应用所需的全部功能,则用户无法安装您的应用。

但是,如果您的应用程序的主要功能不需要设备功能,则应该将该required属性设置为false并在运行时检查设备功能。如果应用程序功能在当前设备上不可用,请适度降低相应的应用程序功能。例如,您可以通过调用hasSystemFeature())来查询某个功能是否可用:

1
2
3
4
5
PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
// This device does not have a compass, turn off the compass feature
disableCompassFeature();
}

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

注意: 某些系统权限隐含地要求设备功能的可用性。例如,如果您的应用程序请求BLUETOOTH访问权限,则这隐含地要求FEATURE_BLUETOOTH设备功能。您可以通过将<uses-feature>标签中的required属性设置为false来禁用基于此功能的过滤功能,这样可以让没有蓝牙功能的设备也能安装你的应用。有关设备功能需求的更多信息,请阅读含有功能要求的权限

平台版本

不同的设备可能运行不同版本的Android平台,如Android 4.0或Android 4.4。每个迭代的平台版本通常会添加之前版本中不可用的新API。为了指示哪些API可用,每个平台版本指定一个API级别。例如,Android 1.0是API级别1,Android 4.4是API级别19。

API级别允许您使用<uses-sdk>清单标记及其 minSdkVersion 属性来声明与您的应用程序兼容的最低版本。

例如,日历提供程序API已添加到Android 4.0(API级别14)中。如果您的应用程序无法在没有这些API的情况下运行,您应该将API级别14声明为应用程序的最低支持版本,如下所示:

1
2
3
4
<manifest ... >
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
...
</manifest>

minSdkVersion属性声明了与您的应用程序兼容的最低版本,并且该targetSdkVersion属性声明了您对应用程序进行了优化的最高版本。

Android的每个后续版本都提供了使用以前平台版本的API构建的应用程序的兼容性,因此,在使用这些归档的Android API时,您的应用程序应始终与将来的Android版本兼容。

注意:targetSdkVersion 属性不会阻止您的应用程序安装在高于指定值的平台版本上,但是这一点非常重要,因为它向系统表明您的应用程序是否应继承新版本中的行为更改。如果您不更新targetSdkVersion到最新版本,则系统会假定您的应用程序在最新版本上运行时需要一些向后兼容的行为。例如,Android 4.4中的行为更改中,使用AlarmManagerAPI 创建的警报现在默认为不精确,因此系统可以批量应用警报并保留系统能力,但是如果您的目标API级别低于“19”,系统会保持以前的API行为。

但是,如果您的应用程序使用了在更新的平台版本中添加的API,但不必需它们的主要功能,则应在运行时检查API级别,并在API级别太低时适当降低相应的功能。在这种情况下,请将minSdkVersion 设置为可能的最低值,然后将当前系统的版本,与您要检查的API级别对应SDK_INT的代码名称常量进行比较Build.VERSION_CODES。例如:

1
2
3
4
5
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
// Running on something older than API level 11, so disable
// the drag/drop features that use [ClipboardManager](https://developer.android.google.cn/reference/android/content/ClipboardManager.html) APIs
disableDragAndDrop();
}

屏幕配置

Android可在各种尺寸的设备上运行,从手机到平板电脑和电视。为了按照屏幕类型对设备进行分类,Android为每个设备定义了两个特征:屏幕大小(屏幕的物理大小)和屏幕密度(屏幕像素的物理密度,即DPI)。为了简化不同的配置,Android将这些变量概括为可以更容易定位的分组:

  • 四大尺寸:小,正常,大,和大。
  • 还有几个广义的密度:mdpi(medium),hdpi(hdpi),xhdpi(extra high),xxhdpi(extra-extra high)等等。

默认情况下,您的应用程序与所有屏幕大小和密度兼容,因为系统会根据每个屏幕的需要对UI布局和图像资源进行适当的调整。但是,您应该通过针对不同的屏幕尺寸添加专门的布局并针对常见的屏幕密度优化位图图像来优化每个屏幕配置的用户体验。

有关如何为不同屏幕创建替代资源以及如何在必要时将应用程序限制为特定屏幕大小的信息,请阅读“支持不同屏幕”

控制您的应用程序的业务原因的可用性

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

过滤技术兼容性(例如所需的硬件组件)始终基于APK文件中包含的信息。但是,由于非技术原因(如地理区域设置)的过滤总是在Google Play控制台中处理。

如果您觉得这篇文章不错,可以打赏支持下哦,谢谢