AndroidManifest配置之uses-sdk
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的更多相关文章
- VS2015配置海康威视工业相机SDK二次开发
1.概述:工业相机SDK是用于控制相机的一个独立组件,支持获取实时图像数据.配置参数.对图像进行后续处理等功能.工业相机SDK兼容GigE Vision协议.USB3 Vision协议.Camera ...
- Mac Android开发环境变量的配置(java、sdk、ndk、gradle)
1.打开terminal 2.然后输入 vi .bash_profile 后按"e"进入编辑模式 3.输入想要配置的环境变量(Java.sdk.ndk.gradle): expor ...
- Android中配置JDK和SDK的环境变量
JDK环境变量的配置: 右击"计算机"或"我的电脑",选择"属性"-->"高级"或"高级系统设置&quo ...
- 配置ESP8266 NONOS SDK时由于工具链版本差异引发的故障
前几天部署ESP8266_NONOS_SDK时遇到了一个看似奇怪的问题,描述如下: examples例程可以通过编译,但烧写到ESP8266模块后,程序无法正常运行,编译和烧写的相关配置均无误.在bo ...
- windows下JDK环境配置与Android SDK环境配置
一.JDK环境配置1.配置变量名:JAVA_HOME变量值:jdk安装的绝对路径. 变量名:Path(在系统变量中找到并选中Path点击下面的编辑按钮,不要删除原本变量值中的任何一个字母,在这个变量值 ...
- Android开发配置,消除SDK更新时的“https://dl-ssl.google.com refused”异常
消除SDK更新时的“https://dl-ssl.google.com refused”错误 消除SDK更新时,有可能会出现这样的错误:Download interrupted: hostname i ...
- cordova 配置 高德地图sdk定位
获取 sha1 打开 cmd 1. cd .android 2. keytool -list -v -keystore debug.keystore 3. 输入密钥: android 4. 复制 sh ...
- AndroidManifest 配置主活动
在activity标签中写如下代码: <activity android:name=".MainActivity" android:label="This is M ...
- Android SDK 4.0.3 开发环境配置及运行
最近又装了一次最新版本的ADK环境 目前最新版是Android SDK 4.0.3 本文的插图和文本虽然是Android2.2的 步骤都是一样的,如果安装的过程中遇到什么问题,可以留言,我会尽快回复! ...
随机推荐
- webpack 学习笔记 03 Code Splitting
Introduction 对于较大的web 应用来说,将所有的代码文件压缩成一个文件是不合适的,在部分代码文件只有特殊情况下才被需要的情况下,这无疑是一种浪费.webpack 提供了讲代码文件分块的能 ...
- openfire Android学习(五)------连接断开重连
首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionCl ...
- Android动画中Interpolator 详解和演示
遇到一个项目需求,想让动画变得更活泼一点,于是想到了动画属性中的Interpolator,写了基本例子测试一下Android提供给我们现成的加速器的效果: 效果 代码中方法 xml中属性 越来越快 A ...
- EasyMvc入门教程-基本控件说明(9)引言导航
休息片刻后,继续开工... 这次我们继续学习引言导航,引言导航主要用于知识点的开始,起到知识点导航的作用.直接例子: 实现代码如下: @Html.Q().BlockRef().Title(" ...
- 这一篇里面有很多关于scala的list的操作的好的知识
https://www.cnblogs.com/weilunhui/p/5658860.html 1.++[B] 在A元素后面追加B元素 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- Java Unsafe类
参考了这篇文章:http://blog.csdn.net/aesop_wubo/article/details/7537278 <JAVA并发编程学习笔记之Unsafe类> Unsafe开 ...
- 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)
随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...
- vue2.0 自定义过滤器
2.0中已经废弃了过滤器,需要我们自定义 <div id="app"> {{message|uppercase}} </div> //过滤器 Vue.fil ...
- C++错误——”无法启动程序”…\xxx.exe” 系统找不到指定的文件”
背景 在VS2010环境下,升级了一个用C++编写的程序,编译生成成功,但是,不能在VS中直接运行(可以通过打开debug文件目录的exe应用程序运行),提示以下错误:”无法启动程序”…\xxx.ex ...
- 【转载】读懂IL代码就这么简单(三)完结篇
一 前言 写了两篇关于IL指令相关的文章,分别把值类型与引用类型在 堆与栈上的操作区别详细的写了一遍这第三篇也是最后一篇,之所以到第三篇就结束了,是因为以我现在的层次,能理解到的都写完了,而且个人认为 ...