Android U WMShell动画调用堆栈

server/2024/10/22 10:50:47/

本文主要简单介绍WMShell动画调用堆栈
代码环境:repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r7

Systemserver侧

TAG: 	at com.android.server.wm.Transition.onTransactionReady(Transition.java:1575)
TAG: 	at com.android.server.wm.BLASTSyncEngine$SyncGroup.finishNow(BLASTSyncEngine.java:263)
TAG: 	at com.android.server.wm.BLASTSyncEngine$SyncGroup.tryFinish(BLASTSyncEngine.java:202)
TAG: 	at com.android.server.wm.BLASTSyncEngine$SyncGroup.-$$Nest$mtryFinish(BLASTSyncEngine.java:0)
TAG: 	at com.android.server.wm.BLASTSyncEngine.onSurfacePlacement(BLASTSyncEngine.java:552)
TAG: 	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:810)
TAG: 	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:756)
TAG: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:177)
TAG: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:126)
TAG: 	at com.android.server.wm.WindowManagerService.relayoutWindow(WindowManagerService.java:2410)
TAG: 	at com.android.server.wm.Session.relayout(Session.java:249)
TAG: 	at com.android.server.wm.Session.relayoutAsync(Session.java:263)
TAG: 	at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:731)
TAG: 	at com.android.server.wm.Session.onTransact(Session.java:178)
TAG: 	at android.os.Binder.execTransactInternal(Binder.java:1344)
TAG: 	at android.os.Binder.execTransact(Binder.java:1275)

调用WMShell动画是从relayout流程开始,真正去调用WMShell动画的方法是RootWindowContainer.performSurfacePlacementNoTrace方法中的这句mWmService.mSyncEngine.onSurfacePlacement()

Systemserver侧调用的结束点在Transition.onTransactionReady方法
代码路径frameworks/base/services/core/java/com/android/server/wm/Transition.java

@Override
public void onTransactionReady(int syncId, SurfaceControl.Transaction transaction) {......mController.getTransitionPlayer().onTransitionReady(mToken, info, transaction, mFinishTransaction);......
}

这里通过ITransitionPlayer跨进程通信到SystemUI,进入wmshell动画

private ITransitionPlayer mTransitionPlayer;
@Nullable ITransitionPlayer getTransitionPlayer() {return mTransitionPlayer;
}

调用ITransitionPlayer对象的onTransitionReady方法,该方法在Transitions中实现

SystemUI侧

代码路径:frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java

@BinderThread
private class TransitionPlayerImpl extends ITransitionPlayer.Stub {@Overridepublic void onTransitionReady(IBinder iBinder, TransitionInfo transitionInfo,SurfaceControl.Transaction t, SurfaceControl.Transaction finishT)throws RemoteException {mMainExecutor.execute(() -> Transitions.this.onTransitionReady(iBinder, transitionInfo, t, finishT));}......
}
TAG: java.lang.Exception
TAG: 	at com.android.wm.shell.transition.Transitions.playTransition(go/retraceme 691c0b649c5b78e8be353184a2cf4f8453b1bbeba9558d5f9cdae4325458fb69:885)
TAG: 	at com.android.wm.shell.transition.Transitions.processReadyQueue(go/retraceme 691c0b649c5b78e8be353184a2cf4f8453b1bbeba9558d5f9cdae4325458fb69:819)
TAG: 	at com.android.wm.shell.transition.Transitions.dispatchReady(go/retraceme 691c0b649c5b78e8be353184a2cf4f8453b1bbeba9558d5f9cdae4325458fb69:760)
TAG: 	at com.android.wm.shell.transition.Transitions.onTransitionReady(go/retraceme 691c0b649c5b78e8be353184a2cf4f8453b1bbeba9558d5f9cdae4325458fb69:669)
TAG: 	at com.android.wm.shell.transition.Transitions$TransitionPlayerImpl.lambda$onTransitionReady$0(go/retraceme 691c0b649c5b78e8be353184a2cf4f8453b1bbeba9558d5f9cdae4325458fb69:1353)
TAG: 	at com.android.wm.shell.transition.Transitions$TransitionPlayerImpl.$r8$lambda$qsRfWn1ItrZqnFeABBdxU50jPc4(go/retraceme 691c0b649c5b78e8be353184a2cf4f8453b1bbeba9558d5f9cdae4325458fb69:0)
TAG: 	at com.android.wm.shell.transition.Transitions$TransitionPlayerImpl$$ExternalSyntheticLambda0.run(go/retraceme 691c0b649c5b78e8be353184a2cf4f8453b1bbeba9558d5f9cdae4325458fb69:0)
TAG: 	at android.os.Handler.handleCallback(Handler.java:958)
TAG: 	at android.os.Handler.dispatchMessage(Handler.java:99)
TAG: 	at android.os.Looper.loopOnce(Looper.java:205)
TAG: 	at android.os.Looper.loop(Looper.java:294)
TAG: 	at android.os.HandlerThread.run(HandlerThread.java:67)

代码路径:frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java

    private void playTransition(@NonNull ActiveTransition active) {ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Playing animation for %s", active);......// If a handler already chose to run this animation, try delegating to it first.if (active.mHandler != null) {ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " try firstHandler %s",active.mHandler);boolean consumed = active.mHandler.startAnimation(active.mToken, active.mInfo,active.mStartT, active.mFinishT, (wct, cb) -> onFinish(active, wct, cb));......}......  }

这里主要关注active.mHandler.startAnimation方法,是Transitions中TransitionHandler接口的方法
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
关键在这个startAnimation的实现,从代码上看在多处均有实现,常见的例如画中画(PipTranstion)、分屏(StageCoordinator)等。


http://www.ppmy.cn/server/107150.html

相关文章

golang笔记——Go堆内存管理

前言 本文主要记录个人学习Golang堆内存管理,涉及到的相关内容,算是对个人所学知识点的梳理与总结。从非常宏观的角度看,Go的堆内存管理就是下图这个样子 学习内存管理,肯定首先需要了解内存管理的基本知识,我会按照 内…

SpringBoot集成kafka-自定义拦截器(可以在拦截器中做记录日志、安全检查等操作)

TOC 1、kafka配置类 kafka配置类添加Configuration注解,springboot启动后会自动读取该配置类;由于在application.yml文件中我们找不到kafak拦截器相关的配置项,因此需要自定义拦截器;消费者相关配置方法中添加自定义拦截器配置&a…

解锁2024音乐新玩法!3款剪辑神器在手,专属BGM创作从此不再难!

嘿,音乐爱好者们,是不是在找那种一听就爱上的背景音乐时感到头疼?每次音乐剪辑时,是不是希望自己能像大师一样,轻松创作出动人的旋律?别担心,到了2024年,我们有了超级工具&#xff0…

Spring核心概念复习AOP

Spring的AOP概念 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它允许开发者将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,以提高代码的可重用性、可维护性和可扩展性 。AOP 作为 OOP(面向对象编程)的补充,通过动态代理技术,在程序…

实际项目中Gson的用法,解析对象嵌套list对象的问题

问题&#xff1a; 在实际项目中&#xff0c;遇到list<Object>嵌套list<Object>的参数结构&#xff0c;需要解析这种数据&#xff0c;发现用fastjosn怎么也解析不了&#xff0c;后俩想到了Gson&#xff0c;没想到真能解决这个问题。 json字符串结构 对象里面循环嵌…

【JavaScript】JavaScript模块化开发:ES6模块与CommonJs的对比与应用

1. 模块化开发的背景与必要性 1.1 JavaScript发展与模块化需求 JavaScript最初被设计为一种简单的脚本语言&#xff0c;用于实现网页上的交互功能。随着互联网技术的发展&#xff0c;Web应用变得越来越复杂&#xff0c;JavaScript代码量急剧增加&#xff0c;这导致了代码维护…

内存管理篇-13slab、slob和slub分配器

---这里讲得还不是很细节。需要结合其他资源和源码分析。 1.实现机制和介绍 slab机制是对伙伴系统的补充和改进&#xff0c;主要是因为伙伴系统的粒度最小是页&#xff0c;需要进一步细化粒度&#xff0c;因此引入了slab机制。slab机制从伙伴系统统申请到页后&#xff0c;进行…