Android 11系统稳定性 --亮屏解锁后闪现一个后台应用界面

本文分析了Android 11平台的一个随机问题,即设备在灭屏后亮屏解锁时,有时会闪现一个后台应用界面。问题关键在于>WelcomeTourActivity<的WindowState始终保持(EXITING)状态,导致在解锁瞬间出现。通过源码分析,发现当Task运行RecentAnimation动画时,如果ActivityRecord状态改变,WindowManagerService尝试启动退出动画,使得WindowState的mAnimatingExit属性错误地保持为true,从而引发问题。解决方法是确保RecentAnimation动画结束后正确处理相关WindowState状态。
摘要由CSDN通过智能技术生成

注意:Android 12的代码Google已经释放出来了,针对这个问题也做了类似的修改,可以参考Android 12上做出修改。

Android 11平台出现一个随机性问题,灭屏然后亮屏后解锁,界面会闪现一个后台应用的界面,只要出现以后除非清除此后台应用或者重启,否则就一直存在此问题。此问题为概率性问题,故我追踪了很长时间才找到此问题原因。

一.问题原因:

从抓取的问题log来看,很容易就看出来如下:

Window{fd7df20 u0 com.google.android.gm/com.google.android.gm.welcome.WelcomeTourActivity EXITING}

WelcomeTourActivity的WindowState一直处于EXITING状态,也就是说WindowState的属性mAnimatingExit一直等于true。其在解锁一瞬间出现的原因如下,以下为我模拟的一个出现问题的场景

1.产生问题的WindowState在灭屏,dumpsys window。其问题信息如下:

  Window #11 Window{187f8b8 u0 com.pc.pcconnector/com.pc.pcconnector.MainActivity EXITING}:
    mDisplayId=0 rootTaskId=9 mSession=Session{1b1be15 5996:u0a10174} mClient=android.os.BinderProxy@565af1b
    mOwnerUid=10174 showForAllUsers=false package=com.pc.pcconnector appop=NONE
    mAttrs={(0,0)(fillxfill) sim={adjust=pan forwardNavigation} ty=BASE_APPLICATION wanim=0x10302fe
      fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS
      pfl=FORCE_DRAW_STATUS_BAR_BACKGROUND FIT_INSETS_CONTROLLED
      fitSides=}
    Requested w=720 h=1560 mLayoutSeq=305
 canReceiveKeys()=false    mHasSurface=true isReadyForDisplay()=false mWindowRemovalAllowed=false
    WindowStateAnimator{225af2a com.pc.pcconnector/com.pc.pcconnector.MainActivity}:
      Surface: shown=false layer=0 alpha=1.0 rect=(0.0,0.0) 720 x 1560 transform=(1.0, 0.0, 1.0, 0.0)
    mAnimatingExit=true mRemoveOnExit=false mDestroying=false mRemoved=false
    mForceSeamlesslyRotate=false seamlesslyRotate: pending=null finishedFrameNumber=0
    isOnScreen=false
    isVisible=false


由以上信息可以看到,其重要的属性有:mHasSurface=true,mAnimatingExit=true,mDestroying=false,isOnScreen=false,isVisible=false。

2.亮屏,解锁,闪现问题WindowState

Window{187f8b8 u0 com.pc.pcconnector/com.pc.pcconnector.MainActivity EXITING}时,dumpsys window:
    其属性有变化的为:isOnScreen=true。
    查看其源码如下:

    /**
     * Is this window currently on-screen?  It is on-screen either if it
     * is visible or it is currently running an animation before no longer
     * being visible.
     */
    boolean isOnScreen() {
        if (!mHasSurface || mDestroying || !isVisibleByPolicy()) {
            return false;
        }
        final ActivityRecord atoken = mActivityRecord;
        if (atoken != null) {
            return ((!isParentWindowHidden() && atoken.mVisibleRequested)
                    || isAnimating(TRANSITION | PARENTS));
        }
        return !isParentWindowHidden() || isAnimating(TRANSITION | PARENTS);
    }

    因为解锁时,WMS会进行AppTransition,此时由于是处于解锁状态,DisplayContent.mClosingApps.isEmpty,故此时系统的最终过渡动画指向的目标为DefaultTaskDisplayArea,此时流程如下:

(1)解锁后进行DefaultTaskDisplayArea的过度动画:

22:41:04.540 Starting animation on DefaultTaskDisplayArea@242807855: type=1, anim=com.android.server.wm.LocalAnimationAdapt
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值