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. Linux下Shell的快捷键(转)

    下述所有命令在Linux/Unix的shell下有效,这里以bash为主.如有出入,以你自己的服务器为准.本文所指的Linux主要指RHEL/CentOS,Unix指的是FreeBSD,这也是Unix ...

  2. Android图片加载神器之Fresco,基于各种使用场景的讲解

    Fresco是Facebook开源Android平台上一个强大的图片加载库,也是迄今为止Android平台上最强大的图片加载库. 优点:相对于其他开源的第三方图片加载库,Fresco拥有更好的内存管理 ...

  3. sql语句 MySQL

    1.操作数据库 (1)创建数据库 CREATE  DATABASE  [IF NOT EXISTS] db_name [create_specification [, create_specifica ...

  4. 深入struts2.0(七)--ActionInvocation接口以及3DefaultActionInvocation类

    1.1.1       ActionInvocation类 ActionInvocation定义为一个接口.主要作用是表现action的运行状态.它拥有拦截器和action的实例.通过重复的运行inv ...

  5. 在没有安装access的电脑上读写.mdb文件

    在微软官方下载MDAC access数据库访问组件即可

  6. Process Autocad by python

    一.处理AutoCad模块 -pyautocad 1.安装 pip install pyautocad 注:1.该操作会自动安装 comtypes模块,如果其他方式安装,请自行安装comtypes模块 ...

  7. C/C++,java开源数学计算库

    有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件系统的某一个很有限的功能,你是不是也要因此再用一用那动辄几个g的软 ...

  8. IntelliJ IDEA配置Tomcat及部署项目

    IntelliJ IDEA配置Tomcat及部署项目(原链接) 主要有以下几个要点 1.选择本地的tomcat容器. 2.可以选择修改访问路径. 3.On Update action 当我们按 Ctr ...

  9. inline-block的使用

    inline-block是什么 inline和block是css中元素display属性的两个选项,而inline-block可以说是介于两者之间的属性值. inline使元素成为内联元素(inlin ...

  10. java 多线程2(转载)

    http://www.cnblogs.com/DreamSea/archive/2012/01/11/JavaThread.html Ø线程的概述(Introduction) 线程是一个程序的多个执行 ...