uses-sdk配置

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日)。 

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

AndroidManifest配置之uses-sdk的更多相关文章

  1. VS2015配置海康威视工业相机SDK二次开发

    1.概述:工业相机SDK是用于控制相机的一个独立组件,支持获取实时图像数据.配置参数.对图像进行后续处理等功能.工业相机SDK兼容GigE Vision协议.USB3 Vision协议.Camera ...

  2. Mac Android开发环境变量的配置(java、sdk、ndk、gradle)

    1.打开terminal 2.然后输入 vi .bash_profile 后按"e"进入编辑模式 3.输入想要配置的环境变量(Java.sdk.ndk.gradle): expor ...

  3. Android中配置JDK和SDK的环境变量

    JDK环境变量的配置: 右击"计算机"或"我的电脑",选择"属性"-->"高级"或"高级系统设置&quo ...

  4. 配置ESP8266 NONOS SDK时由于工具链版本差异引发的故障

    前几天部署ESP8266_NONOS_SDK时遇到了一个看似奇怪的问题,描述如下: examples例程可以通过编译,但烧写到ESP8266模块后,程序无法正常运行,编译和烧写的相关配置均无误.在bo ...

  5. windows下JDK环境配置与Android SDK环境配置

    一.JDK环境配置1.配置变量名:JAVA_HOME变量值:jdk安装的绝对路径. 变量名:Path(在系统变量中找到并选中Path点击下面的编辑按钮,不要删除原本变量值中的任何一个字母,在这个变量值 ...

  6. Android开发配置,消除SDK更新时的“https://dl-ssl.google.com refused”异常

    消除SDK更新时的“https://dl-ssl.google.com refused”错误 消除SDK更新时,有可能会出现这样的错误:Download interrupted: hostname i ...

  7. cordova 配置 高德地图sdk定位

    获取 sha1 打开 cmd 1. cd .android 2. keytool -list -v -keystore debug.keystore 3. 输入密钥: android 4. 复制 sh ...

  8. AndroidManifest 配置主活动

    在activity标签中写如下代码: <activity android:name=".MainActivity" android:label="This is M ...

  9. Android SDK 4.0.3 开发环境配置及运行

    最近又装了一次最新版本的ADK环境 目前最新版是Android SDK 4.0.3 本文的插图和文本虽然是Android2.2的 步骤都是一样的,如果安装的过程中遇到什么问题,可以留言,我会尽快回复! ...

随机推荐

  1. 【Todo】Tomcat与Jetty的比较 以及Tomcat架构的学习

    主要参考这篇文章: http://blog.csdn.net/qing_2012/article/details/8276789 然后Tomcat原理的介绍,可以看这篇文章: http://www.i ...

  2. python3 查看已安装的模块

    一.命令行下使用pydoc命令 在命令行下运行$ pydoc modules即可查看 二.在python交互解释器中使用help()查看 在交互式解释器中输入>>> help(&qu ...

  3. 【Python】输出程序运行的百分比

    对于一些大型的Python程序.我们须要在命令行输出其百分比,显得更加友好,以免被人误会程序陷入死循环.假死的窗口. 关键是利用到不换行的输出符\r,\r的输出.将直接覆盖掉此行的内容. 比方例如以下 ...

  4. 直接返回list不封装的结果集

    直接返回list不封装的结果集,在Jsp访问方式: 1.封装成map访问 2.用jstl: <c:forEach var="images" items="${lis ...

  5. POJ2376 Cleaning Shifts 【贪心】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11542   Accepted: 3004 ...

  6. CSS3中的动画效果-------Day72

    还记得么,在前面也曾实现过"仅仅用css让div动起来",还记得当时是怎么实现的么,是的,transition,针对的也比較局限,仅仅有旋转角度啊,长宽啊之类的,所以说,与其说是动 ...

  7. JavaScript闭包其一:闭包概论 函数式编程中一些基本定义

    http://www.nowamagic.net/librarys/veda/detail/1707前面介绍了作用域链和变量对象,现在再讲闭包就容易理解了.闭包其实大家都已经谈烂了.尽管如此,这里还是 ...

  8. 利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model

    利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model   使用场景:网站配置项目,为了便于管理,网站有几个Model类来管理配置文件, 比如ConfigWebsiteMo ...

  9. kubernetes里的各种port解惑

    系列目录 在编排kubernetes时,Deployment的Pod项有containerPort,Service文件里的port,targetPort, nodePort,这些pod概念有些时候可能 ...

  10. Spring源码学习(一)资源加载

    这里先从最简单的一个Spring例子开始. 下面是Spring的context的配置 <?xml version="1.0" encoding="UTF-8&quo ...