1. 概要

<uses-sdk> 用来描述该应用程序可以运行的最小和最大API级别,以及应用程序开发者设计期望运行的平台版本。通过在manifest清单文件中添加该属性,我们可以更好的控制应用在不同android 系统版本上的安装和兼容性体验问题。

                                                                                  

(图 1)

如上图所示,<uses-sdk>通过minSdkVersion,targetSdkVersion,maxSdkVersion三个属性对应用安装兼容性方面进行控制。下面我们依次对这三个属性进行详细介绍。

 

2. minSdkVersion

 

该属性的作用主要体现在两个阶段,一个是在应用安装时,一个是在项目构建时。

2.1. 安装时作用

               当安装应用的手机系统API level 小于 minSdkVersion的值时,将不能安装该应用。

minSdkVersion 用于指明应用程序运行所需的最小API level。如果不指明该属性,其默认值为1。如上图1中minSdkVersion =“8”,说明该应用在只能安装在大于等于android系统API level 为8(android2.2)的系统上。如果将该应用安装在API level 小于8的android系统上,系统会提示手机API level的版本太低,安装失败。

所以这里有一点需要引起我们注意,我们在开发时必须留意我们用到API 接口的版本。在定义minSdkVersion属性时,尽量要让minSdkVersion的值大于等于我们用到的API 接口的开始被支持的最低版本。这样可以让不支持该接口的android系统不能安装我们的应用,防止应用在一些手机上因兼容性问题而崩溃。

2.2.构建项目时作用

在程序中如果我们用到了高于minSdkVersion的值的API接口,Eclipse会自动报错提醒开发者。这里我们以getActionBar()这个接口为例,这个接口是在android 3.0(API leve 11)中出现的。我们通过设置minSdkVersion的值来查看程序中开发工具(Eclipse)对程序的检测。

  • 如下图minSdkVersion = 8时,我们调用API level 为13的接口时Eclipse会自动报错提示开发者:
 
 
 
 

这里我们可以通过Eclipse 的修复提示选择Add@SuppressLIne “NewApi” 来对付编译错误,但是并不建议这样解决问题。这样虽然躲过了编译报错,能成功编译出apk文件,但是如果在低于android 3.0(API leve 13)系统的手机上安装该应用后运行可能就会出现程序崩溃现象(高于android 3.0(API leve 13)系统的手机上安装运行正常)。对于一个app来说与其在手机上出现崩溃,不如不让用户安装这个应用(个人观点),当然这里需要综合考虑新api的调用频率和场景进行综合判段。

这里采用Eclipse 的@SuppressLint(“NewApi”)方法防止报错提示。

 

在android 2.3(API level 9)系统上安装后运行时,应用出现崩溃现象。

  • 这时我们可以考虑能用修改minSdkVersion的值来解决该问题,我们将minSdkVersion的值设置为11。
 
 
 
 

一切正常没有报错。这时在android系统版本小于android 3.0(API level 11) 时安装该应用时将不能安装;在android系统3.0以上正常安装运行。

2.3. 总结

从上面两点中我们已经看到了minSdkVersion的重要性。minSdkVersion不仅在程序安装时起作用,也会在项目构建时起作用。我们应该充分利用它的这两个作用,谨慎的设置其值,保证应用不会因为接口兼容问题在一些手机上运行时崩溃影响用户体验。

3. maxSdkVersion

标明可以运行你的应用的最高API Level版本。现在Google官方文档中已经建议不推荐使用这个属性了。

在android 1.5,1.6,2.0和2. 0. 1系统上安装应用或系统升级时,系统会检查这个值。在这两种情况下,如果应用设置的maxSdkVersion 值低于系统本身使用的API Level,系统将不会允许安装该应用;在系统升级后,新系统会重新校验这个值,如果新系统的API Level高于这个值,新系统会删除你的应用。在android 2. 0. 1(API level 6)系统后该属性作用已经失效,也建议不在使用该属性。

例如:

在android 2.3(API level  9)上安装该应用时,从下图可以看出maxSdkVersion 已经没有效果了,当系统API level大于maxSdkVersion也照样能安装该应用。

新版本系统基本上是完全兼容以前的老版本的,没有必要设置这个属性去阻止你的应用在新版本上安装;另外,如果你指定了这个属性,用户手机系统升级可能会删掉你的应用。所以这个属性完全没有必要设置的了,这可能也是Google推荐不再使用的原因吧。

4. targetSdkVersion

这个属性会告诉系统该应用已经在API level 为targetSdkVersion值的系统上进行了充分测试,如果系统的API level 和当前应用的targetSdkVersion一样,系统将不会启用兼容模式运行该应用,如果不设置其默认值将等于minSdkVersion的值。

如果平台的API Level高于你的应用程序中的targetSdkVersion属性指定的值,系统会开启兼容行为来确保你的应用程序继续你期望的形式来运行。例如,设置这个targetSdkVersion值为11或更高,当你的应用运行在Android3.0或更高的系统上时,系统会自动为你的应用使用新的默认主题(Holo主题),并且当运行在大屏幕的设备上时会禁用屏幕兼容模式(screen compatibility mode),因为支持了 API level11就暗示了支持大屏幕。一般情况下,应该将这个属性的值设置为最新的API level 值,这样的话就可以充分利用新版本系统上的新特性。Eclipse在生成项目时,默认将该值设置为最高。

Android版本更新时添加新特性详见:

http://developer.android.com/reference/android/os/Build.VERSION_CODES.html

如果平台的API Level低于你的应用程序中的targetSdkVersion属性指定的值时, 系统会开启兼容行为来确保你的应用程序能正常运行,这时一些在targetSdkVersion上的特性就没有了。但是,这个设置仅仅是一个声明、一个通知,在低版本系统中运行不会有太实质的作用。比如:使用了targetSdkVersion这个SDK版本中的一个特性,但是这个特性在低版本中是不支持的,那么在低版本的API设备上运行程序时,可能会报错:java.lang.VerifyError。也就是说,此属性不会帮你解决兼容性的测试问题。你至少需要在minSdkVersion这个版本上将程序完整的跑一遍来确定兼容性是没有问题的。

从上面的论述可知,targetSdkVersion这个属性是在程序运行时期起作用的,系统根据这个属性决定要不要以兼容模式运行这个程序。

5. target

Android工程中还有个target属性,这个属性位于Android工程根目录下project.properties中,从名字来看很容易将其功能和targetSdkVersion混淆。

                    

其实他们的功能大相径庭:

  • targetSdkVersion这个上面已经做过分析,在程序运行时起作用,系统根据这个属性决定要不要以兼容模式运行这个程序。
  • project.properties中的target是指在编译的时候使用哪个版本的API进行编译。它和工程下导入的api包的API Level保持一致的。如果你更改target的值,上面的api包会跟着变化,你更改api包时target的值也会变化。

Android中<uses-sdk>属性和target属性分析的更多相关文章

  1. html中的a标签的target属性的四个值的区别?

    target属性规定了在何处打开超链接的文档. 如果在一个 <a> 标签内包含一个 target 属性,浏览器将会载入和显示用这个标签的 href 属性命名的.名称与这个目标吻合的框架或者 ...

  2. Android中使用Handler造成内存泄露的分析和解决

    什么是内存泄露?Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用所指向 ...

  3. Android中TextView和EditView经常使用属性设置

    Android开发中最经常使用的几乎相同就是TextView和EditView了,在使用它时.我们也会设置它的一些属性,为了让我们设计的更好看,设置的更合理.这里记下它的经常使用属性,方便后期查阅. ...

  4. 9.png(9位图)在android中作为background使用导致居中属性不起作用的解决方法

    在使用到9.png的布局上面添加 android:padding="0dip" 比如 <LinearLayout            android:layout_widt ...

  5. Android 中 吐司显示不出来的原因分析

    当你发现你的toast的show方法的确被执行了,但是却没有在界面中显示出来, 有问题的地方可能有两点: 1.Context上下文对象有问题,不是当前的上下文对象或者什么的: 2.message(即T ...

  6. android中导入低版本project可能会遇到的编译问题(转自: Victor@Beijing)

    使用高版本的SDK后再导入以前用低版本的project时,会遇到一些兼容性的问题. (1)Unable to resolve target 'android-5' 因为本机中现在使用的是2.2的SDK ...

  7. android中的EditView控件

    android中的EditView控件 EditText继承关系:View-->TextView-->EditText ,EditText是可编辑文本框 1.EditText默认情况下,光 ...

  8. android 中targetSdkVersion和与target属性的区别

    AndroidMenifest.xml中targetSdkVersion和project.properties中的target属性的区别      在AndroidMenifest.xml中,常常会有 ...

  9. Android中@id与@+id区别和sharedUserId属性详解

    Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@后 ...

随机推荐

  1. 【转载】Redis在新浪微博中的应用

    转载自文章 http://blog.me115.com/2013/12/19/redis-e5-9c-a8-e6-96-b0-e6-b5-aa-e5-be-ae-e5-8d-9a-e4-b8-ad-e ...

  2. 会话追踪(session tracking)

    HTTP是一种无连接的协议,如果一个客户端只是单纯地请求一个文件(HTML或GIF),服务器端可以响应给客户端,并不需要知道一连串的请求是否来自于相同的客户端,而且也不需要担心客户端是否处在连接状态. ...

  3. GPGPU OpenCL Reduction操作与group同步

    Reduction操作:规约操作就是由多个数生成一个数,如求最大值.最小值.向量点积.求和等操作,都属于这一类操作. 有大量数据的情况下,使用GPU进行任务并行与数据并行,可以收到可好的效果. gro ...

  4. 数值格式化 NumberFormat DecimalFormat RoundingMode

    NumberFormat [简介] java.text.NumberFormat extends java.text.Format extends java.lang.Object 实现的接口:Ser ...

  5. iOS公布app到App Store教程

    要公布首先须要公布证书,其获取和安装的基本流程和真机调试证书一致,关于真机调试证书的获取和使用能够參考这篇文章.只是如今Xcode7不须要真机调试证书也可实现真机调试了.能够參考这篇文章. 要获取证书 ...

  6. Hibernate之一对一关联映射

    Hibernate中一对一关联映射共分为两种,一种是一对一主键关联映射,另一种是一对一唯一外键关联映射.下面简单介绍一下这两种关联映射. 一对一主键关联映射 一对一主键关联映射的两个实体有相同的ID. ...

  7. 基于java语言的给cube添加custom view来实现权限控制

    今天是农历2014年的最后一个工作日了,在这里提前祝大家新年快乐.羊年大吉!当然本人今天也拿出来点儿真东西,做为献给大家的新年礼物,依次共勉. 下文主要讲述的是使用Java代码来完成对cube基于部门 ...

  8. [88221008]调用新下单接口失败,result:162020004,resInfo

    [88221008]调用新下单接口失败,result:162020004,resInfo

  9. [Big Data] Week 5 A (Advance)

    Question 1 Consider the diagonal matrix M = 1 0 0 0 2 0 0 0 0 . Compute its Moore-Penrose pseudoinve ...

  10. 一致性哈希算法(Consistent Hashing) .

    应用场景 这里我先描述一个极其简单的业务场景:用4台Cache服务器缓存所有Object. 那么我将如何把一个Object映射至对应的Cache服务器呢?最简单的方法设置缓存规则:object.has ...