平台

RK3399 + Android 8.1
调试应用: com.android.documentsui

问题

  • 切换后显示异常, 如下图所示, 窗口明显被拉伸了:
  • 正确的显示效果:

调试

dumpsys window

  • 显示异常
  Window #5 Window{82f86c3 u0 com.android.documentsui/com.android.documentsui.files.FilesActivity}:mDisplayId=0 stackId=2 mSession=Session{8e3c127 1593:u0a10012} mClient=android.os.BinderProxy@4d7d272mOwnerUid=10012 mShowToOwnerOnly=true package=com.android.documentsui appop=NONEmAttrs=WM.LayoutParams{(0,0)(fillxfill) sim=#10 ty=1 fl=#81810100 pfl=0x20000 fmt=-3 wanim=0x10302f6 vsysui=0x600 surfaceInsets=Rect(40, 40 - 40, 40) (manual) (!preservePreviousSurfaceInsets) needsMenuKey=2 colorMode=0}Requested w=960 h=512 mLayoutSeq=577mHasSurface=true mShownPosition=[484,90] isReadyForDisplay()=true hasSavedSurface()=false mWindowRemovalAllowed=falseWindowStateAnimator{a17f258 com.android.documentsui/com.android.documentsui.files.FilesActivity}:mAnimating=true mLocalAnimating=false mAnimationIsEntrance=false mAnimation=null mStackClip=1XForm: has=true hasLocal=false {alpha=1.0 matrix=[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}Surface: shown=true layer=21010 alpha=1.0 rect=(444.0,50.0) 1040.0 x 592.0 transform=(0.99166936, 0.0, 1.5310801, 0.0)mGlobalScale=1.0 mDsDx=0.99166936 mDtDx=0.0 mDtDy=0.0 mDsDy=1.5310801isOnScreen=trueisVisible=true
  • 正常显示
  Window #5 Window{82f86c3 u0 com.android.documentsui/com.android.documentsui.files.FilesActivity}:mDisplayId=0 stackId=2 mSession=Session{8e3c127 1593:u0a10012} mClient=android.os.BinderProxy@4d7d272mOwnerUid=10012 mShowToOwnerOnly=true package=com.android.documentsui appop=NONEmAttrs=WM.LayoutParams{(0,0)(fillxfill) sim=#10 ty=1 fl=#81810100 pfl=0x20000 fmt=-3 wanim=0x10302f6 vsysui=0x600 surfaceInsets=Rect(40, 40 - 40, 40) (manual) (!preservePreviousSurfaceInsets) needsMenuKey=2 colorMode=0}Requested w=960 h=512 mLayoutSeq=595mHasSurface=true mShownPosition=[480,256] isReadyForDisplay()=true hasSavedSurface()=false mWindowRemovalAllowed=falseWindowStateAnimator{a17f258 com.android.documentsui/com.android.documentsui.files.FilesActivity}:Surface: shown=true layer=21010 alpha=1.0 rect=(440.0,216.0) 1040.0 x 592.0 transform=(1.0, 0.0, 1.0, 0.0)isOnScreen=trueisVisible=true

从近期任务切换为FreeForm模式:

com.android.server.am.ActivityManagerService.startActivityFromRecents(ActivityManagerService.java:4935)
com.android.server.am.ActivityStackSupervisor.startActivityFromRecentsInner(ActivityStackSupervisor.java:4882)
com.android.server.wm.WindowManagerService.continueSurfaceLayout(WindowManagerService.java:2979)
com.android.server.wm.WindowSurfacePlacer.continueLayout(WindowSurfacePlacer.java:126)
com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:135)
com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:145)
com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:197)
com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:608)
com.android.server.wm.RootWindowContainer.applySurfaceChangesTransaction(RootWindowContainer.java:865)
com.android.server.wm.DisplayContent.applySurfaceChangesTransaction(DisplayContent.java:2784)
com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:633)
com.android.server.wm.DisplayContent.forAllWindows(DisplayContent.java:1533)
com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:616)
com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:616)
com.android.server.wm.WindowState.forAllWindows(WindowState.java:4034)
com.android.server.wm.WindowState.applyInOrderWithImeWindows(WindowState.java:4127)
com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:777)
com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:779)
  • AppWindowAnimator.java
com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:623)
com.android.server.wm.WindowSurfacePlacer.handleAppTransitionReadyLocked(WindowSurfacePlacer.java:344)
com.android.server.wm.WindowSurfacePlacer.handleOpeningApps(WindowSurfacePlacer.java:404)
com.android.server.wm.AppWindowToken.setVisibility(AppWindowToken.java:372)
com.android.server.wm.WindowManagerService.applyAnimationLocked(WindowManagerService.java:2435)
com.android.server.wm.AppWindowAnimator.setAnimation(AppWindowAnimator.java:127)

在APP切换动画启动后,

DisplayContent WindowSta applySurfaceChangesTransaction computeShownFrameLocked DisplayContent WindowSta
  • WindowStateAnimator中计算并重新设置上面dump出来的相关变量: mShownPositiontransform

  • 问题的根源在于 startProlongAnimation 调用了, 但 endProlongedAnimation 却迟迟未调用, 导致动画被无限推后, mShownPosition 和 transform 也一直无变化:

  • AppWindowAnimator

    /*** Sometimes we need to synchronize the first frame of animation with some external event, e.g.* Recents hiding some of its content. To achieve this, we prolong the start of the animaiton* and keep producing the first frame of the animation.*/private long getAnimationFrameTime(Animation animation, long currentTime) {if (mProlongAnimation == PROLONG_ANIMATION_AT_START) {animation.setStartTime(currentTime);return currentTime + 1;}return currentTime;}private boolean stepAnimation(long currentTime) {if (animation == null) {return false;}transformation.clear();final long animationFrameTime = getAnimationFrameTime(animation, currentTime);...}void startProlongAnimation(int prolongType) {if(!ffNoCaption)mProlongAnimation = prolongType;mClearProlongedAnimation = false;}void endProlongedAnimation() {mProlongAnimation = PROLONG_ANIMATION_DISABLED;}
RecentsActivity WindowMana AppWindowAnimator endProlongedAnimations endProlongedAnimations endProlongedAnimation RecentsActivity WindowMana AppWindowAnimator
  • WindowManagerService.java
    @Overridepublic void endProlongedAnimations() {synchronized (mWindowMap) {for (final WindowState win : mWindowMap.values()) {final AppWindowToken appToken = win.mAppToken;if (appToken != null && appToken.mAppAnimator != null) {appToken.mAppAnimator.endProlongedAnimation();}}mAppTransition.notifyProlongedAnimationsEnded();}}

加上调试LOG后输出:

//开始切换:
05-30 05:13:25.287 D/AppWindowAnimator      497): startProlongAnimation 80261794
05-30 05:13:25.298 D/RecentsActivity(       670): addOnPreDrawListener 2
05-30 05:13:25.301 D/RecentsActivity(       670): onPreDraw
//从mWindowMap 中删除 com.android.documentsui
05-30 05:13:25.309 D/WindowManagerService(  497): postWindowRemoveCleanupLocked remove com.android.documentsui/com.android.documentsui.files.FilesActivity05-30 05:13:25.336 D/RecentsActivity(       670): Recents.getSystemServices().endProlongedAnimations();
//开始遍历并调用 AppWindowAnimator.endProlongedAnimation
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=com.android.systemui/com.android.systemui.recents.RecentsActivity
05-30 05:13:25.337 D/AppWindowAnimator(     497): endProlongedAnimation 43221400
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=NavigationBar
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=NavigationBar mAppAnimator is NULL
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=AssistPreviewPanel
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=AssistPreviewPanel mAppAnimator is NULL
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=DockedStackDivider
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=DockedStackDivider mAppAnimator is NULL
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=com.android.launcher3/com.android.launcher3.Launcher
05-30 05:13:25.337 D/AppWindowAnimator(     497): endProlongedAnimation 73295989
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=StatusBar
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=StatusBar mAppAnimator is NULL
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=com.android.systemui.ImageWallpaper
05-30 05:13:25.337 D/WindowManagerService(  497): endProlongedAnimations win.mAppToken.stringName=com.android.systemui.ImageWallpaper mAppAnimator is NULL//重新将 com.android.documentsui 加入 mWindowMap 中
05-30 05:13:25.404 D/WindowManagerService(  497): addWindow com.android.documentsui/com.android.documentsui.files.FilesActivity

从调试的LOG看, 对应com.android.documentsui的Window在循环调用 AppWindowAnimator.endProlongedAnimation时, 完美地错过了…

解决:

  • frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
    public int addWindow(Session session, IWindow client, int seq,WindowManager.LayoutParams attrs, int viewVisibility, int displayId,Rect outContentInsets, Rect outStableInsets, Rect outOutsets,InputChannel outInputChannel) {int[] appOp = new int[1];int res = mPolicy.checkAddPermission(attrs, appOp);
//...省略代码...} else if (rootType >= FIRST_APPLICATION_WINDOW && rootType <= LAST_APPLICATION_WINDOW) {atoken = token.asAppWindowToken();//增加代码if(atoken != null && atoken.mAppAnimator != null){atoken.mAppAnimator.endProlongedAnimation();}
//....省略代码....

Android 8.1 FreeForm切换显示异常相关推荐

  1. QML on Android 在小米5s手机上中文字体显示异常

    前言 随着Qt版本的不断升级,用QML开发Android移动端应用越来越方便,并且支持的功能也逐渐增多,不过由于Android机型实在太多,并且大部分Android系统都是由手机厂商深度定制过,然后在 ...

  2. Android Studio “Project Structure”选项目录结构显示异常

    Android Studio "Project Structure"选项目录结构显示异常 参考文章: (1)Android Studio "Project Structu ...

  3. Android 虚拟按键隐藏或显示之后共享元素动画异常解决方案

    背景 本篇算是共享元素的第三篇文章.主要还是因为第一篇才会衍生出来了第二篇和第三篇文章,后两篇均属于bug的分析和解决. 1.Android 仿微信朋友圈图片拖拽返回 2.Android 共享元素动画 ...

  4. android 游戏sdk 浮标,华为游戏浮标不显示或显示异常

    VIM中显示颜色或不显示颜色 每个系统管理员至少要学会使用一种命令行界面的文字处理器,以便管理系统的日常工作.Linux的文字处理软件非常多,一般用的最的就是VI这个正规的文字处理器. $(" ...

  5. android 首页广告位,IT之家安卓版 7.25:去文章内广告位、修正专题和头像显示异常...

    原标题:IT之家安卓版 7.25:去文章内广告位.修正专题和头像显示异常 IT之家 安卓版 7.25 更新! 刚才发布了 IT之家 iOS 版 7.23,带来了大量更新,现在安卓版 7.25 发布,同 ...

  6. LCD显示异常分析——开机闪现花屏【转】

    转自LCD显示异常分析--开机闪现花屏 最近在工作中,有同事遇到LCD开机瞬间会闪现雪花屏的问题,而这类问题都有个共同点,那就是都发生在带GRAM的屏上,同样的问题,在休眠唤醒时也会出现. 其实这类问 ...

  7. 密码密文 android,Android密码明文密文切换

    Android密码明文密文切换,注册的时候用的比较多. 效果动画: MainActivity package com.example.shen.passwordtest; import android ...

  8. 【Android】保存Fragment切换状态

    [Android]保存Fragment切换状态 前言 一般频繁切换Fragment会导致频繁的释放和创建,如果Fragment比较臃肿体验就非常不好了,这里分享一个方法. 声明 欢迎转载,但请保留文章 ...

  9. LCD 显示异常定位分析方法

    第一种情况: 进入kernel或android 后,如果LCM图像示异常,可以通过如下步骤来判断问题出现在哪个层面. step1:通过DMMS截图,来判断上面刷到LCM的数据是否有问题. 若DMMS获 ...

最新文章

  1. 一份非常详尽的 Objective-C 到 Swift 的迁移指南
  2. 利用OpenCV求矩阵的特征值和特征向量
  3. linux 启动mongodb
  4. Spring之泛型依赖注入
  5. 10分钟带你探索css中更为奇妙的奥秘
  6. Django之ORM对数据库操作
  7. 大数据学习笔记14:MR案例——招聘数据分析
  8. 4-字符转换及所在位置
  9. 针对非业务的通用框架开发,如何做需求分析和设计?
  10. python 多线程伪_Python每日3题什么是死锁?
  11. google扩展工具Octotree使用(2020-09-01)
  12. Jetson Nano 下串口调试工具
  13. JavaScript系列(1)初体验-弹出HelloWord
  14. 6.shell之正则表达式
  15. 机器学习——基础知识
  16. 新华三“大”结盟 合力推进智慧交通产业升级
  17. AD定义板子外形方法(2)
  18. SQL语句去连接两个表,内连接,左连接以及右连接
  19. 郑州大学大学计算机基础实验报告书答案,最新郑州大学计算机考试模拟题目.doc...
  20. 女人,你真的懂自己吗:女生空间QQ情感日志

热门文章

  1. Python深度学习-NLP实战:命名实体识别(NER)之分词与序列标注、实体识别任务简介
  2. java首字母报错_下列关于Java名称命名的约定,错误的是()。A.-.$不作为变量名、方法名开头B.变量名、方法名首字母小...
  3. 解决OSError: /root/anaconda3/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.20‘ not found问题
  4. sumif 函数求一个区域里面满足一定条件的,对应的其他数据的相加
  5. 学生-课程-成绩-教师表的设计
  6. java getresources_Java的getResources方法
  7. 服务器使用mysql -u root -p报错解决
  8. 迅为IMX6开发板适用于HMI|车载电脑|工业控制|医疗仪器|智能家居 灵活进行产品开发平台...
  9. 【附源码】计算机毕业设计java智能答疑系统app设计与实现
  10. 玻璃钢风机的性能介绍