原文地址:http://developer.android.com/guide/practices/compatibility.html
android被设计成可以在多种不同的设备上运行的系统,为了达到这个目的,android系统提供了一个动态app框架,在这个框架中你可以在动态文件(为不同屏幕大小的不同xml布局文件)中提供具体的配置资源,android会根据设备配置加载适当的资源。
兼容性是什么意思?
有两种不同的适配:设备适配和app适配。
设备兼容:能够在android执行环境下正常运行应用程序。
作为一个app开发者,你不需要是否一个设备是设备兼容的。但是你必须得考虑在这样潜在的设备配置下的app适配。
让你的应用对设备来说可用
一些特征是基于硬件的比如指南针传感器,一些是基于软件的不如app widgets,一些是基于平台版本的.
为了实现你的应用程序的最大的用户群,你应该努力使用一个apk来支持越多的设备配置越好。在很多情况下,你应该在运行时禁用可选的功能,为不同的配置提供应用程序资源的替代品(比如为不同的屏幕尺寸提供不同的布局文件),如果必须,你需要通过Google play的以下特征来限制你的应用程序的可用性:
1,设备特征
2.平台版本
3.屏幕配置
设备特征
为了让你基于设备特征合适的管理你的app,android定义了featuresIds,比如说指南针传感器的featureid是FEATURE_SENSOR_COMPASS
,
app widgets的feature id是FEATURE_APP_WIDGETS
.
如果必要的话,你可以保护安装你的app但是他们的设备没有提供在你的manifest文件中用<uses-feature>
声明的feature的用户.
比如说,你的app不会再一个缺少指南针传感器的设备上起作用,你可以这样在你的manifest文件中声明指南针传感器:
<manifest ... > <uses-feature android:name="android.hardware.sensor.compass" android:required="true" /> ... </manifest>Google play 商店比较你app声明的feature和用户设备中上的feature,来决定你的app是否兼容每个应用。若设备没有提供所有你的app需要的feature,用户就不能安装你的app.
但是,若你的app的主要作用不需要一个设备feature,你需要设置required属性为false而且在设备运行时检测设备feature,若你的app feature在当前设备不可用,你需要优雅的降解app feature,比如,你可以像这样通过调用hasSystemFeature()查询一个feature是否可用:
PackageManager pm = getPackageManager(); if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) { // This device does not have a compass, turn off the compass feature disableCompassFeature(); }
平台版本
比如, Calendar Provider API是在API level 14之后添加的,如果你的app必须使用这个api,你可以这样声明你支持的最低版本号是14:
<manifest ... > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> ... </manifest>
targetSdkVersion
是重要的,因为它暗示系统你的app是否继承在新版本中的行为改变,若你不把targetSdkVersion更新到最新版本,这时系统假设在运行最新版本sdk时,你的app需要的是先前兼容的行为。
若你的app使用一些在最近的sdk版本中添加的api,但是不把他们作为主要功能,你应该在运行时检查API
levels,同时当API level太低时,优雅的降低符合的feature.这种情况下,将能支持你app运行的最低的APIlevel赋值给
minSdkVersion,然后比较当前系统版本
SDK_INT 与你想检查的符合的api版本比较。比如:
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
APIs
disableDragAndDrop();
}
屏幕配置
为了通过设备的屏幕类型将设备分类,Android为每个设备定义了两种特征:屏幕尺寸(small, normal, large, and xlarge)和屏幕密度(mdpi (medium), hdpi (hdpi), xhdpi (extra high), xxhdpi (extra-extra high), and others.)。
默认情况下你的app是兼容所有尺寸和密度的,系统为每个屏幕对你的UI布局和image资源做了合适的调整,但是你应该通过为不同尺寸的屏幕添加特殊的布局和为普通屏幕密度优化bitmap images来优化用户体验。
出于商业原因,控制应用程序的可用性
你应该为了商业或法律的原因来限制你的app的可用性,不如一个展示伦敦地下列车表的应用不能在英国之外使用,对于这种类型的情况,Google play在开发者控制台提供了过滤选项来允许你控制你的应用在非技术方面的可用性,比如用户位置。