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

如果开发的应用用户较多,那么必须保证应用在多个版本不同的设备上能够正确的运行。这就要求对各个版本比较熟悉,知道在什么版本中加入了什么新的功能或特性。但是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 
 在CODE上查看代码片派生到我的代码片
  1. <uses-sdk  
  2. droid:minSdkVersion="8"  
  3.     android:targetSdkVersion="19"   
  4.     android:maxSdkVersion="9"/>  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql交叉编译 cmake_CMake交叉编译配置

很多时候&#xff0c;我们在开发的时候是面对嵌入式平台&#xff0c;因此由于资源的限制需要用到相关的交叉编译。即在你host宿主机上要生成target目标机的程序。里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等&#xff0c;我今天仅仅简单介绍下相关CMake在面对…

[python opencv 计算机视觉零基础到实战] 一 opencv的helloworld

前置条件 说明&#xff1a;本系列opencv实战教程将从基础到实战&#xff0c;若只是简单学习完python也可以通过该教程完成一般的机器学习编程&#xff1b;文中将会对很多python的基础内容进行讲解&#xff0c;但由于文章定位的原因将不会赘述过多的基础内容&#xff0c;基础内…

Android之用setColorFilter在ImageView上面覆盖一层灰色的图层

1 问题 在图片上面覆盖一层灰色的图层 2 解决办法 比如点击图片覆盖黑色 imageView.setColorFilter(ContextCompat.getColor(context, R.color.picture_color_black_80), PorterDuff.Mode.SRC_ATOP); 然后点击图片还原回来 imageView.setColorFilter(ContextCompat.getCol…

【计算机图形学】实验:VB.net环境下的综合绘图与交互技术案例教程

一、实验目的 掌握在.net环境下的绘图软件界面设计与交互技术。 二、实验准备 学习在.net环境下的界面设计的一般原理与交互技术等基本知识。 三、实验内容 将前7个实验内容集成到一个界面下&#xff0c;如直线段、圆、矩形与曲线的绘制填充&#xff0c;以及对图像的处理&…

IE8 兼容background-size的解决办法

.bgpic { background-image:url(); background-size:cover; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src,sizingMethodscale); } 注意progid里面的src路径是绝对路径或是相对于页面的路径。​ div class"bgpic"style"width:200px;height:1…

从头开始敲代码之《从BaseApplication/Activity开始》

转载请注明出处王亟亟的大牛之路 其安易持&#xff0c;其未兆易谋&#xff1b;其脆易泮&#xff0c;其微易散。为之于未有&#xff0c;治之于未乱。合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于垒土&#xff1b;千里之行&#xff0c;始于足下。为者败之…

查缺补漏系统学习 EF Core 6 - 原始 SQL 查询

推荐关注「码侠江湖」加星标&#xff0c;时刻不忘江湖事这是 EF Core 系列的第五篇文章&#xff0c;上一篇文章盘点了 EF Core 中的几种数据查询方式。但是有有时候&#xff0c;我们可能无法用标准的 LINQ 方法完成查询任务。或者编译后的 LINQ 查询&#xff0c;没有我们想要的…

【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取

一、学习目标 了解图片的结构属性了解如何捕获视频了解waitkey的使用方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python opencv 计…

python冒泡排序代码完整_用Python写冒泡排序代码

python代码实现冒泡排序代码其实很简单&#xff0c;具体代码如下所示&#xff1a;代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 def bubbleSort(numbers):for j in xrange(len(numbers),-1,-1):for i in xra…

[C++]VS2005(VC8) 使用 Boost

測試環境&#xff1a;[1] Widnows XP Professional[2] Visual Studio 2005 Team Studio(VC8.0)[3] WinCvs 1.31. 下載 Boost透過 CVS 下載最新版 cvs -d:pserver:anonymousboost.cvs.sourceforge.net:/cvsroot/boost login [詢問密碼時&#xff0c;直接輸入 Enter 略過] cvs …

Android之编译提示error: Apostrophe not preceded by

1 问题 as编译提示错误如下 error: Apostrophe not preceded by 2 原因 字符串资源文件里面value包含一个单引号 <string name"key">Don t ....</string> 2 解决办法 1) 加双引号 <string name"key">"Don t ...."</s…

【ArcObject开发】实验:ArcGIS Desktop开发方式入门基础教程

一、实验目的: 熟练掌握ArcGIS Desktop开发方式。 二、实验准备: 学习ArcGIS Desktop定制步骤;熟悉VBA编程环境、Active DLL和Active EXE开发一般过程。 三、实验内容: (1)描述在ArcGIS Desktop环境下定制窗体界面的一般步骤;(2)在VBA环境下编写宏,实现图层视图…

C# WPF后台动态添加控件(经典)

概述在Winform中从后台添加控件相对比较容易&#xff0c;但是在WPF中&#xff0c;我们知道界面是通过XAML编写的&#xff0c;如何把后台写好的控件动态添加到前台呢&#xff1f;本节举例介绍这个问题。这里要用到UniformGrid布局&#xff0c;UniformGrid 是一种横向的网格分割、…

Android Button监听的方式

Android Button的几种监听方式 1、一个Button对应一个监听 1&#xff09;xml文件中绑定监听 <Buttonandroid:id"id/btn_test"android:layout_width"match_parent"android:layout_height"wrap_content"android:text"test listener"a…

hdu 5441 (并查集)

题意&#xff1a;给你n个点&#xff0c;m条边构成无向图。q个询问&#xff0c;每次一个值&#xff0c;求有多少条路&#xff0c;路中的边权都小于这个值 a->b 和 b->a算两种 思路&#xff1a;把权值从小到大排序&#xff0c;询问从小到大排序&#xff0c;如果相连则用并查…

【Envi风暴】Envi 5.4遥感影像镶嵌原来如此简单!

图像镶嵌指是在一定的数学基础控制下,把多景相邻的遥感图像拼接成一个大范围、无缝图像的过程。 Envi的图像镶嵌功能提供交互式的方式将没有地理坐标或者地理坐标的多幅图像合并,生成一幅单一的合成图像。镶嵌功能提供了透明处理、匀色、羽化等功能。 下面演示基于地理坐标(…

[python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑

一、学习目标 了解图片的通道与数组结构了解使用numpy创建一个图片了解使用numpy对图片的一般操作方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的hel…

java 常用类库_JAVA(三)JAVA常用类库/JAVA IO

成鹏致远 |lcw.cnblog.com|2014-02-01JAVA常用类库1.StringBufferStringBuffer是使用缓冲区的&#xff0c;本身也是操作字符串的&#xff0c;但是与String类不同&#xff0c;String类的内容一旦声明之后则不可改变&#xff0c;改变的只是其内存地址的指向&#xff0c;而StringB…

Error: package or namespace load failed for ‘rJava’:

https://stackoverflow.com/questions/30738974/rjava-load-error-in-rstudio-r-after-upgrading-to-osx-yosemite 安装好的“xlsx”不能正常加载 library("xlsx") 报错&#xff1a; 载入需要的程辑包&#xff1a;rJava Error: package or namespace load failed for…

Android之国际化部分文字生效而部分文字没有生效的坑

1 问题 Android国际化我们知道只要在res目录下面&#xff0c;创建不同国家的文件夹然后&#xff0c;把不同国家对于的语言以键值对的方式写进strings.xml文件就行&#xff0c;这是一个非常简单的操作&#xff0c;但是今天遇到了一个很奇葩的问题&#xff0c;在部分手机&#x…