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属性所指定的平台上对其进行测试。

结束语

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

原文地址:https://www.cnblogs.com/cuthead/p/targetsdkversion.html

时间: 2024-08-30 05:15:04

android:targetSdkVersion更新引发的“惨案”的相关文章

CSDN日报20170301——《一次dns缓存引发的惨案》

[程序人生] 一次dns缓存引发的惨案 作者:纯洁的虫子 时间2015年的某个周六凌晨5点,公司官方的QQ群有用户反馈官网打不开了,但有的用户反馈可以打开,客服爬起来自己用电脑试了一下没有问题,就给客户反馈说,可能是自己网络的问题,请过会在试试.早点8点,越来越多的用户反馈官网无法打开,并且有部分用户开发反馈app也打不开了,客服打电话叫起了还在梦乡中的我. -- 点此阅读全文 [Android 开发] Android UI性能优化 检测应用中的UI卡顿 作者:鸿洋 在做app性能优化的时候,大

离线安装 Android Studio 更新

离线安装 Android Studio 更新 1.在线更新 随着 Android Studio 的越来越完善与流行,无论从功能性,还是性能上,它正在成为广大 Android 开发者的首选.但是因为总所周知墙的原因,我们在 Android Studio 内更新时,会无法更新: 这时,要么去官网下载最新的 Android Studio 安装包--但你如果连更新也无法检测的话,按说也访问不到 Android 开发者官网.悲剧 ^-^!!但我们还有另一种"曲线救国"的方法来更新,就是获取更新离

Android 线程更新UI报错 : Can&#39;t create handler inside thread that has not called Looper.prepare()

MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toString(); String timelength = lengthText.getText().toString(); ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new NewsService(getApp

Android SDK更新以及ADT更新出现问题的解决办法(转载)

转自:http://zyueqi.iteye.com/blog/1474323 问题描述 使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refusedFailed to fetch URL http://dl-ssl.google.com/an

Android SDK更新以及ADT更新出现问题的解决办法

使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refusedFailed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml, reason: C

一道题引发的惨案

昨天在一个cocos2d-x的群里,有群友发了一个问题求答案,当时自已也一下子没想到什么好的写法,这时候有个群友写了一个比较少见的代码方法,当时一看到这代码,我有一种如糊灌顶的感受,因为自已平时基本没用这种写法,今日在别的群,我就发了这道题让大家讨论一下,结果没想到,引发了各种争吵和讨论,有写得不好却自以为是的,有写得好却看不起别人的写法,有写得很好却十分低调的,十分精彩,也算是为群里热闹了一下气氛,QQ群也变成了社会市井的一个浓缩了,呵呵. 以下贴上问题和昨天那位群友写的代码,我觉得精彩的地方

Android攻城狮 Android中更新UI的几种方式

Android中更新UI的几种方式: 1. Activity 的 runOnUiThread() 2. Handler 的 post() 3. Handler 的 sendMessage() 4. View 的 post() 1 public class FiveActivity extends Activity { 2 3 private TextView textView; 4 5 private Handler handler = new Handler() { 6 public void

Android SDK更新 Connection to http://dl-ssl.google.com refused 解决方法

原地址:http://blog.csdn.net/foxeatapple/article/details/8450372 问题描述 使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refusedFailed to fetch URL http:/

android studio 更新 Gradle错误解决方法(Gradle sync failed)

android studio 更新 Gradle错误解决方法 Android Studio每次更新版本都会更新Gradle这个插件,但由于长城的问题每次更新都是失败,又是停止在Refreshing Gradle Project ,有时新建项目的时候报 Gradle Project Compile Error 等等相关的问题 解决这些问题办法是 首先打开android studio项目 找到项目目录gradle\wrapper\gradle-wrapper.properties这个文件 内容如下