背景:
针对前些天直播时候,主要讲解是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里面
这个时候应用就进行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/