uses-sdk配置

在AndroidManifest.xml中有一个uses-sdk的配置,用来设置app对android系统的兼容性。它包含三个可选的配置项,分别为android:minSdkVersion,android:targetSdkVersion和android:maxSdkVersion,例如:

    <uses-sdk  android:minSdkVersion="9" android:targetSdkVersion="23" android:maxSdkVersion="23" />

配置项的值是一个代表Android API Level的整数。每个API Level对应一个Android系统的版本。API Level和Android版本的最新对应关系如图所示(截止2015年9月30日)。
AndroidManifest.xml中uses-sdk配置详解_第1张图片

android:minSdkVersion配置项含义

此选项表示应用运行时所需要的最低的API版本。也就是说,在低于android:minSdkVersion指定的API Level的Android系统上,应用无法正常运行。Android系统在安装一个应用时会首先检查此项配置,如果当前系统的API Level低于这里指定的API Level,则应用无法被安装到系统中。
如果在AndroidManifest.xml中不指定android:minSdkVersion,则会默认其值为1,也就是说应用能够被安装到所有的Android系统中。如果应用中使用了高版本系统中才有的API,会导致应用在低版本系统中运行时崩溃。因此,一般来说所有的应用都应当指定合适的android:minSdkVersion值。即使应用确实能够兼容到Android 1.0,也应当显式的指定android:minSdkVersion为1,以明确的告知项目的其他开发者,这是一个需要兼容到Android 1.0的项目。
android:minSdkVersion配置除了在应用安装时会使用外,在开发阶段还会影响到Android lint。如果在代码中调用了一个高于android:minSdkVersion指定的API Level的API,Android lint会给出一个Lint error。例如android.content.res.Resources的getDrawable(int id, Theme theme)方法是在API Level21后才开始有的,如果指定了android:minSdkVersion低于21,会就给出如下的编译警告。

这里写图片描述

android:minSdkVersion配置项选取

通常一个应用在开发前就应当确定该应用能够兼容的最低的Android版本。显然一个应用能够兼容的Android版本越低,就越能够安装在更多的Android设备上,获得最大的用户群体。但是兼容越低的Android版本,同时也意味着无法利用高版本API带来的各种便利和效果,虽然Android推出了V4和V7兼容包,将一些高版本才能使用的组件放到兼容包中,但这并不能解决所有兼容性问题。此外,兼容更低版本意味着应用需要适配更多的低端机型,需要有更多的兼容性代码,应用发布前需要做更多的兼容性测试,这些都会带来开发成本的提高。
根据Google官方的统计(http://developer.android.com/about/dashboards/index.html),使用Android 2.2版本的设备在全部Android设备中只占0.2%,Android 2.2以下版本的设备占比均低于0.1%。如果应用能够兼容到Android 2.3(API Level 9),那么可以就可以覆盖99%以上的Android设备。因此,一般应用设置android:minSdkVersion为9就可以覆盖绝大多数的用户了。
此外,一款应用是否能够在一款机器上运行,除了受应用的最低兼容版本限制外,还受到应用的硬件需求的限制。所有的应用在运行时都会设备的硬件上有一定的要求,对一些特定类型的应用来说,需要较高的硬件性能才可以满足其正常运行的需要。例如,游戏类型的应用在运行时需要较高的CPU和GPU资源,包含大量图片的应用需要占用较高的内存。通常来说,运行越低版本的Android设备意味其硬件性能越低,如果硬件性能不能满足应用的需要,即使软件上能够兼容,应用也无法正常运行。
最后一点,所有应用在开发前都应当有目标用户群体的设定,如果设备的用户根本不会接触或使用这种类型的应用,那么即使软硬件上都能够兼容,也是没有意义的。通常来说,持有越低版本的Android设备意味着年龄段越大,或消费能力越低。
一般来说,对大多数类型的应用,能够兼容到Android 4.0就已经可以了。

android:targetSdkVersion配置项含义

此选项表示应用的目标系统版本,如果在AndroidManifest.xml中不指定android:targetSdkVersion,则会默认其值等于android:minSdkVersion。
对开发者来说,此选项意味着应用在开发阶段能够支持到的目标系统版本,结合minSdkVersion,开发者需要对minSdkVersion到targetSdkVersion之间的所有系统版本上进行细致的测试,保证没有任何兼容性问题。
对系统来说,应用在运行时,系统会检查其targetSdkVersion配置,如果当前系统版本低于或等于此项配置,表示应用开发者已经在当前系统上进行了全面的测试,无需做任何兼容性处理。如果当前系统版本高于此项配置,表示此应用开发时没有在当前系统版本上进行测试(这通常是因为当前系统版本发布时间晚于应用的发布时间),这时系统就会执行一系列的兼容性策略,保证应用能够在当前系统上正确的运行。这类似于Windows上的”以兼容模式运行这个程序”的功能,只是Android会自动根据当前版本和targetSdkVersion设置来选择是否使用兼容模式,以及兼容的目标版本。

android:targetSdkVersion配置项选取

targetSdkVersion配置项通常始终保持为当前最新的Android系统版本。如果应用发布后,Android系统版本又有新的更新,则下次应用更新时,应当将targetSdkVersion更新到最新的Android系统版本(当前还需要在新的系统上进行一些兼容性开发和测试)。

android:maxSdkVersion配置项含义

此选项的含义和android:minSdkVersion相反,它表示应用所能运行的最高的API版本。在Android 2.0.1及其以下的Android系统上,安装一个应用时会先检查此项配置,如果当前系统的API Level高于这里指定的API Level,则应用无法被安装到系统中。在Android 2.0.1以上的系统上,安装应用不会检查此项配置,也就是说在Android 2.0.1以上的系统上 android:maxSdkVersion会被忽略。
由于目前绝大多数设备都运行在Android2.2以上系统中,这项配置已经没有任何必要去设置了。

三个配置项的意义和影响范围小结

这里再对三个配置项的意义和影响范围进行一下小结。可以看到,这三个选项对主要影响的是Android Lint和应用的安装,对代码编译没有任何影响,对程序的运行也基本没有影响。

影响范围 minSdkVersion targetSdkVersion maxSdkVersion
Android lint 如果使用了高于minSdkVersion指定版本的API,则会给出Lint error 没有影响 没有影响
代码编译 没有影响 没有影响 没有影响
应用安装 如果当前系统版本低于minSdkVersion指定版本,则拒绝安装 没有影响 对Android 2.0.1及其以下系统,如果当前系统版本高于maxSdkVersion指定版本,则拒绝安装,对Android 2.0.1以上版本没有影响
程序运行 没有影响 如果当前系统版本高于targetSdkVersion指定版本,则应用会自动在兼容模式下运行 没有影响

Library工程中三个配置项的影响

在Android Library工程的AndroidManifest.xml文件中也可以配置android:minSdkVersion,android:targetSdkVersion和android:maxSdkVersion,不过这三个配置对引用它的工程没有任何影响,最终生成应用的这三个配置都只和应用本身所在工程配置有关,和它引用的Library工程中的配置无关。例如,有一个Library工程为A,它被一个能编译成apk的非Library工程B引用,B工程编译成的apk为B.apk。A工程下AndroidManifest.xml文件中的这三个配置项,无论如何配置,对B工程的编译,以及B.apk的安装和运行都没有任何影响。
虽然Library工程的android:minSdkVersion,android:targetSdkVersion和android:maxSdkVersion配置对应用的安装和运行没有影响,但并不表示这三个配置没有作用。他们的作用主要有如下几点。
1. Library工程在开发时,Android lint同样会根据此项配置来检查应用中是否在代码中使用了高版本的API,如果代码中使用了高于minSdkVersion指定版本的API,则会给出Lint error。
2. Library工程开发完成后是需要给其他开发者使用的,当一个应用的开发者需要使用一个Library工程的时候,看到Library工程的android:minSdkVersion,android:targetSdkVersion和android:maxSdkVersion这几项配置,就可以知道此Library工程能够稳定运行的版本范围,例如Library工程中android:minSdkVersion设置为11,表示Library工程能够在在API Level11及其以上的Android版本中运行,这意味着很可能Library工程中使用了API Level11及其以上版本中的API,这时如果引用它的工程对应的android:minSdkVersion设置为9,则虽然编译后的apk能够在API Level9对应的Android2.3系统上安装,但很可能出现应用在调用Library工程的某个接口时出现找不到API的异常。所以,应用开发者必须要保证应用的android:minSdkVersion设置大于等于其所引用的每一个Library工程中的android:minSdkVersion设置。

参考:
1. http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
2. http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#M
3. http://stackoverflow.com/questions/9503705/for-android-library-projects-is-uses-sdk-meaningful-in-manifest

更多相关文章

  1. Android进阶-Android系统信息与安全机制
  2. android 显示系统 surfaceflinger 分析
  3. 如何使Android应用程序获取系统权限
  4. Android中修改系统时间的几种方式
  5. Android的系统的Binder机制(一)
  6. android 有关怎么自己添加系统级服务 java层 重点aidl
  7. android9.0 系统默认时间修改

随机推荐

  1. c语言九九乘法表代码如何写
  2. c语言结构化程序设计的三种基本结构是什
  3. c语言如何求n个数的平均值?
  4. c语言字符常量的合法表示形式是什么
  5. c语言规定,函数返回值的类型是由什么决定
  6. unsigned int几个字节
  7. c语言如何读取txt文件内容?
  8. c语言常量的正确表示方法有哪些
  9. c语言static关键字的作用是什么
  10. .net framework有什么用