Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分

Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分

2014-01-23 13:14 10937人阅读 评论(16) 收藏 举报

分类:

Android(22)

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

本文参考了谷歌开发者文档:http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#provisional

如果开发的应用用户较多,那么必须保证应用在多个版本不同的设备上能够正确的运行。这就要求对各个版本比较熟悉,知道在什么版本中加入了什么新的功能或特性。但是Android的版本太多了,是个令人头疼的问题。如果想了解Android的版本差异,建议读一下Android开发者文档上相关的章节。

为了让你的应用程序指定可以运行的版本,Android的manifest文件中提供了<uses-sdk>标签。该标签中有三个属性,分别是minSdkVersion,targetSdkVersion,maxSdkVersion。这三个属性比较容易让人迷惑,我也是仔细读了谷歌的官方文档,才弄清楚这三个属性的意义。此外,在项目构建时,还有个概念叫build target,在本文中也会进行分析。

什么是API level

其实标签<uses-sdk>中指定的并不是我们使用的sdk的版本,也不是Android系统的版本,而是我们使用的Android平台的版本,即API level。API level是一个整数,它指的是我们使用的框架(Framework)的版本,也就是我们使用的sdk中的各个平台下的android.jar。但是这个API level又和Android系统的版本有着对应关系,并且每个系统都会在内部记录它所使用的API level。举例来说,我使用的手机系统是Android 2.3.3, 那么它就会在内部记录使用的API level为10。这个内部的API level可以让系统判定能不能安装一款app,这个问题会在下文中提及。

下面给出android系统版本,API level和版本代号之间的对应关系表。(该表来自谷歌官方文档:http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#provisional)

由上表可以看出,android的系统版本和API level之间并不是一一对应的,比如Android 2.3, Android 2.3.1, Android 2.3.2对应API level 9, 而Android 2.3.3, Android 2.3.4对应API level 10。API level是Android向开发者提供的一套Framework(android.jar)的代号,可能发布了新的系统版本,但是这一套接口并没有变化,所以就不必提供新的Framework开发包,所以API level也不必改变。由此可知Android系统版本和API level是多对一的关系。由于API level就是发布的android.jar(一套接口)的代号,所以API level和sdk中platforms目录中的各个android.jar是一一对应的。说白了,Android系统版本是给Android用户看的,而API level是给应用程序开发者看的。

什么是build target

build target并不存在于manifest文件中,而是存在于项目根目录中的project.properties文件中。如果使用Eclipse构建项目的话,那么每个项目的根目录下都会有一个project.properties文件,这个文件中的内容用于告诉构建系统,怎样构建这个项目。打开这个文件,除了注释之外,还有以下一行:

target=android-18

这句话就是指明build target,也就是根据哪个android平台构架这个项目。指明build target为android-18,就是使用sdk中platforms目录下android-18目录中的android.jar这个jar包编译项目。同样,这个android.jar会被加入到本项目的build path中。如下图:

每当修改了build target,就会将另一个android.jar加入到build path中替换原来的jar。将build target改成android-17后的效果如下图:

如果将build target 改成android-8,那么就会使用sdk中android-8下的android.jar编译项目,如果在Activity中调用ActionBar相关的Api,那么就会报错,因为ActionBar相关的Api是在API level 11中才加进来的。

一般情况下,应该使用最新的API level作为build target。这也是eclipse生成项目时的默认行为。

android:minSdkVersion

指明应用程序运行所需的最小API level。如果不指明的话,默认是1。也就是说该应用兼容所有的android版本。我们应该总是声明这个属性。

如果系统的API level低于android:minSdkVersion设定的值,那么android系统会阻止用户安装这个应用。下载将android:minSdkVersion设置为11, 并且将该应用安装在android 2.3的手机上(对应API level 9),在安装时会有如下提示:


提示手机API level的版本太低,安装失败。

如果指明了这个属性,并且在项目中使用了高于这个API level的API, 那么会在编译时报错。将build target设为最新的android-19,那么就会使用最新的android-19下的android.jar来编译项目。将minSdkVersion设置为8。在使用的android.jar中,肯定会有和ActionBar相关的API, 但是在项目中调用ActionBar API, 项目会报错。因为minSdkVersion指明的API level 8中不存在ActionBar相关的API。

调用Activity.getActionBar()和ActionBar.getHeight()方法需要API level 11, 但是指定的minSdkVersion为8,所以报错。由此可见,minSdkVersion不仅在程序安装时起作用,也会在项目构建时起作用。

如果没有设置minSdkVersion这个属性,那么默认是1。表明程序兼容所有的Android系统,能够在所有Android系统上运行。如果使用了高于API level 1 的API, 如ActionBar。那么在构建项目时,会提示和上面相同的错误,项目构建失败。

android:targetSdkVersion

标明应用程序目标API Level的一个整数。如果不设置,默认值和minSdkVersion相同。

这个属性通知系统,你已经针对这个指定的目标版本测试过你的程序,系统不必再使用兼容模式来让你的应用程序向前兼容这个目标版本。应用程序仍然能在低于targetSdkVersion的系统上运行。

由于Android不断向着更新的版本进化,一些行为甚至是外观可能会改变。然而,如果平台的API Level高于你的应用程序中的targetSdkVersion属性指定的值,系统会开启兼容行为来确保你的应用程序继续以期望的形式来运行。你可以通过指定targetSdkVersion来匹配运行程序的平台的 API level来禁用这种兼容性行为。举例来说,设置这个值为11或更高,当你的应用运行在Android3.0或更高的系统上时,系统会为你的应用使用新的默认主题(Holo主题),并且当运行在大屏幕的设备上时会禁用屏幕兼容模式(screen compatibility mode),因为支持了 API level 11就暗示了支持大屏幕。

根据你设置的targetSdkVersion 的值,系统会执行很多兼容行为。一些行为在对应平台版本的Build.VERSION_CODES中有讨论。
为了让你的应用程序支持每个Android版本,你应当提高targetSdkVersion的值到最新的API level,然后在对应的平台上彻底的测试你的应用。

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

一般情况下,应该将这个属性的值设置为最新的API level 值,这样的话可以利用新版本系统上的新特性。eclipse在生成项目时,默认将该值设置为最高,如果设置一个较低的值,会给出一个警告,如下图所示。

这个警告的意思是没有将targetSdkVersion的值设置为最高值,较新的系统会以兼容模式运行该程序。请考虑在新版本系统上测试程序并将targetSdkVersion设置为最新。更详细的信息请参考android.os.Build.VERSION_CODES 。

android:maxSdkVersion

标明可以运行你的应用的最高API Level版本。
在Android1.5, 1.6, 2.0 和2.0.1,在安装应用或系统升级时,系统会检查这个值。在这两种情况下,如果应用设置的maxSdkVersion 值低于系统本身使用的API Level,系统将不会允许安装该应用。在系统升级后,新系统会重新校验这个值,如果新系统的API Level高于这个值,新系统会删除你的应用。
在高于2.0.1的系统上,安装应用时不会再检验应用中设置的maxSdkVersion值,在系统升级后也不会重新校验这个值。但是在向用户展示可用的应用时,Google Play会继续使用这个属性进行过滤。

maxSdkVersion这个属性本来是在程序安装时和系统升级后起作用的。但是根据官方文档中的说明, 已经不再推荐使用这个属性。

经过测试,将maxSdkVersion的值设置成9,程序是可以安装在4.2的手机上的。说明这个值已经不再起作用。

[html] view plaincopy

  1. <uses-sdk
  2. droid:minSdkVersion="8"
  3. android:targetSdkVersion="19"
  4. android:maxSdkVersion="9"/>

时间: 2024-10-21 08:56:07

Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分的相关文章

Android中与ViewRoot相关的一些概念

1.View和ViewRoot ViewRoot从名称上来理解似乎是"View树的根",这很容易让人产生误解.因为ViewRoot并不属于View树的一份子.从源码实现上来看,ViewRoot和View对象并没有任何"血缘"关系,它既非View的子类,也非View的父类.ViewRoot可以被理解为"View树的管理者"--它有一个mView成员变量,指向的是它所管理的View树的根. 咱们看下下面的布局代码: <pre name=&quo

Android &lt;uses-sdk&gt; 和 target 分析

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

Android中显示和隐式Intent的使用

显示启动activity                                                                                                                   这个很简单,下面是代码示例:为了看着方便,所以就把layout直接截图了,里面的代码只是一些简单的布局.activity_login.xml: activity_main.xml: 下面是Manifest.xml中的代码 1 <?xml vers

Android中自定义视图View之---前奏篇

前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用到一些自定义的View以达到我们所需要的效果.其实网上的很多案例我们看完之后,发现这部分没什么难度的,我总结了两点: 1.准备纸和笔,计算坐标 2.在onDraw方法中开始画图,invalidate方法刷新,onTouchEvent方法监听触摸事件 对于绘图相关的知识,之前在弄JavaSE相关的知识的时候,

Android中自定义视图View之---Canvas和Path对象

介绍Android中的Paint和Canvas的概念和使用方法 Android中的Paint和Canvas的概念是很简单的,就是我们用画笔在画布上进行绘制没什么难度的,我们只要拿到画笔Paint和画布Canvas对象就可以进行操作了.当然Canvas对象提供了很多绘制图形的方法,下面来看一下代码吧: package com.example.drawpathdemo; import android.annotation.SuppressLint; import android.content.Co

minSdkVersion、maxSdkVersion、targetSdkVersion、target释义

minSdkVersion与maxSdkVersion比较容易理解,就是在安装程序的时候,如果目标设备的API版本小于minSdkVersion, 或者大于maxSdkVersion,程序将无法安装.一般来说没有必要设置maxSdkVersion. targetSdkVersion相对复杂一些,如果设置了此属性,那么在程序执行时,如果目标设备的API版本正好等于此数值, 他会告诉Android平台:此程序在此版本已经经过充分测,没有问题.不必为此程序开启兼容性检查判断的工作了. 也就是说,如果t

unity导出android遇到的build target 错误详解

1. 导出运行后显示build target ="9",version is wrong ,can't  loaded xxx.untiy3d files 之类的,一般情况看导出的jar包内的project.properties中target 是否正确,改正后而且要clean相关项目. 2.看AndroidManifest.xml下    android:minSdkVersion和android:targetSdkVersion 是否正确,改正后refresh 3.看报错信息是否提示

Android开发学习---template requires a minimum SDK version of at least 7,build target API version of 14

adt 22.6.3的bug 当adt更新到22.6.3,其编辑器中最低支持api7,即android 2.1,这里可能是google故意这么做的,也可能是其bug.其target sdk 和compile sdk最低都为14,即anroid 4.0,这里建议都设为最高的api 19,即android 4.4;否则会一直报错,类似错误如下: This template requires a minimum SDK version of at least 7, and the current mi

Android(java)学习笔记126:Android Studio中build.gradle简介

1.首先我们直接上代码介绍: // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { //这里可以看到是指明的jcenter(), 之前版本则是mavenCentral() // jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优. jcenter() } dep