Android P上,有的应用打开时,会弹出对话框,内容:“此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。用户会感到困惑,真正的原因是什么?

举例,如下图某应用,版本:6.072.001,

下面通过Android P源码,分析原因:

应用启动,startActivity时,流程会执行到realStartActivityLocked方法,代码位于ActivityStackSupervisor.java,可参考我之前一篇文章:startActivity启动流程的源码学习。

realStartActivityLocked方法中,会调用AppWarnings.java的onStartActivity方法,如下:

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig) throws RemoteException {

try {

// ...

mService.getAppWarningsLocked().onStartActivity(r);

// ...

} catch (RemoteException e) {

// ...

}

}

onStartActivity方法实现:

/**

* Called when an activity is being started.

*

* @param r record for the activity being started

*/

public void onStartActivity(ActivityRecord r) {

showUnsupportedCompileSdkDialogIfNeeded(r);

showUnsupportedDisplaySizeDialogIfNeeded(r);

showDeprecatedTargetDialogIfNeeded(r);

}

其中第三个函数showDeprecatedTargetDialogIfNeeded重点分析:

/**

* Shows the "deprecated target sdk" warning, if necessary.

*

* @param r activity record for which the warning may be displayed

*/

public void showDeprecatedTargetDialogIfNeeded(ActivityRecord r) {

if (r.appInfo.targetSdkVersion < Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT) {

mUiHandler.showDeprecatedTargetDialog(r);

}

}

重点:这里出现一个判断方法,正是其决定是否弹窗,判断条件中Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT,如下:

public static final int MIN_SUPPORTED_TARGET_SDK_INT = SystemProperties.getInt(

"ro.build.version.min_supported_target_sdk", 0);

此属性默认值,一般是17。也就是说:

Android P机型上,当应用的targetSdk版本低于17时,应用启动时会弹窗“此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。

那么查看截图的某应用Package信息:

Package [com.qqgame.hlddz] (5ecd50f):

......

versionCode=196 minSdk=8 targetSdk=8

versionName=6.043.001

果然其App的targetSdk是8,远低于17。

解决了核心问题,继续跟进showDeprecatedTargetDialog方法的实现,会发现其主要是调用对话框类DeprecatedTargetSdkVersionDialog,来弹出此对话框,并显示提示。

这里有一个问题,既然是在每个Activity启动时会调用AppWarnings.java的onStartActivity方法,那会不会每次打开新Activity,都弹此对话框?如果这样,用户体验也会非常不好。

答案:不会的,这里有一个小技巧,第一次弹出对话框后,用户如果选择“确定”,AMS会给此应用设置一个Flag标识:FLAG_HIDE_DEPRECATED_SDK。每次准备弹窗时,会先判断此标识值是否为true,如果是,说明已经提示过用户,无需再弹窗。代码如下:

public DeprecatedTargetSdkVersionDialog(final AppWarnings manager, Context context, ApplicationInfo appInfo) {

// ...

final AlertDialog.Builder builder = new AlertDialog.Builder(context)

.setPositiveButton(R.string.ok, (dialog, which) ->

manager.setPackageFlag(

mPackageName, AppWarnings.FLAG_HIDE_DEPRECATED_SDK, true))

.setMessage(message)

.setTitle(label);

// ...

}

最后,结论如下:

Android P机型上,当应用的targetSdk版本低于17时,应用启动时会弹窗“此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。标准值由ro.build.version.min_supported_target_sdk值设定的,一般默认是17

作者:kevin song,2019.1.23于南京建邺区

此版本专为旧版android打造,应用弹窗“此应用专为旧版Android打造,因此可能无法正常运行...”的原因...相关推荐

  1. android app更新弹窗,应用弹窗“此应用专为旧版Android打造,因此可能无法正常运行...”的原因...

    Android P上,有的应用打开时,会弹出对话框,内容:"此应用专为旧版Android打造,因此可能无法正常运行.请尝试检查更新或与开发者联系".用户会感到困惑,真正的原因是什么 ...

  2. android版本隐藏彩蛋养猫,Android 11 新增养猫彩蛋,正式版即将推送

    近日,谷歌正式推送了 Android 11 Beta3 系统,这是 Android 11 第三次测试版,也是最后一版测试固件,结束测试后 Android 11 将正式推送. 此次推送的 Android ...

  3. Android 系统性能优化(78)---如何优化您的 Android 应用 (Go 版)

    如何优化您的 Android 应用 (Go 版) 在去年的 Google I/O 大会上发布了 Android (Go 版),其目标是为全球入门级设备提供高质量的智能手机体验.在今年早些时候,6 家原 ...

  4. 苹果:App Store中国区无版号游戏8月1日起下架;美国计划打造量子互联网;HHVM 4.67 发布 | 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极 ...

  5. Android Studio2.0 教程从入门到精通MAC版 - 安装篇

    来自:http://www.open-open.com/lib/view/open1466430392743.html 前言 这个教程你将学会如何使用Android Studio2.0开发Androi ...

  6. Android build.gradle文件详解(转述自《Android第一行代码》第二版)

    Android build.gradle文件详解 1. 最外层目录下的build.gradle文件 1.1 repostories 1.2 dependencies 2. app目录下的build.g ...

  7. 基于android 10的国产手机,魅友有福了,基于Android 10的Flyme来了,10款旧机型可申请...

    原标题:魅友有福了,基于Android 10的Flyme来了,10款旧机型可申请 目前安卓阵营的系统已经开发到Android 11系统,国产小米.华为等已经大批量适配Android 10系统,小米方面 ...

  8. chrome android 85,终于!安卓版Chrome 85将升级到原生64位:支持Android 10及以上系统...

    原标题:终于!安卓版Chrome 85将升级到原生64位:支持Android 10及以上系统 安卓对64位的支持是从2014年的Android 5.0开始的.可时至今日,谷歌自己的Chrome for ...

  9. mix2s android p,小米MIX 2S首发基于Android P定制MIUI 10 8.8.7开发版内测

    [TechWeb]8月8日消息,近日小米多款系列都在适配优化MIUI10版本,目前还在处于内测阶段.现在最新消息,小米MIUI官方凌晨宣布,小米MIX 2S 迎来Android P 内测版本更新,同时 ...

最新文章

  1. linux命令--提升
  2. idea用token登陆github_用python和她一起唐诗宋词
  3. Java中使用Base64进行编码解码的工具类-将验证码图片使用Base64编码并返回给前端
  4. Python中使用高德API实现经纬度转地名
  5. ABAP Netweaver体内的那些寄生式编程语言
  6. Unity3d 手机屏幕自动适配
  7. iOS的帮助网站(企业包发布)adhoc的测试
  8. 最近抖音超火的60帧高清视频制作教程
  9. 按键精灵通过句柄获取窗口坐标_按键精灵9 得到鼠标指向的窗口句柄
  10. 大数据分析师技能图谱详解
  11. linux a卡双显卡切换显卡,amd显卡驱动 双显卡切换
  12. 技能高考的计算机教室,2020湖北技能高考成绩查询时间
  13. html5 心形照片墙,教你两种“心形拼图”法|制作照片墙,3分钟搞定!
  14. 华为S5700交换机开启Telnet和SSH服务
  15. VMBox CentOS安装记录
  16. ubuntu 刷新频率 如何查看_Ubuntu分辨率和刷新频率设置
  17. php 购物车 原理及实现,纯干货丨PHP实现购物车的构建
  18. 计算机启动灯1212,惠普笔记本电脑型号F6C27PA#AB2wifi开关一直亮红灯开不起怎么办?...
  19. 安装npm cnpm方法
  20. 区块链的未来:公链VS联盟链

热门文章

  1. YOLOV5 模型和代码修改——针对小目标识别(红外小目标)
  2. 中国网库董事长王海波:实体经济也需要大数据
  3. 【摘抄】《杜拉拉升职记大结局与理想有关》读后感
  4. Current的基本用法与了解。
  5. 5-15~5-17 七牛工作总结:足球爬虫
  6. POJ #1062 昂贵的聘礼 有限制的最短路 枚举+dijkstra求最短路
  7. 基于OpenCV_C++人脸检测打码技术
  8. 查询至少选修课程号为'c2'和'c4' 两门课程的学生学号
  9. 第十二单元 数论算法12.1 同余的性质12.2 最大公约数、最小公倍数
  10. steam搬砖项目:靠谱吗,细说下搬砖的核心内容