Acitity跳转延时10s会导致anr的时序问题讨论

背景:

针对前些天直播时候,主要讲解是launcher启动app,Activity onResume延时10s不会anr,但是Activity内部activity1跳转activity2就会anr问题展开了讨论
https://mp.weixin.qq.com/s/_uA5yKUTUw-9H-tWxGNK9g
这个原因为啥已经在公众号和直播讲解清楚了。但是有些同学也有疑问,FocusEvent时序一定就会比onResume后么?这个可否在剖析一下呢?下面就针对时序展开堆栈分析

相关堆栈分析时序

具体堆栈如下:
Activity的Launcher部分堆栈
在这里插入图片描述
然后再是有foucs相关变化的日志打出:

在这里插入图片描述
上面堆栈就展示出来了时序,那就是新Activity的启动LauncherActivityItem,ResumeActivityItem都是在Focus变化的前面打印的。

上面都是systemserver的流程情况总结:

第一个Activity (MainActivity)启动第二个Activity (.NoFocuseActivity)
1、第一个Activity如果Pasue完成则开始继续启动第二个Activity
在这里插入图片描述
构造好LauncherActivityItem的对象要进行传递
在这里插入图片描述同样也进行了ResumeActivityItem对象传递

具体代码如下:

在这里插入图片描述
直接就调用了scheduleTransaction就跨进程到了应用了,这个过程发生在realStartActivity里面
com.android.server.wm.ActivityTaskSupervisor.realStartActivityLocked(ActivityTaskSupervisor.java:917)
这个时候应用就进行onCreate等调用,都是post到主线程

在这里插入图片描述那么这个时候handler里面就有了相关的onCreate,onResume等执行的消息调用,都会在主线程执行。

但是针对focus部分的时序跨进程,systemserver端可以看到确实是在上面scheduleTransaction跨进程之后。

在这里插入图片描述
这里还需要通过binder跨进程调用到SurfaceFlinger,SurfaceFlinger通过binder跨进程再调用到InputDispatcher

到了InputDispatcher以后也还需要通过socket通知到App端,App端接受相关的socket消息,进行主线程消费,但是主线程明显要执行前面已经早早post的onCreate和onResume方法才可以执行socket的消息。

综上:
整个时序来说Activity的onCreate,onResume对应的LaunchActivtyItem的消息,在systemserver的realStartActivity就已经比focus的消息要早,导致app主线程早就有了onCreate,onResume的任务,focus消息还需要来回和sf跨进程后才可以到InputDispatcher,InputDispatcher

总结图:
在这里插入图片描述
本文章更多详细代码和资料需要购买课程获取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『Z-Workshop』 6月22日线下ALCOVE分享活动

2024 求是创新 ZJUBCA Sponsored by the ALCOVE Community TIME:2024/06/22 ADD:浙江大学紫金港校区 --- Alcove 是 Aptos 公链与 Alibaba Cloud 共同打造的亚洲首个 Move 开发者社区,致力于支持开发者使用 Move 语言构建下一代 Web3 应用&am…

深入解析Java ThreadLocal及其内存管理机制

在多线程编程中,如何保证线程间的数据隔离和线程安全是一个重要问题。Java提供的ThreadLocal类通过让每个线程拥有独立的数据副本,巧妙地解决了这个问题。本文将深入分析ThreadLocal的工作机制,并探讨如何防止内存泄漏。 目录 ThreadLocal基…

综合管廊挂轨巡检机器人:安全高效管理的新力量

综合管廊、电力管廊等作为承载着各类电缆和管线的重要通道,管廊的安全和可靠性对城市的运行至关重要。传统人工巡检效率低、劳动强度大,且可能存在巡检不及时、不准确等问题。难以满足日益复杂和庞大的管廊系统的监控需求。为了解决这些问题,…

如何选择一个好的汽车油封制造商?

汽车的每一个零部件都至关重要,其中,油封的作用更是不可忽视。它们确保了液体和气体在汽车内部的正确流动,防止了泄漏。因此,选择一个可靠的汽车油封制造商就显得尤为重要。那么,我们应该如何做出明智的选择呢? 首先…

MySQL用于分析查询性能的命令

1、EXPLAIN 1、使用EXPLAIN命令可以查看MySQL如何执行SQL查询语句,包括它是否使用了索引、使用了哪些索引、表扫描方式等。 2、示例:EXPLAIN SELECT * FROM table_name WHERE column_name value; 2、SHOW PROFILE 1、SHOW PROFILE命令用于显示查询执…

RabbitMQ基本概念

RabbitMQ是AMQP协议的一个开源实现,所以其基本概念也就是的 AMQP 协 议中的基本概念。如图3-1所示是 RabbitMQ 的整体架构图。 Message(消息):消息是不具名的,它由消息头和消息体组成。消息体是不透明的, 而消息头则由一系列可选属性组成&…

vue3中的图片懒加载指令及全局注册

vue3中的图片懒加载指令及全局注册 最近重新刷了一遍黑马的小兔鲜前端项目,发现有个懒加载的指令之前还没有用过。而且写法相对固定,因此记录一下 首先,懒加载(Lazy Loading)的作用是延迟加载某些资源或组件&#xf…

用免费的“山水博客”来管理你的离线文章

山水博客地址: https://github.com/opensanyue/ssblog 电脑上存了不博客文章,一直想找个软件整理一下。前不久在github刷到一个,试了一下,还不错,先看看成果。 左边我建了2个大类,分开用来放“csdn”和“简…

【附精彩文章合辑】哈佛辍学小哥的创业经历【挑战英伟达!00 后哈佛辍学小哥研发史上最快 AI 芯片,比 H100 快 20 倍!】

前情提要 https://blog.csdn.net/weixin_42661676/article/details/140020491 哈佛辍学小哥的创业经历 一、背景与起步 这位哈佛辍学小哥,名为Chris Zhu,是一位华裔学生,他在2020年进入哈佛大学,攻读数学学士学位和计算机科学硕…

C#面: C# 如何从基类创建派生类对象?

在C#中,可以通过继承来创建派生类对象。继承是面向对象编程中的一种重要概念,它允许一个类(称为派生类)继承另一个类(称为基类)的属性和方法。 要从基类创建派生类对象,首先需要定义一个派生类…

文物管理技术RFID技术

随着科技的不断发展,科技在各个领域都发挥着重要的作用。其中,在文物管理方面,RFID技术的应用正在逐渐引起人们的关注。RFID(Radio Frequency Identification)技术是一种通过无线电信号进行非接触式识别的技术&#xf…

docker curl:(56) Recv failure: Connection reset by peer

docker容器启动后,查看日志未发现错误,通过查询和分析,发现是期望容器打开的端口与容器实际打开的端口不一致导致。 1)docker run -itd -p 8082:8082 vulfocus/log4j2-rce-2021-12-09:latest 2)curl localhost:8082 …

java基于ssm+jsp 大学生校园兼职系统

1前台首页功能模块 大学生校园兼职系统,在大学生校园兼职系统可以查看首页、企业信息、招聘信息、论坛信息、留言反馈、我的、跳转到后台等内容,如图1所示。 图1系统首页界面图 学生登录,通过学生登录填写账号、密码等信息进行登录操作&…

OSM数据导入至PostgreSQL

好几年没写博客了,最近博士小论文扩展准备添加个路网数据增加定位准确性 用的读取代码是github上的代码,使用openstreet数据。 1,从BBBbike划定区域下载路网数据,BBBike extracts OpenStreetMap (OSM, Garmin, Shapefile etc.) …

【Proteus仿真】基于stm32的数码管时钟

【Proteus仿真】基于stm32的数码管时钟 Proteus仿真!基于stm32的数码管时钟~_哔哩哔哩_bilibili ‍ 01原理图 ​​ 02功能描述 1.通过按键修改时间 2.数码管显示实时时间,时-分-秒-毫秒格式 03获取方式 https://docs.qq.com/sheet/DTExIc2dPUUJ…

启动台出现agent app的解决方法~

启动台出现agent app的解决方法~ 如果用了战网,Battle.net,在卸载后有一个agent app,启动台删除不掉,应用程序里面没有,怎么办呢? 解决方法:找到这个app所在位置,可以通…

05 Shell编程之免交互

1、Here Document免交互 1.1 Here Document概述 Here Document是一个特殊用途的代码块,它是标准输入的一种替代品, 可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。 Here Documen…

力扣503

题目 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味…

vue-主题切换

themeName/index.vue页面: <template><div class"theme-view"><div click"themeClick" class"theme-btn">切换颜色</div><br>{{themeName white ? 白色 : 深色}}主题页面</div> </template><sc…

Spring Boot中最佳实践:数据源配置详解

Spring Boot中最佳实践&#xff1a;数据源配置详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在Spring Boot中如何进行最佳实践的数据源…