03 Device Compatibility–设备兼容性

原文链接:http://developer.android.com/guide/practices/compatibility.html

Android系统被设计运行在许多不通类型的设备上,从智能手机到平板电脑和智能电视。作为一个开发者,不同种类的设备为你的应用程序提供了一个巨大的潜在使用人群。为了让你的应用能在所有的设备上表现完美,你的应用应当适应一些可变的特性并且提供一个可变的用户界面来适应不通配置的屏幕。

为了方便你朝着这一目标努力,Android系统提供了一个动态的应用程序框架这样你就可以在静态文件中提供配置明确的应用资源(例如不同的XML布局文件对应不同的屏幕尺寸)。Android系统会根据当前设备的配置加载合适的资源。因此通过事先的应用程序设计和一些额外的应用资源,你可以发布一个单一的apk并在不同设备上提供一个优化的用户体验。

如果需要,你可以指定你的应用所需的特性并控制哪种类型的设备可以从Google Play商店上安装你的应用。这篇文章解释了你如何控制何种类型的设备可以访问你的应用,并且如何准备你的应用来确保它们捕获最佳的用户。更多的关于你如何使你的应用程序匹配不通的设备,请阅读Supporting Different Devices

What Does “Compatibility” Mean?
兼容性意味着什么


随着你阅读更多关于Android的开发,在许多情况下你很可能会遇到兼容性术语。有两种兼容性:设备兼容性和应用程序兼容性。

由于Android是一个开源的系统,任何一个硬件生产者都可以生产运行Android系统的设备。到目前位置,一个设备是兼容Android的仅仅是它可以正确运行为Android运行环境开发的应用程序。Android运行环境的详细信息由Android compatibility program来定义并且每一个设备必须通过兼容性测试程序(CTS)来确保兼容性。

作为一个应用程序开发者,你不需要关心一个设备是否是兼容Android的,因为只有兼容Android的设备才会内置Google Play商店。所以你可以确定从Google Play商店安装你的应用的用户使用的是兼容Android的设备。

然而,你需要考虑你的应用是否兼容每一个潜在的设备配置。因为Android系统运行在种类的繁多的设备上,一些特性不见得在所有设备上都可用。例如,一些设备可能不包含罗盘传感器。如果你的应用和核心功能需要使用罗盘传感器,那你的应用就只兼容拥有罗盘传感器的设备。

Controlling Your App’s Availability to Devices
控制你的应用对设备可用


Android系统提供了多种多样的特性你的应用可以通过平台API来使用。一些特性是依赖硬件的(例如电子罗盘传感器),一些特性是依赖软件的(例如应用程序小插件),一些是依赖特定平台版本的。不是所有的设备都支持所有的特性,所以你可能需要依据你的应用所需的特性来控制你的应用程序对设备的可用性。

为了对你的应用做到基于用户的最大化可能,你应当用一个apk去适应更多不通配置的设备。在大多数情况下,你可以通过在运行时禁止可选的特性和为不同配置的设备提供可选的应用程序资源来实现(例如不同的布局文件配合不同的屏幕尺寸)。如果必要,你可以限制你的应用程序对设备的可用性,通过Google Play商店根据以下设备特征:

Device features
设备特性

为了方便你管理你的应用基于设备特性的可用性,Android系统为每一种硬件或软件定义了feature IDs,但是可能并非在所有设备上都可用。举个例子,电子罗盘传感器的feature ID是FEATURE_SENSOR_COMPASS,应用程序小插件的feature ID是FEATURE_APP_WIDGETS

如果可以,你可以阻止用户安装你的应用当他们的设备不能够提供在你的应用程序的manifest文件中<uses-feature>标签中定义的特性的时候。

例如,当你的应用在缺少电子罗盘传感器的设备上是没有意义的时候,你可以通过接下来的manifest标签来定义电子罗盘传感器是必须的:

Google Play商店通过比较你的应用程序所需的特性是否在每一个用户的设备上满足来决定你的应用是否与每一个设备匹配。如果设备没有提供你的应用程序需要的所有特性,用户将无法安装你的应用。

然而,如果你的应用的首要功能不需要设备特性,你可以设置required属性为”false”并且在运行时检查设备特性。如果应用程序所需的特性在当前设备上并不满足,则优雅的降低应用的相应功能。例如,你可以查询设备的特性是否可用通过调用hasSystemFeature()):

关于所有的通过Google Play商店的你可以用来控制你的应用是否对用户可见的过滤器,可以查看Filters on Google Play文档。

Notes:一些系统权限(system permissions)隐含的需要设备特性的可用性。例如,如果你的应用需要访问蓝牙(BLUETOOTH)的权限,这就隐含的需要FEATURE_BLUETOOTH设备特性。你可以基于这个特性使过滤器不可用并且通过在<uses-feature>标签中设置required属性为”false”来让你的应用在没有蓝牙的设备上也可用。更多的关于隐含需要设备特性的内容请阅读Permissions that Imply Feature Requirements

Platform version
平台版本

不同的设备可能运行不同的Android版本,例如Android 4.0或Android 4.4。每一个新版本经常会加入在之前版本中并不可用的新的API。每一个版本会指定一个API级别(API level)以表明哪一个API集合可用。举个例子,Android 1.0的API级别是1,Android 4.4的API级别是19。

API级别允许你定义你的应用能兼容的最小系统版本,通过使用manifest文件中<uses-sdk>标签和minSdkVersion属性。

例如,日历提供器(Calendar Provider)的API在Android 4.0(API level 14)系统中被加入。如果你的应用离开这些API就无法工作,你应当定义API level 14作为你的应用所能支持的最小版本,就像这下面这样:

minSdkVersion属性定义了你的应用所兼容的最小版本,targetSdkVersion属性定义了你已经优化了的你的应用所匹配的最高版本。

每一个Android版本为应用程序提供与上一个版本的兼容性,这样你的应用程序应当总是使用有记录的Android API以便与未来的版本兼容。

Notes:targetSdkVersion属性并不是阻止你的应用安装在比你指定的版本高的版本上,但是它是重要的,因为它向系统说明了你的应用是否应该在新的版本中继承行为。如果你不升级targetSdkVersion到最新的版本,系统假定你的应用需要一些向后的兼容性当运行在最新的版本上时。例如,在Android 4.4中,使用AlarmManager来创建闹钟默认是不准确的,因为系统可以分批处理应用闹钟并节省系统电量,但是系统会为你的应用保留之前的API行为如果你的目标API级别低于19。

然而,如果你的应用使用了一些当前版本新加入的API但是主要功能并不需要它们,你应当在程序运行时检查API的级别并优雅的降低相应的功能在API级别过低的时候。在这种情况下,设置minSdkVersion为最低的值以便使你的应用的主要功能可用,然后比较当前系统的版本(SDK_INT)是否与你需要的一致通过Build.VERSION_CODES代码。例如:

Screen configuration
屏幕配置

Android系统运行在不通尺寸的设备上,从手机到平板和电视。为了通过他们的屏幕类型来分类,Android系统为每一种设备定义了两个特征:屏幕尺寸(屏幕的物理尺寸)和屏幕密度(像素在屏幕上的物理密度,DPI)。为了简化不同的配置,Android系统概括了这些变异体到每一组中为了便于区分它们:

  • 四种概括的尺寸:small,normal,large和large。
  • 和一些概括的屏幕密度:mdpi(medium),hdpi(hdpi),xhdpi(extra high),xxhdpi(extra-extra high)和其他。
    默认情况下,你的应用是匹配所有的屏幕尺寸和屏幕密度的,因为系统在必要的时候对你的UI布局和图片资源针对每一种屏幕做了合适的调整。然而,你应当为用户不同的屏幕配置提供优化通过为不同的屏幕添加指定的布局并为一般密度的屏幕添加优化的bitmap图片。

更多的关于为不同的屏幕创建可选的资源和如何在必要的时候为你的应用程序限制屏幕尺寸,请阅读Supporting Different Screens

Controlling Your App’s Availability for Business Reasons
为了商业因素控制你的应用的可用性


除了基于设备限制应用的可用性,基于商业和法律因素限制你的应用的可用性对你来说可能更为现实。举个例子,一个展示伦敦地铁时刻表的应用对不在英国的用户来说用处不大。这种情况,Google Play商店在开发者控制台提供了过滤,允许你基于非技术的因素控制你的应用的可用性,例如用户的位置和网络运营商。

基于技术兼容性的过滤往往通过包含在你apk文件中的信息(例如需要的硬件组件)来实现。但是非技术的因素(例如地理位置)往往通过Google Play的开发者控制台来实现。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">