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

41 阅读2分钟

背景:

针对前些天直播时候,主要讲解是launcher启动app,Activity onResume延时10s不会anr,但是Activity内部activity1跳转activity2就会anr问题展开了讨论 mp.weixin.qq.com/s/_uA5yKUTU… 这个原因为啥已经在公众号和直播讲解清楚了。但是有些同学也有疑问,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(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 mp.weixin.qq.com/s/LbVLnu1ud… 在这里插入图片描述

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

视频试看: www.bilibili.com/video/BV1wc…