百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

haoteby 2025-01-09 12:58 6 浏览

1 前言

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

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

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

?? 注意

附上示例代码,大家可以下载下来,使用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的对应关系

3 <uses-sdk>标签说明

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

1 <uses-sdk android:minSdkVersion="integer"
2  android:targetSdkVersion="integer"
3  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 Level21

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

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

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

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

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 来获得最好的外观和行为,更好的利用新特性

相关推荐

百度首席技术官王海峰:飞桨已拥有750万名开发者 文心一言将逐步开放插件生态

【百度首席技术官王海峰:飞桨已拥有750万名开发者文心一言将逐步开放插件生态】《科创板日报》6日讯,2023世界人工智能大会上,百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰表示,截至...

那些不得不装的浏览器插件,日英文视频自动翻译、广告、沉浸阅读

这年头各种浏览器层出不穷,要说使用量最大的还是基于chromium内核的吧。MicrosoftEdge、360、QQ……哪个厂商不说它香!chromium系的强大扩展性让我们浏览网页的体验越来越爽了...

百度站长平台:论坛搜索功能升级 推论构化数据插件

站长之家(Chinaz.com)3月26日消息近日,百度站长平台站内搜索功能针对论坛站点新增了搜版块和搜用户功能。此外,还推出了新版的论坛结构化数据插件,分为兼容版和完整版两个版本。注意,兼容版无法开...

警惕!利用百度推广实施的诈骗!(百度推广真的有用吗)

...

百度王海峰:文心3.5效果全面提升 将发布更多百度官方和第三方插件

中证网讯(记者彭思雨)7月6日,2023世界人工智能大会在上海开幕。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰表示,文心大模型3.5效果、功能、性能全面提升,实现了基础模型升级、精...

WORDPRESS好用的seo插件:生成百度站点地图

BaiduSitemapGenerator是何方大神?BaiduSitemapGenerator是一个wordpress插件,BaiduSitemapGenerator可以生成格式化sit...

你能容忍百度不经过允许给用户下载插件吗?

文/懒人先生(首发头条)最近,百度又摊上事儿了,这次找事儿的可不是个人,而是网友整个团体啊,事情的缘起是因为有一个网友在网上反映百度地图会自动在后台下载一些热门的音频文件,这样做的后果就是有可能网友们...

提升工作效率的三款excel插件推荐,相信你总会得到有价值的东西

本内容来源于@什么值得买SMZDM.COM|生活家被演南非有这样的一句话“会excel的比会word的挣得多,会ppt的比会excel的挣得多”但我看来,office三件套word、excel、pp...

工具 | 直接在网页上做标记?这些插件简直不要太赞

哈喽,大家好。好久不见啊!!!2021年的第一篇推文来啦~有小伙伴在后台留言:浏览网页时如何做标记?所以这篇推文就来介绍一下~之前的推文中有介绍过,浏览网页时如何快速定位关键词,其实也算是做标记的一种...

良心合集!Adobe Audition常用插件免费下载

八月了时间很快...

用上这几个脚本,多家网盘下载不限速

下载别人分享的文件需要用到各种网盘,有的网盘下载一个小文件也需要转存才能下载,或是需要客户端与会员等操作,在日常使用的时候不是很方便,百度网盘相关的下载工具已经介绍过很多了。今天就来给大家推荐几个其他...

论坛站站长的福音 百度DZ插件跨越式升级

站长之家(chinaz.com)3月31日消息:百度站长平台今日跨越式升级discuz百度结构化数据提交插件,此次跨越式升级提升了收录时效性,而且支持提交有关用户和版块数据。如果你是使用Discuz!...

百度CTO王海峰:文心大模型3.5新增插件机制 使其具备生成实时准确信息的能力

【百度CTO王海峰:文心大模型3.5新增插件机制使其具备生成实时准确信息的能力】《科创板日报》27日讯,百度首席技术官王海峰表示,文心大模型3.5最大的一个变化是新增了插件机制,默认的内置插件“百度...

flutter集成 百度地图 ^2.0.1版本 | 绕坑必备

我之前在flutter中使用高德地图,发现没有引入,总是编译错误,后面我选择了使用flutter_map;flutter_map有一个局限是使用瓦片渲染。且只能渲染;要想效果好一点就用mapbox的...

百度文心一言新增搜索、图表生成等5大原生插件

【百度文心一言新增搜索、图表生成等5大原生插件】《科创板日报》16日讯,今日,文心一言发布五个原生插件:百度搜索、览卷文档(基于文档的交互)、E言易图(数据洞察图表生成)、说图解画(基于图片的交互)、...