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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值