当前位置: 首页 > news >正文

“此应用专为旧版android打造,因此可能无法运行”,问题解决方案

当用户在Android P系统上打开某些应用程序时,可能会弹出一个对话框,提示内容为:“此应用专为旧版Android打造,可能无法正常运行。请尝试检查更新或与开发者联系”。
在这里插入图片描述
随着Android平台的发展,每个新版本通常都会引入新的功能和API,同时逐渐弃用或改变一些旧版本的API。这给应用开发者带来了挑战,如何保持他们的应用与最新版本的Android操作系统兼容? 在这篇文章中,我们将讨论Android操作系统的向后兼容性,并提供面向开发者和用户的解决方案。
Android平台的向后兼容性
在Android应用开发中,目标SDK版本(targetSdkVersion)非常重要,它告诉系统应用是为哪个版本的Android SDK设计的。系统使用这个信息来判断是否需要对该应用应用向后兼容措施。如果一个应用的目标SDK版本过低,可能会导致在新版本的Android系统上出现兼容性问题。
实际问题:遗留应用
由于历史原因,一些应用可能没有及时更新他们的目标SDK版本。这样,旧的应用可能无法充分利用新版本Android的优化或功能,也可能会由于权限模型或API行为变更而出现问题。这些问题会对用户体验产生负面影响。让我们深入了解其中的具体问题。
权限模型问题
随着Android版本的更新,权限模型也发生了改变。在旧版本Android系统中,应用安装后可以随意访问用户的许多敏感数据和系统资源,例如联系人数据、位置信息等等。这是一个潜在的安全隐患,Google加强了对应用权限的管理,并增加了对用户数据的保护。而这也是导致旧版应用出现兼容性问题的一个重要方面。
API的变化
Android系统推出新的API版本,同时可能会弃用旧的API,这意味着旧版应用使用这些API将无法在新版Android系统上正常运行。大多数情况下,使用新的API版本将更好地支持新的Android系统,并为用户提供更好的功能和体验。
Android P的“应用警告”机制
为了帮助用户更好地管理旧的应用,Android P中引入了“应用警告”机制,当应用的targetSdk版本低于Android系统中规定的最低支持版本,会弹出“deprecated target”提示框。这个提示框给用户了解应用的适配情况,提醒他们可能会出现兼容性问题。
代码解决方案
更新应用targetSdkVersion
为了解决对应用兼容性的问题,应用开发者可以考虑更新其targetSdkVersion。这将使应用能够最好地适应新的Android系统版本,并使用新的API和变化的权限模型等,充分利用最新的功能。以下示例显示如何使用Gradle将应用程序的目标SDK版本提升至API级别为30。这会让用户感到困惑,那么真正的原因是什么呢?下面通过分析Android P源代码来解析这个问题。
在启动应用程序时,会经过一系列的流程,其中涉及到名为realStartActivityLocked的方法,该方法位于ActivityStackSupervisor.java文件中。在这个方法中,会调用AppWarnings.java文件中的onStartActivity方法。
onStartActivity方法具体实现如下:

public void onStartActivity(ActivityRecord r) {showUnsupportedCompileSdkDialogIfNeeded(r);showUnsupportedDisplaySizeDialogIfNeeded(r);showDeprecatedTargetDialogIfNeeded(r);
}

上述代码中,我们重点关注showDeprecatedTargetDialogIfNeeded函数的实现。
showDeprecatedTargetDialogIfNeeded函数会判断应用程序的targetSdkVersion是否低于Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT,如果是,则会显示对话框。
那么,如何确定Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT的值呢?我们可以通过查看源代码,发现其默认值是17(Build.VERSION_CODES.JELLY_BEAN_MR1)。
所以,当应用程序的targetSdkVersion低于17时,在Android P系统上启动应用时会弹出对话框“此应用专为旧版Android打造,可能无法正常运行。请尝试检查更新或与开发者联系”。
为了验证这一原因,我们查看了一个应用程序的Package信息,发现targetSdk版本是8,远低于17。=
为了避免重复弹出对话框,AMS会在用户选择“确定”后给应用设置一个Flag标识:FLAG_HIDE_DEPRECATED_SDK。这样在下次弹出对话框时,会先检测该标识是否为true,如果是,则说明已经提示过用户,无需再次弹出。
需要注意的是,标准值由ro.build.version.min_supported_target_sdk设定,默认为17。因此,当应用的targetSdk版本低于17时,会弹出对话框。比如,当检查某应用Package信息时,发现该应用的targetSdk版本为8,因此启动该应用时会弹出该对话框。
解决方案:
开发者应该将应用程序的targetSdkVersion版本提升至17或更高,以确保应用程序在Android P系统上能够正常运行。
需要注意的是,当用户第一次弹出对话框后,如果选择“确定”,Android Management System(AMS)会为应用程序设置一个标识位FLAG_HIDE_DEPRECATED_SDK。因此,每次准备弹出对话框时,会先检查此标识位是否为true。如果是true,则说明已经提示过用户,无需再次弹窗。
在Android系统上,当应用程序的targetSdkVersion低于17时,启动应用程序时会弹出对话框“此应用专为旧版Android打造,可能无法正常运行。请尝试检查更新或与开发者联系”。这个限制是由系统默认的Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT值决定的,一般为17。开发者应该尽快将应用程序的targetSdkVersion版本提升,以确保应用程序在Android P系统上的兼容性和正常运行。

http://www.lryc.cn/news/251678.html

相关文章:

  • 【Leetcode题单】(01 数组篇)刷题关键点总结03【数组的改变、移动】
  • Lag-Llama:基于 LlaMa 的单变量时序预测基础模型
  • vue3 :deep() 深度选择器不生效
  • 从零构建属于自己的GPT系列1:数据预处理(文本数据预处理、文本数据tokenizer、逐行代码解读)
  • c++中函数的引用
  • IDA常用操作、快捷键总结以及使用技巧
  • Kibana使用指南
  • wvp如果确认音频udp端口开放成功
  • C#文件夹基本操作(判断文件夹是否存在、创建文件夹、移动文件夹、删除文件夹以及遍历文件夹中的文件)
  • python 交互模式和命令行模式的问题
  • 计算机网络——数据链路层
  • 【限时免费】20天拿下华为OD笔试之【哈希集合】2023B-明明的随机数【欧弟算法】全网注释最详细分类最全的华为OD真题题解
  • 播放器开发(五):视频帧处理并用SDL渲染播放
  • Spring MVC数据绑定的几种方法(一)
  • CSP-坐标变换(其二)
  • docker 安装jekins
  • ChatGPT 问世一周年之际,开源大模型能否迎头赶上?
  • 数据结构和算法-哈夫曼树以相关代码实现
  • Kafka 的起源和背景
  • 三极管在数字电路中的应用
  • java后端自学错误总结
  • CLion安装与配置教程
  • 初识主力投资者
  • vue项目报错及解决npm run build:prod打包错误
  • Go连接mysql数据库
  • ⭐ Unity 里让 Shader 动画在 Scene 面板被持续刷新
  • 面试--各种场景问题总结
  • solidity实现ERC721代币标准发布NFT
  • Failed building wheel for opencv-python which use PEP 517
  • HTML5 的全局属性 hidden 和 display:none 的关系