原文地址: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在开发人员控制台提供了过滤选项来同意你控制你的应用在非技术方面的可用性,比方用户位置。