Android学习——uses-sdk标签详解

时间:2022-12-29 20:56:20

1 前言

我们都知道,Android的版本在不断的迭代,并且每个版本都加入了不同的新特性。那么随着Android的用户量越来越多,Android的开发人员就必须熟悉Android各个版本的特性并且确保自己的应用能够正常运行在不同版本中。

由于Android的版本实在太多,开发人员的精力总是有限的,不可能一下子都能兼顾得到所有的版本,这个时候,我们就必须通过一种方式能够说明当前应用能够支持的最低Android版本、最高版本,同时系统能够自动获取到这些信息并且判断当前系统版本是否支持该应用,不支持的版本就不给予安装,避免用户安装后才发现不不支持带来的负体验。

当然,谷歌这个巨头肯定也考虑到了这方面的事情,所以就提供了<uses-sdk>标签,里面包含了minSdkVersion、targetSdkVersion、maxSdkVersion三个字段,本文会跟大家一起去学习了解。

示例代码:https://github.com/xiaoxuetu/gs-android/tree/master/gs-target-setting

官方文档:https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#provisional

⚠️ 注意

附上示例代码,大家可以下载下来,使用Android Studio导入学习实践

2 什么是API Level

在讲解<uses-sdk>标签之前,我们一起来了解下API Leval究竟是什么东西?

按照官方的说法是:API Level是一个整数,是安卓系统中所使用的框架版本的唯一标识。它并不是我们开发时所使用的SDK版本,也不是指Android的版本,但是它和我们所使用的Android的版本却存在一定的对应关系。如下表中的Android 2.3 和 2.3.1 所使用的API Level 是 9,而2.3.3 所使用的API Level是10。

下图是来自谷歌官方文档的Android系统版本和API Level的对应关系

Android学习——uses-sdk标签详解

3 <uses-sdk>标签说明

<uses-sdk> 标签是在AndroidMainfest.xml文件中使用的,它的用法是:

 <uses-sdk android:minSdkVersion="integer"
android:targetSdkVersion="integer"
android:maxSdkVersion="integer" />

此时需要注意的是:

过去我们使用Eclipse进行开发的时候,uses-sdk是需要我们直接在AndroidMainfest.xml进行声明的。

而如今我们使用的是Android Studio,同时我们是在app模块的build.gradle进行声明,在编译的时候将会自动生成到AndroidMainfest.xml中。大家可以直接打开gs-target-setting/app/build/intermediates/manifests/full/debug/AndroidMainfest.xml进行查看。

如果你直接在AndroidMainfest.xml声明了,那么编译的时候将会被忽略,同时会以build.gradle的为准重新生成覆盖原来的值。

好了,我们都知道uses-sdk标签里面总共包含了minSdkVersion、maxSdkVersion、targetSdkVersion三个属性,另外,当我们使用Android Studio后,我们创建的项目同时也是Gradle项目,里面会包含有compileSdkVersion和buildToolsVersion属性,接下来我们就一起来了解下这五个属性的作用和使用方式。

3.1 minSdkVersion

1> 作用一:指定应用运行时所需要的最小API Level

该属性主要用于指定该应用运行时所需要的最小API Level。如果我们不去特别指明的话,默认值为1,意思是该应用兼容所有的Android版本。

如果我们设置了应用运行时所需要的最小API Level,并且系统的API Level低于我们设置的minSdkVersion,那么Android系统将会拒绝该应用的安装。

下面我们将会举一个例子进行说明:

设备信息

品牌 红米Note3 双网通
Android系统版本 Android 5.0.2
API Level 21

将github中的示例代码clone下来后,使用Android Studio,修改build.gradle中的minSdkVersion的值为21以上,比如22.然后点击运行的时候,编译后的安装包将无法安装到设备上,并且会有类似下图的提示

Android学习——uses-sdk标签详解

2> 作用二:Lint将会对项目进行静态代码检测,当项目中使用的API高于minSdkVersion,将会进行警告,避免在低版本中调用了不存在的API导致应用产生Bug。

下面我们也举一个例子进行说明

例如我们设置了minSdkVersion为1,那么我们在项目中调用了ActionBar(ActionBar是属于API Level为11提供的新API),IDE将会利用Lint进行检测并且提示我们调用了API Level为11才能调用的API

Android学习——uses-sdk标签详解

3.2 targetSdkVersion

该属性用于指定该应用的目标API Level,也是一个整数。如果我们不进行设置,那么targetSdkVersion默认值将会和minSdkVersion的值一样。

这个属性的作用是用于通知系统该应用已经针对这个API Level的Android版本进行过测试,系统不必再使用兼容模式来让应用程序向前兼容这个目标版本。当然,应用依然能够在低于targetSdkVersion的系统上正常运行。

如果平台的API Level高于你的应用程序中的targetSdkVersion属性指定的值,系统会开启兼容行为来确保你的应用程序继续以期望的形式来运行。

根据我们设置的targetSdkVersion 的值,系统会执行很多兼容行为。具体的兼容行为在对应平台版本的Build.VERSION_CODES(传送门)中有讨论。

一般情况下应该将这个属性的值设置为最新的API level 值,这样我们才可以利用新版本系统上的新特性。

下面举个例子来进行说明:

如果我们将targetSdkVersion的值设置为11甚至更高,当你的应用运行在Android3.0或更高的系统上时,系统会为你的应用使用新的默认主题(Holo主题),并且当运行在大屏幕的设备上时会禁用屏幕兼容模式(screen compatibility mode),因为支持了 API level 11就意味着支持大屏幕。

3.3 maxSdkVersion

该属性主要用于指定可以运行我们的应用的最高API Level版本。

根据谷歌官方文档的说明,

在Android1.5, 1.6, 2.0 和2.0.1,在安装应用或系统升级时,系统会检查这个值。此时会存在两种情况:

1> 如果应用设置的maxSdkVersion 值低于系统本身使用的API Level,系统将不会允许安装该应用

2> 在系统升级后,新系统会重新校验这个值,如果新系统的API Level高于这个值,新系统会删除你的应用

在高于2.0.1的系统上,安装应用时不会再检验应用中设置的maxSdkVersion值,在系统升级后也不会重新校验这个值。此时会存在以下两种情况:

1> 在Google Play中,将会继续使用这个属性进行过滤,不会将该应用展现在API Level高于maxSdkVersion的系统的可安装应用列表中。

2> 即使我们的应用设置了maxSdkVersion为9(Android 2.3),在Android 4.2的设备上,我们依然可以安装该应用。

⚠️ 注意

根据官方文档中的说明, 已经不再推荐使用这个属性。

3.4 compileSdkVersion

这并不是<uses-sdk>标签的属性,而是在们创建的Android Gradle项目中,必需在build.gradle声明并且赋值的属性。

compileSdkVersion的作用是指定用于编译我们应用的API Level对应的Android SDK。如果我们的应用中使用了新添加的API,就必须要使用和新添加的API对应Level的Android SDK。

compileSdkVersion并不会改变应用运行时的行为。当我们修改compileSdkVersion的时候,Android Studio将会出现一些编译警告、编译错误提示,我们要注意关注并且进行相应的修正。

根据官方文档的说明,强烈推荐我们使用最新版本的SDK进行编译,为使用新的特性做好准备。

⚠️ 注意

在ecplise的项目中,compileSdkVersion对应的是projects.properties中的target属性

例如我们在projects.properties中设置target=android-19,,就是使用sdk中platforms目录下android-19目录中的android.jar这个jar包编译项目。

3.5 buildToolsVersion

这个和compileSdkVersion一样,并不是<uses-sdk>标签的属性,而是在们创建的Android Gradle项目中,必需在build.gradle声明并且赋值的属性。

buildToolsVersion的作用是指定用于应用构建的工具版本,例如我们所熟悉的aapt、dx等等。这些工具的一般位于以下目录:

${ANDROID_SDK_HOME}/build-tools/${buildToolsVersion}

其中 ${ANDROID_SDK_HOME}表示我们的SDK所在的路径,${buildToolsVersion}表示我们所配置的buildToolsVersion的值

这里需要注意的是,buildToolsVersion并没有强制的要求,我们既可以使用新版本的构建工具来构建我们的低版本应用,也可以使用旧版本的构建工具来构建我们的高版本应用。

下面举个例子进行说明:

1> compileSdkVersion为19,buildToolsVersion为21.1.2,意思是使用高版本的构建工具来构建低版本的应用

2> compileSdkVersion为21,buildToolsVersion为19.1.0,意思是使用低版本的构建工具来构建高版本的应用

⚠️ 注意

在ecplise的项目中,buildToolsVersion对应的是projects.properties中的sdk.buildtools属性。

例如我们可以在project.properties中设置sdk.buildtools=19.1.0。也可以不设置,不设置的话就是指定最新版本。

4 总结

通过上面了解每个属性的作用后,我们将会发现minSdkVersion、targetSdkVersion、compileSdkVersion三个属性的关系如下:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

理想状态下,minSdkVersion、targetSdkVersion、compileSdkVersion三个属性的关系如下:

minSdkVersion(越低越好) <= targetSdkVersion == compileSdkVersion(最新的API Level) 

此时的好处是

1> 用较低的 minSdkVersion 来覆盖最大的人群

2> 用最新的 SDK 设置 target 和 compile 来获得最好的外观和行为,更好的利用新特性

Android学习——uses-sdk标签详解的更多相关文章

  1. Android application 和 activity 标签详解

    extends:http://blog.csdn.net/self_study/article/details/54020909 Application 标签 android:allowTaskRep ...

  2. android学习-Activity启动过程详解

    注:只是说明启动activity的过程(ActivityThread如何与ActivityManagerService简称AmS进行进程间通信调用全过程),不解析android从zygote(受精卵) ...

  3. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

  4. &lbrack;转&rsqb;Android中attr自定义标签详解

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:wen= ...

  5. 【转载】Android中attr自定义标签详解

    原文链接:http://blog.sina.com.cn/s/blog_62ef2f14010105vi.html:仅对排版进行优化,更方便阅读 <LinearLayout xmlns:andr ...

  6. Android学习笔记4——Activity详解

    在 Android 开发过程中,与程序员打交道最多的应该就是作为四大组件之一的 Activity 了.接下来我们就一起来揭开 Activity 的神秘面纱吧~ 一.概述 什么是 Activity(活动 ...

  7. Android学习笔记之Toast详解

    1. 贴一段Android API-Toast Toast public class Toast  extends Object java.lang.Object ↳ android.widget.T ...

  8. Android学习笔记&lowbar;21&lowbar;ViewFlipper使用详解 手势识别器

    一.介绍ViewFilpper类 1.1 屏幕切换 屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面:一个个性化设置 ...

  9. Android SDK Manager详解

    Android基础知识——Android SDK Manager详解   做Android开发时,免不了使用Android SDK Manager,安装需要的sdk版本.buildTools版本等等. ...

  10. Android 布局学习之——Layout&lpar;布局&rpar;详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

随机推荐

  1. js写的闹钟,支持多个闹钟

    因为玩一个游戏,该游戏可以支持多个号,每个号有好多等时间的任务. 来回切换看,太耽误时间.手机的闹钟操作太麻烦. 所以写了一个使用配置文件的闹钟,简单方便. var ForReading = 1, F ...

  2. Spring注解详解

    概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  3. openstack 流量控制

    G版的流量控制,可以在horizon通过对flavor进行配置来实现 1.有admin权限,点击admin进入管理界面:点击Flavors,选取要控制的flavor:点击more,找到View Ext ...

  4. ARM Linux从Bootloader、kernel到filesystem启动流程

    转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...

  5. 探秘IntelliJ IDEA 13中的版本控制——Subversion 1&period;8

    IntelliJ IDEA 中引入的重要特性就是版本控制,而在IntelliJ IDEA 13中的体现便是支持最新的Subversion 1.8. 相对于之前版本对Subversion的支持,Subv ...

  6. 数据库中row&lowbar;number&lpar;&rpar;、rank&lpar;&rpar;、dense&lowbar;rank&lpar;&rpar; 的区别

    row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号. ...

  7. python 进阶读书笔记1 -- 理解python一切皆对象

    理解python一切皆对象: 1.所有的类都是由type创建的 2.所有的类的基类都是object 3.type是类,也是实例,type的基类是object,type对象是由type创建的 4.obj ...

  8. 【转】android笔记--保存和恢复activity的状态数据

    一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会 ...

  9. 一本通1619【例 1】Prime Distance

    1619: [例 1]Prime Distance 题目描述 原题来自:Waterloo local,题面详见 POJ 2689 给定两个整数 L,R,求闭区间 [L,R] 中相邻两个质数差值最小的数 ...

  10. 数据分析报告格式zz

    分析报告的输出是是你整个分析过程的成果,是评定一个产品.一个运营事件的定性结论,很可能是产品决策的参考依据,既然这么重要那当然要写好它了. 我认为一份好的分析报告,有以下一些要点: 首先,要有一个好的 ...