【问题分析】关于SF侧Launcher层级的分析【Android15】
创始人
2024-09-26 14:48:37
0

在这里插入图片描述

一般来说,SF侧的Layer层级和WMS侧WindowContainer侧的层级是一一对应的,但是对Launcher来说,则略有不同,这点之前我在打印SF信息的时候,也有注意过,但是没有去仔细思考过为什么会这样,直到这次分析问题的时候踩了一坑,才发现有必要梳理一下这块逻辑,并做个记录。

1 问题描述

进入超级省电模式(也是一个Launcher),然后随便打开一个App,如Message,然后在Message界面上划,发现无法返回到Home。

2 问题分析

2.1 分析1

最初我分析的方向是错误的,刚拿到这个问题的时候,我复现了一下,先看上层WMS处WindowContainer的信息:

在这里插入图片描述

没问题,Home类型的Task已经在TaskDisplayArea的top了。

再看SF:

在这里插入图片描述

Message仍然是可见的。

因此我就直接认为是SF侧没有把Launcher对应的Task移动到TaskDisplayArea的top,比如Transaction.setLayer这个方法没有被调用之类的,但是继续打印log后才发现,正常情况下也没有为Home类型的Task设置layer的操作,这个分析方向是错的。

2.2 对Home类型Task的层级的特殊处理

正常情况下,当我从任意一个App回到Home后,再看此时winscope的信息:

在这里插入图片描述

发现虽然Launcher是可见的,但是它在SF侧仍然是出于TaskDisplayArea的bottom的,而在WMS侧,它在WindowContainer层级结构中是处于TaskDisplayArea的top的。

画个示意图,按照层级高的在上的形式。

WMS侧的情况为:

在这里插入图片描述

SF侧的情况为:

在这里插入图片描述

WMS侧的情况是符合直觉的,但是SF侧的确是Launcher的Task在底部,为什么会这样呢?

直接看TaskDisplayArea调整Task的层级地方,在TaskDisplayArea.assignRootTaskOrdering:

在这里插入图片描述

其实逻辑很清楚了,首先定义一个局部变量layer,初始化为0,然后每次都是先调用TaskDisplayArea.adjustRootTaskLayer来设置Home类型的Task的层级,所以Home类型的Task在SF侧TaskDisplayArea中就是一直处于bottom的。

最终TaskDisplayArea.adjustRootTaskLayer会调用WindowContainer.assignLayer,这里会调用Transaction.setLayer来完成最终的Layer设置,调用堆栈为:

在这里插入图片描述

可以看到调用的时机是在动画就绪的时候,Transition.onTransactionReady。

最后说一下,想要让Home类型的Task能够在屏幕上被看见,那么就只能在适当的时机隐藏位于Home类型Task之上的其它Task,如果这两个Task都是可见的,那么普通的App Task遮挡住Home类型的Task。

当前问题就是这个原因,继续分析。

2.3 分析2

经过以上分析,可知我们分析的重点不是在于SurfaceControl的层级设置,而是在于SurfaceControl的可见性(show和hide)设置。

先来回顾一下Transition中和可见性相关的重要节点,以从Message回到Launcher为例:

1)、启动Launcher,Launcher相关ActivityRecord变为可见。

2)、在动画就绪,Transition.onTransactionReady的时候,需要将Launcher的相关Layer设置为可见。

3)、然后播放动画,此时参与动画的Message和Launcher的相关Layer都应该是可见的。

4)、动画结束,Message相关的ActivityRecord变为不可见,那么它的Task也会被认为是不可见,进而调用Transaction.hide来隐藏它的SurfaceControl,堆栈为:

在这里插入图片描述

因此我们应该关注动画结束后,Message对应的Task没有去隐藏。

之后就定位到了问题原因,发现整个过程中没有“Finish transition”相关的log打印,说明动画流程没有走完,那么自然也不会将Message对应的Task隐藏。

再结合Launcher那边说它们是通过startRecentsTransition等接口来启动相关Home Activity的,因此很大概率是本次启动是瞬态启动。

瞬态启动一个重要的特点就是,从一个界面进入Recents,并且离开Recents后,一个完成的Transition才算完成,如果只是进入Recents,那么Transition只走到了Transition.onTransactionReady,只有从Recents界面离开(选择Recents界面的一个应用进入,或者点击Recents界面的空白区域回到Home),动画才会开始播放,并且最终走到finishTransition阶段,也就是说需要Launcher那边的动画开始播放并且播放完成后Transition才会结束,因此需要Launcher那边继续排查。

相关内容

热门资讯

安卓系统有没有app,基于安卓... 你有没有想过,你的安卓手机里有没有那些特别酷炫的app呢?今天,我就要给你好好盘点让你的手机瞬间变身...
安卓12系统卡吗,性能提升与卡... 亲爱的手机控们,你是不是也遇到过这样的烦恼:手机里正玩得high,突然间,安卓12的小家伙就卡壳了,...
安卓15系统更新内容,性能飞跃... 哇塞,你有没有听说?安卓15系统更新啦!这次更新可是满满的惊喜,让我带你一起探索一下这个全新的系统吧...
安卓软件系统签名限制,数字签名... 你有没有遇到过这种情况?辛辛苦苦开发了一个安卓APP,结果一上传到应用市场,就被误报成病毒了!这可真...
安卓多系统教程没用,安卓多系统... 你有没有遇到过这种情况?满心欢喜地想要学习安卓多系统,结果一看教程,哎哟,怎么这么复杂,还都是一些没...
安卓系统怎么连接键盘,蓝牙与U... 你是不是也和我一样,对手机屏幕上的小键盘有点儿审美疲劳了呢?想要换一个更舒适、更高效的键盘来输入文字...
x431安卓系统,智能诊断新时... 你有没有想过,你的手机里竟然能藏着一个强大的汽车医生?没错,就是那个x431安卓系统!今天,就让我带...
安卓系统要装几个,副标题智能推... 你有没有想过,你的安卓手机里到底装了多少个应用程序呢?是不是有时候觉得手机越来越卡,其实是因为你装了...
华为手机也是安卓系统,引领智能... 你有没有想过,那些在我们手中滑动自如的华为手机,其实也是安卓家族的一员呢?没错,华为手机也是安卓系统...
苹果系统能转换安卓,转换攻略与... 你有没有想过,把你的苹果手机换成安卓手机呢?是不是觉得苹果系统太封闭,想试试安卓的无限可能?别急,今...
设为系统软件安卓,系统级安卓软... 你有没有想过,你的手机里那些神奇的软件,其实都是有个“大管家”在背后默默支持呢?没错,就是安卓系统软...
安卓系统怎么改海外系统,海外安... 你有没有想过,你的安卓手机其实可以变身成海外版的呢?没错,就是那种在国外流行的系统,听起来是不是很酷...
索尼电视系统安卓9,解锁无限精... 你家的索尼电视是不是最近有点卡呢?别急,让我来给你揭秘索尼电视的安卓9系统到底是个啥样子,又是怎么让...
安卓系统用什么语音,探索安卓系... 你有没有想过,你的安卓手机里藏着一个超级助手,它不仅能听懂你的话,还能帮你完成各种任务呢?没错,就是...
安卓优化系统哪个好,全面评测各... 手机用久了是不是感觉有点卡?别急,今天就来给你揭秘安卓优化系统哪个好,让你的手机瞬间恢复活力,流畅度...
如何切换到安卓系统,详尽指南助... 亲爱的手机控们,你是否曾在某个午后,看着手中那部运行着鸿蒙系统的华为手机,心中突然涌起一股想要回归安...
自带安卓系统的软件,功能与应用... 你有没有发现,每次拿到新手机,里面总是塞满了各种自带软件?有时候,这些软件就像家里的亲戚,虽然不常来...
虚拟系统是安卓吗,多系统体验与... 哇塞,你有没有想过,你的手机里竟然可以藏着一个秘密世界?没错,就是安卓手机里的虚拟系统!想象你可以在...
安卓系统打电话变声,趣味通话新... 哎呀呀,你是不是也好奇过,在打电话的时候,能不能让自己的声音变得酷炫酷炫的,就像电影里的特工一样?别...
安卓系统太难用了,轻松驾驭复杂... 你有没有发现,安卓系统最近好像有点儿“水土不服”呢?用起来总觉得有点儿别扭,是不是你也觉得安卓系统太...