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

“此应用专为旧版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.kler.cn/a/155943.html

相关文章:

  • 猿创征文|Inscode桌面IDE:打造高效开发新体验
  • 数据结构-集合
  • 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程
  • 修改yolo格式的labels类别、删除yolo格式的labels类别
  • 机器学习——损失函数、代价函数、KL散度
  • Xshell,Shell的相关介绍与Linux中的权限问题
  • 并发编程1:线程的基本概念
  • C# 使用HtmlAgilityPack解析提取HTML内容
  • 爬虫伦理与法律:确保数据采集合法性与伦理性
  • Unity工具脚本-检测资源文件夹是否有预制件是指定层级
  • 深入了解Java8新特性-日期时间API之ZonedDateTime类
  • 【Arduino库之:FastLED库】
  • SCAU:数字字符序列2
  • Linux(13):例行性工作排程
  • 前后端分离部署https
  • qt-C++笔记之组件-分组框QGroupBox
  • C/C++ 快速排序
  • Python 错误 TypeError: __str__ Returned Non-String but Printing Output
  • 【源码解析】聊聊线程池 实现原理与源码深度解析(一)
  • 从零构建属于自己的GPT系列3:模型训练2(训练函数解读、模型训练函数解读、代码逐行解读)
  • 算法复习,数据结构 ,算法特性,冒泡法动态演示,复杂度,辗转相除法*,寻找最大公因数
  • Win中Redis部署与配置
  • SCAU:判断点是否在圆上
  • QWebChannel 是 Qt 框架中用于在 Web 页面和 Qt 应用程序之间进行通信的类
  • 【doccano】文本标注工具——属性级情感分析标注自己的业务数据
  • 使用SLS日志服务采集Kong网关的日志