小工具知识网

当前位置: 首页 > 行业知识 > Android 14 transtion 动画流程

行业知识

Android 14 transtion 动画流程

2026-11-09 06:23:09 来源:互联网转载

1.接口

shell入口通过TransitionPlayerImpl与wm cindex.php/tags-1038.html" >ore 通信

   @BinderThread    private class TransitionPlayerImpl extends ITransitionPlayer.Stub {        @Override        public void onTransitionReady(IBinder iBinder, TransitionInfo transitionInfo,                SurfaceControl.Transaction t, SurfaceControl.Transaction finishT)                throws RemoteException {            mMainExecutor.execute(() -> Transitions.this.onTransitionReady(                    iBinder, transitionInfo, t, finishT));        }         @Override        public void requestStartTransition(IBinder iBinder,                TransitionRequestInfo request) throws RemoteException {            mMainExecutor.execute(() -> Transitions.this.requestStartTransition(iBinder, request));        }    }}
分为1. requestStartTransition2.onTransitionReady两个阶段1.requestStartTransitionwm servicesnew 一个动画放进mActiveSyncs中04-23 18:43:25.195 2077 4588 D jinyanmeiainima: BLASTSyncEngine startSyncSet s.mSyncId:604-23 18:43:25.195 2077 4588 D jinyanmeiainima: BLASTSyncEngine startSyncSet s:com.android.server.wm.BLASTSyncEngine$SyncGroup@3ee853104-23 18:43:25.195 2077 4588 D jinyanmeiainima: BLASTSyncEngine startSyncSet mActiveSyncs++++:004-23 18:43:25.196 2077 4588 D jinyanmeiainima: BLASTSyncEngine startSyncSet mActiveSyncs---:104-23 18:43:25.196 2077 4588 D jinyanmeiainima: java.lang.RuntimeException: jinyanmeiainima04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.BLASTSyncEngine.startSyncSet(BLASTSyncEngine.java:327)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.BLASTSyncEngine.startSyncSet(BLASTSyncEngine.java:305)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.Transition.startCollecting(Transition.java:422)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.TransitionController.moveToCollecting(TransitionController.java:222)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.TransitionController.moveToCollecting(TransitionController.java:203)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.TransitionController.createTransition(TransitionController.java:197)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.TransitionController.createTransition(TransitionController.java:179)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.ActivityTaskSupervisor.findTaskToMoveToFront(ActivityTaskSupervisor.java:1577)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.ActivityTaskManagerService.moveTaskToFrontLocked(ActivityTaskManagerService.java:2497)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.ActivityTaskSupervisor.startActivityFromRecents(ActivityTaskSupervisor.java:3034)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.ActivityTaskManagerService.startActivityFromRecents(ActivityTaskManagerService.java:1918)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1434)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at com.android.server.wm.ActivityTaskManagerService.onTransact(ActivityTaskManagerService.java:5840)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at android.os.Binder.execTransactInternal(Binder.java:1348)04-23 18:43:25.196 2077 4588 D jinyanmeiainima: at android.os.Binder.execTransact(Binder.java:1279)new出来后调用task.mTransitionController.collect(task);04-24 16:06:47.682 1815 2160 D jinyanmeiani: ChangeInfo 111111111 this:Task{fa5361 #69 type=standard A=10143:comgallery.home}04-24 16:06:47.682 1815 2160 D jinyanmeiani: ChangeInfo 111111111 mVisible:true04-24 16:06:47.682 1815 2160 D jinyanmeiani: ChangeInfo 111111111 mWindowingMode:504-24 16:06:47.682 1815 2160 D jinyanmeiani: java.lang.RuntimeException: jinyanmeiani04-24 16:06:47.682 1815 2160 D jinyanmeiani: at com.android.server.wm.Transition$ChangeInfo.(Transition.java:2258)04-24 16:06:47.682 1815 2160 D jinyanmeiani: at com.android.server.wm.Transition.collect(Transition.java:492)04-24 16:06:47.682 1815 2160 D jinyanmeiani: at com.android.server.wm.TransitionController.collect(TransitionController.java:568)04-24 16:06:47.682 1815 2160 D jinyanmeiani: at com.android.server.wm.ActivityTaskSupervisor.findTaskToMoveToFront(ActivityTaskSupervisor.java:1529)04-24 16:06:47.682 1815 2160 D jinyanmeiani: at com.android.server.wm.ActivityTaskManagerService.moveTaskToFrontLocked(ActivityTaskManagerService.java:2464)04-24 16:06:47.682 1815 2160 D jinyanmeiani: at com.android.server.wm.ActivityTaskSupervisor.startActivityFromRecents(ActivityTaskSupervisor.java:2901)04-24 16:06:47.682 1815 2160 D jinyanmeiani: at com.android.server.wm.ActivityTaskManagerService.startActivityFromRecents(ActivityTaskManagerService.java:1931)04-24 16:06:47.682 1815 2160 D jinyanmeiani: at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1430)04-24 16:06:47.682 1815 2160 D jinyanmeiani: at com.android.server.wm.ActivityTaskManagerService.onTransact(ActivityTaskManagerService.java:5786)04-24 16:06:47.682 1815 2160 D jinyanmeiani: at android.os.Binder.execTransactInternal(Binder.java:1348)04-24 16:06:47.682 1815 2160 D jinyanmeiani: at android.os.Binder.execTransact(Binder.java:1279)
/** @see Transition#collect */void collect(@NonNull WindowContainer wc) {    if (mCollectingTransition == null) return;    mCollectingTransition.collect(wc);}

计算所有的到mChanges

根据WindowContainer new 一个ChangeInfo

ChangeInfo(@NonNull WindowContainer origState) {    mContainer = origState;    mVisible = origState.isVisibleRequested();    mWindowingMode = origState.getWindowingMode();    mAbsoluteBounds.set(origState.getBounds());    mShowWallpaper = origState.showWallpaper();    mRotation = origState.getWindowConfiguration().getRotation();    mStartParent = origState.getParent();}

把changeinfo放入mChanges

mChanges是一个map

key:WindowContainer

value:由key:WindowContainer构成的ChangeInfo

此列表在开始做动画时候会判断里面的key,value是否满足做动画的条件

void collect(@NonNull WindowContainer wc) {      if (mState  
把new出来的动画申请开始动画requestStartTransition04-23 18:43:25.211 2077 4588 D jinyanmeiainima: requestStartTransition displayChange:04-23 18:43:25.211 2077 4588 D jinyanmeiainima: java.lang.RuntimeException: jinyanmeiainima04-23 18:43:25.211 2077 4588 D jinyanmeiainima: at com.android.server.wm.TransitionController.requestStartTransition(TransitionController.java:548)04-23 18:43:25.211 2077 4588 D jinyanmeiainima: at com.android.server.wm.ActivityTaskSupervisor.findTaskToMoveToFront(ActivityTaskSupervisor.java:1622)04-23 18:43:25.211 2077 4588 D jinyanmeiainima: at com.android.server.wm.ActivityTaskManagerService.moveTaskToFrontLocked(ActivityTaskManagerService.java:2497)04-23 18:43:25.211 2077 4588 D jinyanmeiainima: at com.android.server.wm.ActivityTaskSupervisor.startActivityFromRecents(ActivityTaskSupervisor.java:3034)04-23 18:43:25.211 2077 4588 D jinyanmeiainima: at com.android.server.wm.ActivityTaskManagerService.startActivityFromRecents(ActivityTaskManagerService.java:1918)04-23 18:43:25.211 2077 4588 D jinyanmeiainima: at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1434)04-23 18:43:25.211 2077 4588 D jinyanmeiainima: at com.android.server.wm.ActivityTaskManagerService.onTransact(ActivityTaskManagerService.java:5840)04-23 18:43:25.211 2077 4588 D jinyanmeiainima: at android.os.Binder.execTransactInternal(Binder.java:1348)04-23 18:43:25.211 2077 4588 D jinyanmeiainima: at android.os.Binder.execTransact(Binder.java:1279)
Transition requestStartTransition(@NonNull Transition transition, @Nullable Task startTask,        @Nullable RemoteTransition remoteTransition,        @Nullable TransitionRequestInfo.DisplayChange displayChange) {    Slog.d("jinyanmeiainima","requestStartTransition transition:" + transition );    Slog.d("jinyanmeiainima","requestStartTransition startTask:" + startTask );    Slog.d("jinyanmeiainima","requestStartTransition remoteTransition:" + remoteTransition );    Slog.d("jinyanmeiainima","requestStartTransition displayChange:" + displayChange );     if (mIsWaitingForDisplayEnabled) {        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Disabling player for transition"                + " #%d because display isn't enabled yet", transition.getSyncId());        transition.mIsPlayerEnabled = false;        transition.mLogger.mRequestTimeNs = SystemClock.uptimeNanos();        mAtm.mH.post(() -> mAtm.mWindowOrganizerController.startTransition(                transition.getToken(), null));        return transition;    }    if (mTransitionPlayer == null || transition.isAborted()) {        // Apparently, some tests will kill(and restart) systemui, so there is a chance that        // the player might be transiently null.        if (transition.isCollecting()) {            transition.abort();        }        return transition;    }    try {        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,                "Requesting StartTransition: %s", transition);        ActivityManager.RunningTaskInfo info = null;        if (startTask != null) {            info = new ActivityManager.RunningTaskInfo();            startTask.fillTaskInfo(info);        }        final TransitionRequestInfo request = new TransitionRequestInfo(                transition.mType, info, remoteTransition, displayChange);        transition.mLogger.mRequestTimeNs = SystemClock.elapsedRealtimeNanos();        transition.mLogger.mRequest = request;        Slog.d("jinyanmeiainima","requestStartTransition transition.getToken():" + transition.getToken() );        Slog.d("jinyanmeiainima","requestStartTransition               request:" + request);         Slog.d("jinyanmeiainima","requestStartTransition displayChange:" ,  new RuntimeException("jinyanmeiainima") );        mTransitionPlayer.requestStartTransition(transition.getToken(), request);        transition.setRemoteTransition(remoteTransition);    } catch (RemoteException e) {        Slog.e(TAG, "Error requesting transition", e);        transition.start();    }    return transition;}

转到shell:

Transition requestStartTransition(@NonNull Transition transition, @Nullable Task startTask,

requestStartTransition            mTransitionPlayer.requestStartTransition(transition.getToken(), request);            transition.setRemoteTransition(remoteTransition);

shell

   @BinderThread    private class TransitionPlayerImpl extends ITransitionPlayer.Stub {        @Override        public void onTransitionReady(IBinder iBinder, TransitionInfo transitionInfo,                SurfaceControl.Transaction t, SurfaceControl.Transaction finishT)                throws RemoteException {            mMainExecutor.execute(() -> Transitions.this.onTransitionReady(                    iBinder, transitionInfo, t, finishT));        }         @Override        public void requestStartTransition(IBinder iBinder,                TransitionRequestInfo request) throws RemoteException {            mMainExecutor.execute(() -> Transitions.this.requestStartTransition(iBinder, request));        }    }}
void requestStartTransition(@NonNull IBinder transitionToken,        @Nullable TransitionRequestInfo request) {    ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition requested: %s %s",            transitionToken, request);    if (isTransitionKnown(transitionToken)) {        throw new RuntimeException("Transition already started " + transitionToken);    }    final ActiveTransition active = new ActiveTransition();    WindowContainerTransaction wct = null;     // If we have sleep, we use a special handler and we try to finish everything ASAP.    if (request.getType() == TRANSIT_SLEEP) {        mSleepHandler.handleRequest(transitionToken, request);        active.mHandler = mSleepHandler;    } else {        for (int i = mHandlers.size() - 1; i >= 0; --i) {            wct = mHandlers.get(i).handleRequest(transitionToken, request);            if (wct != null) {                active.mHandler = mHandlers.get(i);                break;            }        }        if (request.getDisplayChange() != null) {            TransitionRequestInfo.DisplayChange change = request.getDisplayChange();            if (change.getEndRotation() != change.getStartRotation()) {                // Is a rotation, so dispatch to all displayChange listeners                if (wct == null) {                    wct = new WindowContainerTransaction();                }                mDisplayController.getChangeController().dispatchOnDisplayChange(wct,                        change.getDisplayId(), change.getStartRotation(),                        change.getEndRotation(), null /* newDisplayAreaInfo */);            }        }    }    mOrganizer.startTransition(transitionToken, wct != null && wct.isEmpty() ? null : wct);    active.mToken = transitionToken;    // Currently, WMCore only does one transition at a time. If it makes a requestStart, it    // is already collecting that transition on core-side, so it will be the next one to    // become ready. There may already be pending transitions added as part of direct    // `startNewTransition` but if we have a request now, it means WM created the request    // transition before it acknowledged any of the pending `startNew` transitions. So, insert    // it at the front.    mPendingTransitions.add(0, active);  // 添加到mPendingTransitions}
private static final class ActiveTransition {    IBinder mToken;    TransitionHandler mHandler;    boolean mAborted;    TransitionInfo mInfo;    SurfaceControl.Transaction mStartT;    SurfaceControl.Transaction mFinishT;     /** Ordered list of transitions which have been merged into this one. */    private ArrayList mMerged;}
转到wm core04-23 18:43:22.342 2980 3221 D jinyanmeiainima: WindowOrganizer transitionToken transitionToken:android.os.BinderProxy@3268f304-23 18:43:22.343 2980 3221 D jinyanmeiainima: WindowOrganizer startTransition t:null04-23 18:43:22.343 2980 3221 D jinyanmeiainima: java.lang.RuntimeException: jinyanmeiainima04-23 18:43:22.343 2980 3221 D jinyanmeiainima: at android.window.WindowOrganizer.startTransition(WindowOrganizer.java:112)04-23 18:43:22.343 2980 3221 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions.requestStartTransition(Transitions.java:891)04-23 18:43:22.343 2980 3221 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions$TransitionPlayerImpl.lambda$requestStartTransition(Transitions.java:1129)04-23 18:43:22.343 2980 3221 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions$TransitionPlayerImpl.$r8$lambda$FkH1M0vUh3zDx8R5iMruInPEXLI(Unknown Source:0)04-23 18:43:22.343 2980 3221 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions$TransitionPlayerImpl$$ExternalSyntheticLambda1.run(Unknown Source:6)04-23 18:43:22.343 2980 3221 D jinyanmeiainima: at android.os.Handler.handleCallback(Handler.java:958)04-23 18:43:22.343 2980 3221 D jinyanmeiainima: at android.os.Handler.dispatchMessage(Handler.java:99)04-23 18:43:22.343 2980 3221 D jinyanmeiainima: at android.os.Looper.loopOnce(Looper.java:216)04-23 18:43:22.343 2980 3221 D jinyanmeiainima: at android.os.Looper.loop(Looper.java:305)04-23 18:43:22.343 2980 3221 D jinyanmeiainima: at android.os.HandlerThread.run(HandlerThread.java:67)
 WindowOrganizer.java@RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)   public void startTransition(@NonNull IBinder transitionToken,           @Nullable WindowContainerTransaction t) {       try {           getWindowOrganizerController().startTransition(transitionToken, t);       } catch (RemoteException e) {           throw e.rethrowFromSystemServer();       }   }
转到 wm servicesWindowOrganizerController
WindowOrganizerController.java   private IBinder startTransition(@WindowManager.TransitionType int type,            @Nullable IBinder transitionToken, @Nullable WindowContainerTransaction t) {        enforceTaskPermission("startTransition()");        final CallerInfo caller = new CallerInfo();        final long ident = Binder.clearCallingIdentity();        try {            synchronized (mGlobalLock) {                Transition transition = Transition.fromBinder(transitionToken);                if (mTransitionController.getTransitionPlayer() == null && transition == null) {                    Slog.w(TAG, "Using shell transitions API for legacy transitions.");                    if (t == null) {                        throw new IllegalArgumentException("Can't use legacy transitions in"                                + " compatibility mode with no WCT.");                    }                    applyTransaction(t, -1 /* syncId */, null, caller);                    return null;                }                // In cases where transition is already provided, the "readiness lifecycle" of the                // transition is determined outside of this transaction. However, if this is a                // direct call from shell, the entire transition lifecycle is contained in the                // provided transaction and thus we can setReady immediately after apply.                final boolean needsSetReady = transition == null && t != null;                final WindowContainerTransaction wct =                        t != null ? t : new WindowContainerTransaction();                if (transition == null) {                    if (type  mTransitionController.moveToCollecting(nextTransition),                                () -> {                                    nextTransition.start();                                    applyTransaction(wct, -1 /*syncId*/, nextTransition, caller);                                    if (needsSetReady) {                                        nextTransition.setAllReady();                                    }                                });                        return nextTransition.getToken();                    }                    transition = mTransitionController.createTransition(type);                }                if (!transition.isCollecting() && !transition.isForcePlaying()) {                    Slog.e(TAG, "Trying to start a transition that isn't collecting. This probably"                            + " means Shell took too long to respond to a request. WM State may be"                            + " incorrect now, please file a bug");                    applyTransaction(wct, -1 /*syncId*/, null /*transition*/, caller);                    return transition.getToken();                }                transition.start();  /到这里                transition.mLogger.mStartWCT = wct;                applyTransaction(wct, -1 /*syncId*/, transition, caller);                if (needsSetReady) {                    transition.setAllReady();                }                return transition.getToken();            }        } finally {            Binder.restoreCallingIdentity(ident);        }    }

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: BLASTSyncEngine setReady ready:true

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: java.lang.RuntimeException: setReady

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at com.android.server.wm.BLASTSyncEngine$SyncGroup.setReady(BLASTSyncEngine.java:240)

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at com.android.server.wm.BLASTSyncEngine$SyncGroup.-$$Nest$msetReady(Unknown Source:0)

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at com.android.server.wm.BLASTSyncEngine.setReady(BLASTSyncEngine.java:356)

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at com.android.server.wm.Transition.applyReady(Transition.java:657)

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at com.android.server.wm.Transition.start(Transition.java:446)

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at com.android.server.wm.WindowOrganizerController.startTransition(WindowOrganizerController.java:335)

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at com.android.server.wm.WindowOrganizerController.startTransition(WindowOrganizerController.java:267)

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at android.window.IWindowOrganizerController$Stub.onTransact(IWindowOrganizerController.java:264)

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at com.android.server.wm.WindowOrganizerController.onTransact(WindowOrganizerController.java:185)

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at android.os.Binder.execTransactInternal(Binder.java:1343)

04-23 18:44:02.186 2107 2323 D jinyanmeiainima: at android.os.Binder.execTransact(Binder.java:1279)

然后调用到BLASTSyncEngine setReady 将动画状态置为ready

开始刷新

  BLASTSyncEngine.java     private void setReady(boolean ready) {             if (mReady == ready) {                return;            }            Slog.d("jinyanmeiainima","BLASTSyncEngine setReady              ready:" + ready, new RuntimeException("setReady"));             ProtoLog.v(WM_DEBUG_SYNC_ENGINE, "SyncGroup %d: Set ready", mSyncId);            mReady = ready;            if (!ready) return;            mWm.mWindowPlacerLocked.requestTraversal();        }
private static final class ActiveTransition {    IBinder mToken;    TransitionHandler mHandler;    boolean mAborted;    TransitionInfo mInfo;    SurfaceControl.Transaction mStartT;    SurfaceControl.Transaction mFinishT;     /** Ordered list of transitions which have been merged into this one. */    private ArrayList mMerged;}

onTransactionReady阶段

2.1 数据准备,筛选要做动画的对象

刷新时调用到 wm services. onTransactionReady 

04-23 18:43:22.529 2073 2100 D jinyanmeiainima: Transition onTransactionReady mToken:Token{a674b32 TransitionRecord{d9c7094 id=6 type=TO_FRONT flags=0}}04-23 18:43:22.529 2073 2100 D jinyanmeiainima: Transition onTransactionReady info:{t=TO_FRONT f=0x0 ro=Point(0, 0) c=[{WCT{RemoteToken{2a5ead1 Task{c299c5e #39 type=standard A=10245:com..notes}}} m=SHOW f=TRANSLUCENT leash=Surface(name=Task=39)/@0x2c4c3d4 sb=Rect(0, 0 - 1800, 2880) eb=Rect(799, 141 - 1759, 1848) eo=Point(799, 141)}]}04-23 18:43:22.529 2073 2100 D jinyanmeiainima: Transition onTransactionReady transaction:android.view.SurfaceControl$Transaction@65dbba04-23 18:43:22.529 2073 2100 D jinyanmeiainima: Transition onTransactionReady mFinishTransaction:android.view.SurfaceControl$Transaction@2d6a6b04-23 18:43:22.529 2073 2100 D jinyanmeiainima: java.lang.RuntimeException: jinyanmeiainima04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.Transition.onTransactionReady(Transition.java:1215)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.BLASTSyncEngine$SyncGroup.finishNow(BLASTSyncEngine.java:206) //这里会从队列移除04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.BLASTSyncEngine$SyncGroup.onSurfacePlacement(BLASTSyncEngine.java:148)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.BLASTSyncEngine$SyncGroup.-$$Nest$monSurfacePlacement(Unknown Source:0)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.BLASTSyncEngine.onSurfacePlacement(BLASTSyncEngine.java:382)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:893)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:836)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:200)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:149)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:138)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:80)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at android.os.Handler.handleCallback(Handler.java:958)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at android.os.Handler.dispatchMessage(Handler.java:99)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at android.os.Looper.loopOnce(Looper.java:216)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at android.os.Looper.loop(Looper.java:305)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at android.os.HandlerThread.run(HandlerThread.java:67)04-23 18:43:22.529 2073 2100 D jinyanmeiainima: at com.android.server.ServiceThread.run(ServiceThread.java:46)
BLASTSyncEngine.javaprivate void finishNow() {            mActiveSyncs.remove(mSyncId); //从队列移除 }

Transition.onTransactionReady

mTargets = calculateTargets(mParticipants, mChanges); //计算mTargets

根据target 计算info

final TransitionInfo info = calculateTransitionInfo(mType, mFlags, mTargets, transaction);

Transition.javapublic void onTransactionReady(int syncId, SurfaceControl.Transaction transaction) {             final ArrayMap mChanges = new ArrayMap(); //这里的mChanges 也是一个map         mTargets = calculateTargets(mParticipants, mChanges);        final TransitionInfo info = calculateTransitionInfo(mType, mFlags, mTargets, transaction);                        mController.getTransitionPlayer().onTransitionReady(                        mToken, info, transaction, mFinishTransaction);                if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {                    Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, TRACE_NAME_PLAY_TRANSITION,                 }

wm.services.Transition.calculateTargets

两个条件不添加动画:

1:!wc.isAttached()

2:!changeInfo.hasChanged()

将符合条件的changeInfo添加到targets 返回

@VisibleForTesting@NonNullstatic ArrayList calculateTargets(ArraySet participants,        ArrayMap changes) {    ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,            "Start calculating TransitionInfo based on participants: %s", participants);     // Add all valid participants to the target container.    final Targets targets = new Targets();    for (int i = participants.size() - 1; i >= 0; --i) {        final WindowContainer wc = participants.valueAt(i);        if (!wc.isAttached()) {                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,                    "  Rejecting as detached: %s", wc);            continue;        }        // The level of transition target should be at least window token.        if (wc.asWindowState() != null) continue;         final ChangeInfo changeInfo = changes.get(wc); // changes即mChanges,由onTransitionReady时添加到changes 的map //这里的changeInfo 与TransitionInfo不是一个         // Reject no-ops        if (!changeInfo.hasChanged()) {            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,                    "  Rejecting as no-op: %s", wc);            continue;        }        targets.add(changeInfo);    }    ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "  Initial targets: %s",            targets.mArray);    // Combine the targets from bottom to top if possible.    tryPromote(targets, changes);    // Establish the relationship between the targets and their top changes.    populateParentChanges(targets, changes);     final ArrayList targetList = targets.getListSortedByZ();    ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "  Final targets: %s", targetList);    return targetList;}
boolean hasChanged() {         // the task including transient launch must promote to root task         if ((mFlags & ChangeInfo.FLAG_TRANSIENT_LAUNCH) != 0                 || (mFlags & ChangeInfo.FLAG_ABOVE_TRANSIENT_LAUNCH) != 0) {             return true;         }         // If it's invisible and hasn't changed visibility, always return false since even if         // something changed, it wouldn't be a visible change.         final boolean currVisible = mContainer.isVisibleRequested();         if (currVisible == mVisible && !mVisible) return false;         return currVisible != mVisible                 || mKnownConfigChanges != 0                 // if mWindowingMode is 0, this container wasn't attached at collect time, so                 // assume no change in windowing-mode.                 || (mWindowingMode != 0 && mContainer.getWindowingMode() != mWindowingMode)                 || !mContainer.getBounds().equals(mAbsoluteBounds)                 || mRotation != mContainer.getWindowConfiguration().getRotation();     }

根据上步计算出来的sortedTargets计算要做的动画TransitionInfo

TransitionInfo中有个mChanges

public final class TransitionInfo implements Parcelable {     /**     * Modes are only a sub-set of all the transit-types since they are per-container     * @hide     */    @IntDef(prefix = { "TRANSIT_" }, value = {            TRANSIT_NONE,            TRANSIT_OPEN,            TRANSIT_CLOSE,            // Note: to_front/to_back really mean show/hide respectively at the container level.            TRANSIT_TO_FRONT,            TRANSIT_TO_BACK,            TRANSIT_CHANGE    })    public @interface TransitionMode {}    private final ArrayList mChanges = new ArrayList();
public static final class Change implements Parcelable {    private final WindowContainerToken mContainer;    private WindowContainerToken mParent;    private WindowContainerToken mLastParent;    private final SurfaceControl mLeash;    private @TransitionMode int mMode = TRANSIT_NONE;    private @ChangeFlags int mFlags = FLAG_NONE;    private final Rect mStartAbsBounds = new Rect();    private final Rect mEndAbsBounds = new Rect();    private final Point mEndRelOffset = new Point();    private ActivityManager.RunningTaskInfo mTaskInfo = null;    private boolean mAllowEnterPip;    private @Surface.Rotation int mStartRotation = ROTATION_UNDEFINED;    private @Surface.Rotation int mEndRotation = ROTATION_UNDEFINED;    /**     * The end rotation of the top activity after fixed rotation is finished. If the top     * activity is not in fixed rotation, it will be {@link ROTATION_UNDEFINED}.     */    private @Surface.Rotation int mEndFixedRotation = ROTATION_UNDEFINED;    private int mRotationAnimation = ROTATION_ANIMATION_UNSPECIFIED;    private @ColorInt int mBackgroundColor;    private SurfaceControl mSnapshot = null;    private float mSnapshotLuma;
static TransitionInfo calculateTransitionInfo(@TransitionType int type, int flags,        ArrayList sortedTargets,        @Nullable SurfaceControl.Transaction startT) {    final TransitionInfo out = new TransitionInfo(type, flags);  //根据type 和flags 构建新的TransitionInfo 对象     WindowContainer topApp = null;    for (int i = 0; i  

2.2 开始动画

到shell.onTransitionReady

@BinderThreadprivate class TransitionPlayerImpl extends ITransitionPlayer.Stub {    @Override    public void onTransitionReady(IBinder iBinder, TransitionInfo transitionInfo,            SurfaceControl.Transaction t, SurfaceControl.Transaction finishT)            throws RemoteException {        mMainExecutor.execute(() -> Transitions.this.onTransitionReady(                iBinder, transitionInfo, t, finishT));    }     @Override    public void requestStartTransition(IBinder iBinder,            TransitionRequestInfo request) throws RemoteException {        mMainExecutor.execute(() -> Transitions.this.requestStartTransition(iBinder, request));    }}
void onTransitionReady(@NonNull IBinder transitionToken, @NonNull TransitionInfo info,            @NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl.Transaction finishT) {        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "onTransitionReady %s: %s",                transitionToken, info);        final int activeIdx = findByToken(mPendingTransitions, transitionToken);        if (activeIdx  activeTransition.mToken).toArray()));        }        if (activeIdx > 0) {            Log.e(TAG, "Transition became ready out-of-order " + transitionToken + ". Expected"                    + " order: " + Arrays.toString(mPendingTransitions.stream().map(                            activeTransition -> activeTransition.mToken).toArray()));        }        // Move from pending to ready        final ActiveTransition active = mPendingTransitions.remove(activeIdx);//从 mPendingTransitions 移除        mReadyTransitions.add(active); //添加至 mReadyTransitions        active.mInfo = info;        active.mStartT = t;        active.mFinishT = finishT;         for (int i = 0; i  0) {                if (!info.getRootLeash().isValid()) {                    // Shell has some debug settings which makes calling binders with invalid                    // surfaces crash, so replace it with a "real" one.                    info.setRootLeash(new SurfaceControl.Builder().setName("Invalid")                            .setContainerLayer().build(), 0, 0);                }                // Sleep starts a process of forcing all prior transitions to finish immediately                finishForSleep(null /* forceFinish */);                return;            }        }         // Allow to notify keyguard un-occluding state to KeyguardService, which can happen while        // screen-off, so there might no visibility change involved.        if (!info.getRootLeash().isValid() && info.getType() != TRANSIT_KEYGUARD_UNOCCLUDE) {            // Invalid root-leash implies that the transition is empty/no-op, so just do            // housekeeping and return.            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Invalid root leash (%s): %s",                    transitionToken, info);            onAbort(active);            return;        }         final int changeSize = info.getChanges().size(); //找到带有change的info        boolean taskChange = false;        boolean transferStartingWindow = false;        boolean allOccluded = changeSize > 0;        for (int i = changeSize - 1; i >= 0; --i) {            final TransitionInfo.Change change = info.getChanges().get(i);            taskChange |= change.getTaskInfo() != null;            transferStartingWindow |= change.hasFlags(FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT);            if (!change.hasFlags(FLAG_IS_OCCLUDED)) {                allOccluded = false;            }        }        // There does not need animation when:        // A. Transfer starting window. Apply transfer starting window directly if there is no other        // task change. Since this is an activity->activity situation, we can detect it by selecting        // transitions with only 2 changes where neither are tasks and one is a starting-window        // recipient.        if (!taskChange && transferStartingWindow && changeSize == 2                // B. It's visibility change if the TRANSIT_TO_BACK/TO_FRONT happened when all                // changes are underneath another change.                || ((info.getType() == TRANSIT_TO_BACK || info.getType() == TRANSIT_TO_FRONT)                && allOccluded)) {            // Treat this as an abort since we are bypassing any merge logic and effectively            // finishing immediately.            onAbort(active);            return;        }         setupStartState(active.mInfo, active.mStartT, active.mFinishT);    //开始置状态         if (mReadyTransitions.size() > 1) {            // There are already transitions waiting in the queue, so just return.            return;        }        processReadyQueue();  //开始动画    }
04-23 18:44:02.339 2107 2246 D jinyanmeiainima: BLASTSyncEngine finishNow s.mSyncId:504-23 18:44:02.339 2107 2246 D jinyanmeiainima: BLASTSyncEngine finishNow mActiveSyncs++++:104-23 18:44:02.339 2107 2246 D jinyanmeiainima: BLASTSyncEngine finishNow s.mSyncId:504-23 18:44:02.339 2107 2246 D jinyanmeiainima: BLASTSyncEngine finishNow mActiveSyncs++++:004-23 18:44:02.347 3002 3197 D jinyanmeiainima: startAnimation TRANSIT_CHANGE:04-23 18:44:02.347 3002 3197 D jinyanmeiainima: java.lang.RuntimeException: jinyanmeiainima04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions.dispatchTransition(Transitions.java:708)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions.playTransition(Transitions.java:693)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions.processReadyQueue(Transitions.java:627)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions.onTransitionReady(Transitions.java:600)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions$TransitionPlayerImpl.lambda$onTransitionReady
implements Transitions.TransitionHandler 的对象都会调用到startAnimation
(Transitions.java:1122)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions$TransitionPlayerImpl.$r8$lambda$qsRfWn1ItrZqnFeABBdxU50jPc4(Unknown Source:0)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at com.android.wm.shell.transition.Transitions$TransitionPlayerImpl$$ExternalSyntheticLambda0.run(Unknown Source:10)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at android.os.Handler.handleCallback(Handler.java:958)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at android.os.Handler.dispatchMessage(Handler.java:99)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at android.os.Looper.loopOnce(Looper.java:216)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at android.os.Looper.loop(Looper.java:305)04-23 18:44:02.347 3002 3197 D jinyanmeiainima: at android.os.HandlerThread.run(HandlerThread.java:67)

然后各个继承于

走各个业务动画逻辑

上一篇:易语言源码深度解析,探索编程问道之路

下一篇:华为服务器怎么选配置?