android:targetSdkVersion更新引发的“惨案”

Posted cuthead

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android:targetSdkVersion更新引发的“惨案”相关的知识,希望对你有一定的参考价值。

一、前言

targetSdkVersion所暗示的许多行为变化都记录在VERSION_CODES文档中了,例如,android6.0变化文档中谈了target为API23时会如何把你的应用转换到运行时权限模型上。由于某些行为的变化对用户是非常明显的,所以将target更新为最新的SDK是所有应用都应该优先处理的事情。

小编在新beta版本的测试中,开发更新了targetSdkVersion为23,沟通测试范围后,回归了权限相关的测试点,没想到的是,只是冰山一角,全功能回归中问题喷发,将小编深深埋在了坑里。

/(ㄒoㄒ)/~~

二、“案情”描述

targetSdkVersion是Android提供向前兼容的主要依据,在应用的targetSdkVersion没有更新之前系统不会应用最新的行为变化。新beta版本,targetSdkVersion改成了23,小编在测试中,发现和更新targetSdkVersion相关的严重问题,至今心有余悸,总结自警,并将有关内容分享。

1、我的资产页面,图片下载出现了问题;app中有模块对https、http请求混合使用(https的web页面,图片是http的请求),受到影响,高版本系统不支持页面混合加载,开发兼容优化代码解决;

2、后台service的调用出现问题;

测试回归,发现升级出现了问题,android显示5.0以上版本,service必须显示调用,开发已修改service为显示调用;

3、pushsdk无法生成token,无法推送;

测试回归发现,客户端安装后无法生成token,替换pushsdk,修复在targetsdkversion高于22,system.settings设置需要权限导致push不可用;

4、新beta版本,targetSdkVersion,改成了23,屏幕高亮功能,受影响;

开发修改实现方式解决;

三、<uses-sdk>

1、语法:

<uses-sdkandroid:minSdkVersion="integer"

android:targetSdkVersion="integer"

android:maxSdkVersion="integer"/>2、包含它的文件:

<manifest>

3、说明:

通过整数形式的API级别表示应用与一个或多个版本的Android平台的兼容性。应用表示的API级别将与Android系统的API级别进行比较,其结果在不同Android设备上可能有所差异。API级别始终是单个整数,该元素实际上是用于指定API级别,而不是SDK(软件开发工具包)或Android平台的版本号。

4、android:minSdkVersion

一个用于指定应用运行所需最低API级别的整数。如果系统的API级别低于该属性中指定的值,Android系统将阻止用户安装应用。应该始终声明该属性。

注意:如果不声明该属性,系统将假定默认值为“1”,这表示您的应用兼容所有Android版本。如果您的应用并不兼容所有版本(例如,它使用API级别3中引入的API),并且您尚未声明正确的minSdkVersion,则当应用安装在API级别小于3的系统上时,应用将在运行时,尝试访问不可用的API时发生崩溃。因此,请务必在minSdkVersion属性中声明合适的API级别。

5、android:targetSdkVersion

一个用于指定应用的目标API级别的整数。如果未设置,其默认值与为minSdkVersion指定的值相等。

该属性用于通知系统,您已针对目标版本进行测试,并且系统不应启用任何兼容性行为来保持您的应用与目标版本的向前兼容性。应用仍可在较低版本上运行(最低版本为minSdkVersion)。

在Android随着每个新版本的推出而进化的过程中,一些行为甚至是外观可能会发生变化。不过,如果平台的API级别高于您的应用的targetSdkVersion所声明的版本,系统就可以通过启用兼容性行为来确保您的应用继续以您所期望的方式工作。您可以通过将targetSdkVersion指定为与应用所运行平台的API级别一致来停用此类兼容性行为。

6、android:maxSdkVersion

一个指定作为应用设计运行目标的最高API级别的整数。

如果应用的maxSdkVersion属性低于系统本身使用的API级别,系统均不允许安装应用。在系统更新后重新验证这种情况下,这实际上相当于将您的应用从设备中移除。

警告:不建议声明该属性。首先,没有必要设置该属性,将其作为阻止您的应用部署到Android平台新发布版本上的一种手段。从设计上讲,新版本平台完全向后兼容。只要您的应用只使用标准API并遵循部署最佳实践,应该能够在新版本平台上正常工作。其次,请注意在某些情况下,声明该属性可能导致您的应用在系统更新至更高API级别后被从用户设备中移除。

四、注意事项

1、应用向前兼容性

Android应用一般向前兼容新版本的Android平台。

向前兼容性很重要,因为许多Android设备都接收OTA系统更新。安装更新后,您的应用将运行在新运行时版本的环境中,但这个版本具有您的应用所依赖的API和系统功能。在某些情况下,在该API之下所做的更改(例如对底层系统本身的更改)可能会影响运行在新环境中的应用。

2、应用向后兼容性

Android应用不一定向后兼容比其编译时所针对的目标版本更久远的Android平台版本。

每个新版本的Android平台都可能包括新的框架API,例如那些能够让应用使用新的平台功能或者替换现有API部分的API。应用可以在运行于新平台时使用这些新API,如上所述,也可以在运行于更新版本的平台(API级别所指定的平台)上时使用这些新API。反之,由于早期版本的平台不包括新API,因此使用新API的应用无法运行在这些平台上。

3、选择平台版本和API级别

当开发应用时,需要选择您所编译的应用所针对的目标平台版本。一般而言,您编译的应用所针对的目标版本应该是您的应用所能支持的最低平台版本。请务必在应用的清单中声明android:minSdkVersion属性,并将其值设置为平台版本的API级别。

4、声明最低API级别

如果您构建的应用使用的API或系统功能是在最新平台版本中引入的,则应将android:minSdkVersion属性的值设置为最新平台版本的API级别。这样做可确保用户只能将您的应用安装在运行兼容版本Android平台的设备上,并进而确保您的应用可以在用户设备上正常工作。

5、针对更高API级别进行测试

编译应用之后,应该确保在应用的android:minSdkVersion属性所指定的平台上对其进行测试。

结束语

欢迎小伙伴留言,共同挖掘隐,提高技能。在测试深度和测试范围的评估上,愿一路学习分享,我们都有所收获!





























































































以上是关于android:targetSdkVersion更新引发的“惨案”的主要内容,如果未能解决你的问题,请参考以下文章

android:targetSdkVersion更新引发的“惨案”

android:targetSdkVersion 为 16 时的操作栏行为

如何在启动阶段设置状态栏的背景颜色[重复]

android应用系统权限问题

解决启动Eclipse后提示’Running android lint’错误的问题

Android截图截取弹框AlertDialog