Android的minSdkVersion,targetSdkVersion,maxSdkVersion

Android的minSdkVersion,targetSdkVersion,maxSdkVersion - edisonlg的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/edisonlg/article/details/7855898

API Level 是一个整型值,表示Android发布的某个特定版本,新API Level相对于老API Level会增加以下内容:
* 新增类、或者已有类中新增、修改、甚至删除的API
* 新定义的xml tag
* 新定义Intent
* 新定义的Permission
* 其它…

API Level和版本有如下对应关系:
Platform Version API Level
Android 3.0 11
Android 2.3.3 10
Android 2.3 9
Android 2.2 8
Android 2.1 7
Android 2.0.1 6
Android 2.0 5
Android 1.6 4
Android 1.5 3
Android 1.1 2
Android 1.0 1

先说一下minSdkVersion的用处:
新版本中public了老版本没有的接口,如果我写的一个App中用到了只有新版本才有的接口,肯定不能让它跑在老版本SDK上,不然会报错。 Android是如何保证这一点的?靠定义minSdkVersion来实现。 比如,如果我定义了<uses-sdk android:minSdkVersion="8"  ... />, 编译生成的apk是无法安装到Android 2.1(API Level 7)系统上的,系统会提示: ERROR: Application requires API version 8. Device API version is 7。

AndroidManifest.xml中如果不写,缺省 minSdkVersion = 1, 表示程序至少能安装到,并且作者也希望它能跑到Android 1.0上。

接下来说一下targetSdkVersion的用处:
一般而言,新版本要兼容老版本,这就是为什么Android中很多接口即使过时了(deprecated)但还依然保留在新SDK中,所以绝大多数情况下,为老版本开发的应用可以运行在新版SDK上。但是也有一些例外,主要是以下三类问题:

1. 老接口被删除或修改了(这种case有,但很少),本文不关注
2. 同样的接口,但新老版本的实现有所不同。比如有一些API早期设计时考虑不周全,新版本做了改进。
3. 即使不涉及任何接口调用,但由于物理设备的扩展,同样的apk需要在新版本上需要适配更多的物理设备,从而具备了新的特性

对于第二类问题,指定targetSdkVersion为具体的某个API Level,则表示调用接口时只会调用该版本实现的API,而不是早期版本的API。
对于第三类问题,就是这封信碰到情况,Google从开发Android 1.6 (API Level 4)开始意识到,程序运行时需要考虑到手机屏幕大小、分辨率不同。因此从1.6开始引入了针对多屏幕的支持,定义了不同屏幕尺寸与分辨率、密度的一个对应关系。注意到此前google只意识到会在中密度屏幕(mdpi)下开发,所以1.5以及以前版本的图片图标等资源、布局都是按照中密度屏幕设计的。

从Android 1.6开始,Google提供了多套资源(ldpi, mdpi, hdpi) 支持,对内置应用以及Framework的资源(比如控件),系统可以在编译时刻决定只打包某个特定密度的资源(定义在PRODUCT_LOCALES中,对N1,应该是PRODUCT_LOCALES := hdpi ...)。

对基于SDK开发的应用,eclipse缺省会打包所有密度的资源,在Android 1.6之后的版本上跑,会在运行时刻根据物理设备实际密度来选择对应密度的资源。

如果某个App中定义的targetSdkVersion <= 3, , 表示该App无法用到Android 1.6才有的多屏幕支持能力, 所以即使应用本身包含了hdpi,mdpi,ldpi资源,但运行到hdpi的物理设备上时只会去加载mdpi的资源,当然显示就不正常了。
注意:如果App中也用到的系统级资源(比如控件),一般来说特定的物理设备只可能是hdpi,mdpi, ldpi (以后会有扩展,比如xdpi)中的一种,所以只会加载那唯一的一种dpi资源,因此显示系统控件本来不应该有任何问题。不过,如果Image没有优化,而是包含了所有资源,那么控件显示也会不正常 。

再回到正题上来,为什么eclipse下编译的程序运行起来和ubuntu下编译的显示效果不同?

在ubuntu下编译,系统认为你编译的是内置应用,内置应用在正常情况下不会被变态的人扒出来放到其他设备上去,所以不存在安装兼容性问题,minSdkVersion缺省就是当前物理设备的current sdk version。另外既然是内置应用,当然运行在当前物理设备上效果最好,所以targetSdkVersion缺省也是当前物理设备的current sdk version。这个在编译时刻打包apk时,build system首先检测这两个值有没有设置,没设置的话它会替你加上。

在eclipse下编译,系统认为你编译的是第三方应用,忘了写就是你的错了,minSdkVersion和targetSdkVersion缺省都是1,所以会出现上面说到的悲剧。

结论:
1. 对内置应用,不要自己去设置minSdkVersion和targetSdkVersion;
2. 基于SDK开发的,根据自己的实际情况,一定要设置minSdkVersion和targetSdkVersion;
3. 刚刚没说maxSdkVersion,我们别定义它,以后可能会OTA升级整个Android系统,定义了它对我们是个悲剧

时间: 2024-10-27 11:41:46

Android的minSdkVersion,targetSdkVersion,maxSdkVersion的相关文章

minSdkVersion、maxSdkVersion、targetSdkVersion、target释义

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

Android -- uses-sdk:minSdkVersion 10 cannot be smaller than version L declared in library com.android.support:appcompat-v7:21.0.0-rc1

这是一个报错,是我在Android Studio上添加完Support-v4和v7包之后爆出的错误,百度了好久也没有百度到.当时我的项目有minSdkVersion 19. 设置版本最小为L的时候也会出错,并且我的测试机是4.3,根本就无法安装. defaultConfig { .... minSdkVersion 'L' .... } 解决办法 1.将compileSdkVersion设置成为 compileSdkVersion 'android-L' 这个解决方案只适用于L版本,如果尝试部署

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

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

Windows环境下Android Studio系列8—SDK版本配置

1. 问题的由来 在一次调试问题中,出现下面错误信息: 09-07 09:15:08.000    1342-1342/? W/System.err﹕ android.os.NetworkOnMainThreadException 09-07 09:15:08.000    1342-1342/? W/System.err﹕ at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 09-07

minSdkVersion、targetSdkVersion、maxSdkVersion、target API level四个数值到底有什么区别

在AndroidMenifest.xml中,常常会有下面的语句: <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="10" android:maxSdkVersion="10" /> 在default.properties中,会看到下面的语句: target=android-10 如果是使用Eclipse的话,还可能会看到这样的警告:Attribute minS

Android之 compileSdkVersion, minSdkVersion, and targetSdkVersion

在一年之中,也有可能只是几个月后,你会发布你的Android应用程序.但是这中间有可能会发布新的版本的Android系统,比如:6.0+. 你肯定希望你的应用可以向前兼容,当用户升级到新的Android系统时候,你的应用调用的系统API不会编译失败,也不会Crashing. 这时候就要考虑一下三个参数了:compileSdkVersion, minSdkVersion, and targetSdkVersion (它们标识什么版本的API可以使用,应用兼容的版本,编译需要的API版本) comp

minSdkVersion、targetSdkVersion、targetApiLevel的区别

在AndroidMenifest.xml中,常常会有下面的语句: <uses-sdk android:minSdkVersion="4"           android:targetSdkVersion="10"          android:maxSdkVersion="10" /> 在default.properties中,会看到下面的语句:target=android-10 如果是使用Eclipse的话,还可能会看到这样

AndroidMenifest.xml中minSdkVersion、targetSdkVersion、targetApiLevel的区别

原文: AndroidMenifest.xml中minSdkVersion.targetSdkVersion.targetApiLevel的区别 - Delion - 博客频道 - CSDN.NEThttp://blog.csdn.net/yangdeli888/article/details/22722303 在default.properties中的target是指在编译的时候使用哪个版本的API进行编译. 综上,上面的四个值其实是作用于不同的时期:target API level是在编译的

uses-sdk:minSdkVersion 1 cannot be smaller than version 4 declared in library [com.android.support:sup

根据报错提示:最低兼容版本api 1低于v7兼容类库的api 7,找到app的gradle发现设置了最低兼容9,并不是1啊. android { ... defaultConfig { minSdkVersion 10 targetSdkVersion 19 } ... } 完美搞定 perfect