Keyguard

31 篇文章 1 订阅

 

frameworks\base\core\java\com\android\internal\policy\IKeyguardService.aidl

 

frameworks\base\core\java\com\android\internal\policy\IKeyguardDrawnCallback.aidl

 

oneway interface IKeyguardDrawnCallback {
    void onDrawn();
}

 

 

 

 

frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\KeyguardViewMediator.java

 

* Mediates requests related to the keyguard.  This includes queries about the
* state of the keyguard, power management events that effect whether the keyguard
* should be shown or reset, callbacks to the phone window manager to notify
* it of when the keyguard is showing, and events from the keyguard view itself
* stating that the keyguard was succesfully unlocked.

 

 

 

.....

 

frameworks\base\packages\Keyguard\src\com\android\keyguard\KeyguardUpdateMonitorCallback.java

 

/**
 * Callback for general information relevant to lock screen.
 */
public class KeyguardUpdateMonitorCallback {

 

 

 

 

frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\KeyguardService.java

 

public class KeyguardService extends Service {
    static final String TAG = "KeyguardService";
    static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD;

    private KeyguardViewMediator mKeyguardViewMediator;
    private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {}
 
 
private IKeyguardDrawnCallback mDrawnCallback;

private boolean mIsPerUserLock;

KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {

 

 

 

/**
 * Used to keep the device awake while to ensure the keyguard finishes opening before
 * we sleep.
 */
private PowerManager.WakeLock mShowKeyguardWakeLock;

private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;

 

 

 

 
 
KeyguardService 实现了IKeyguardService 客户端接口,其实是通过 mKeyguardViewMediator 对应接口实现的。
 
frameworks\base\packages\SystemUI\AndroidManifest.xml
 
<service
    android:name=".keyguard.KeyguardService"
    android:exported="true"
    android:enabled="@bool/config_enableKeyguardService" />
 
 

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarKeyguardViewManager.java

/**
 * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back
 * via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done,
 * which is in turn, reported to this class by the current
 * {@link com.android.keyguard.KeyguardViewBase}.
 */
public class StatusBarKeyguardViewManager implements RemoteInputController.Callback {

 

 

 

keyguad总界面布局:  super_status_bar.xml  

这里面有很对小的布局

 

对应的view  是

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarWindowView.java

 

手势码、PIN码等界面布局:

对应的view 是

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\KeyguardBouncer.java

 

 

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBar.java

createAndAddWindows();  会inflateStatusBarWindow ,会将StatusBarManagerService与其关联

 public void start() {

。。。

createAndAddWindows();

}

public void createAndAddWindows() {

        addStatusBarWindow();
    }

 


    private void addStatusBarWindow() {
        makeStatusBarView();
        mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
        mRemoteInputController = new RemoteInputController(mHeadsUpManager);
        mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight());

 

    }

 

 

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarWindowManager.java

    public void add(View statusBarView, int barHeight) {


        // Now that the status bar window encompasses the sliding panel and its
        // translucent backdrop, the entire thing is made TRANSLUCENT and is
        // hardware-accelerated.
        mLp = new WindowManager.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                barHeight,
                WindowManager.LayoutParams.TYPE_STATUS_BAR,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
                PixelFormat.TRANSLUCENT);
        mLp.token = new Binder();
        mLp.gravity = Gravity.TOP;
        mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
        mLp.setTitle("StatusBar");
        mLp.packageName = mContext.getPackageName();
        mStatusBarView = statusBarView;
        mBarHeight = barHeight;
        mWindowManager.addView(mStatusBarView, mLp);
        mLpChanged = new WindowManager.LayoutParams();
        mLpChanged.copyFrom(mLp);

    }

 

PRIVATE_FLAG_KEYGUARD

 

frameworks\base\services\core\java\com\android\server\statusbar\StatusBarManagerService.java

这个服务与StatusBar 对应的服务

 

keyguard 布局:

keyguard_status_bar.xml

对应的view 

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\KeyguardStatusBarView.java

对应的manager

 

/**
 * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back
 * via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done,
 * which is in turn, reported to this class by the current
 * {@link com.android.keyguard.KeyguardViewBase}.
 */
public class StatusBarKeyguardViewManager implements RemoteInputController.Callback {

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarKeyguardViewManager.java

 

创建keyguard ,这个是 super_status_bar.xml   布局中子布局status_bar_expanded  的子布局keyguard_status_bar 中的

mKeyguardStatusBar = (KeyguardStatusBarView) mStatusBarWindow.findViewById(R.id.keyguard_header);

 

上滑keyguard 界面,keyguard 消失调用堆栈:

 

调用函数


frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBar.java
    private void showBouncerIfKeyguard() {
        if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
            showBouncer();
        }
    }


    protected void showBouncer() {
        mWaitingForKeyguardExit = mStatusBarKeyguardViewManager.isShowing();
        mStatusBarKeyguardViewManager.dismiss();

    }

 

可以定制显示滑动解锁到 pin码界面显示导航栏时间

mMakeNavigationBarVisibleRunnable

 

Android O 之前

 

 

 

android O  

绘制   scheduleTraversals 调用

frameworks\base\core\java\android\view\ViewRootImpl.java

    void scheduleTraversals() {
        if("StatusBar".equals(mWindowAttributes.getTitle().toString())){
            Slog.d(mTag,"scheduleTraversals StatusBar");
        }
        if (!mTraversalScheduled) {
            mTraversalScheduled = true;
            mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
            if (ViewDebugManager.DEBUG_SCHEDULETRAVERSALS) {
                Log.v(mTag, "scheduleTraversals: mTraversalBarrier = " + mTraversalBarrier
                        + ",this = " + this, new Throwable("scheduleTraversals"));
            }
            mChoreographer.postCallback(
                    Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
            if (!mUnbufferedInputDispatch) {
                scheduleConsumeBatchedInput();
            }
            notifyRendererOfFramePending();
            pokeDrawLockIfNeeded();
        }

    }

 

分支 1:

frameworks\base\core\java\android\hardware\display\DisplayManagerGlobal.java

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case EVENT_DISPLAY_ADDED:
                    mListener.onDisplayAdded(msg.arg1);
                    break;
                case EVENT_DISPLAY_CHANGED:
                    mListener.onDisplayChanged(msg.arg1);
                    break;
                case EVENT_DISPLAY_REMOVED:
                    mListener.onDisplayRemoved(msg.arg1);
                    break;
            }
        }

    }

 

frameworks\base\core\java\android\view\ViewRootImpl.java

    private final DisplayListener mDisplayListener = new DisplayListener() {
        @Override
        public void onDisplayChanged(int displayId) {
            if (mView != null && mDisplay.getDisplayId() == displayId) {
                final int oldDisplayState = mAttachInfo.mDisplayState;
                final int newDisplayState = mDisplay.getState();
                if (oldDisplayState != newDisplayState) {
                    mAttachInfo.mDisplayState = newDisplayState;
                    pokeDrawLockIfNeeded();
                    if (oldDisplayState != Display.STATE_UNKNOWN) {
                        final int oldScreenState = toViewScreenState(oldDisplayState);
                        final int newScreenState = toViewScreenState(newDisplayState);
                        if (oldScreenState != newScreenState) {
                            mView.dispatchScreenStateChanged(newScreenState);
                        }
                        if (oldDisplayState == Display.STATE_OFF) {
                            // Draw was suppressed so we need to for it to happen here.
                            mFullRedrawNeeded = true;
                            scheduleTraversals();
                        }
                    }
                }
            }
        }

 

    void scheduleTraversals() {
        if (!mTraversalScheduled) {
            mTraversalScheduled = true;
            mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
            if (ViewDebugManager.DEBUG_SCHEDULETRAVERSALS) {
                Log.v(mTag, "scheduleTraversals: mTraversalBarrier = " + mTraversalBarrier
                        + ",this = " + this, new Throwable("scheduleTraversals"));
            }
            mChoreographer.postCallback(
                    Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
            if (!mUnbufferedInputDispatch) {
                scheduleConsumeBatchedInput();
            }
            notifyRendererOfFramePending();
            pokeDrawLockIfNeeded();
        }

    }

 

    final class TraversalRunnable implements Runnable {
        @Override
        public void run() {
            doTraversal();
        }
    }

    void doTraversal() {
        if (ViewDebugManager.DEBUG_LIFECYCLE || ViewDebugManager.DEBUG_ENG) {
            Log.v(mTag, "doTraversal: mTraversalScheduled = " + mTraversalScheduled + " mFisrt = "
                  + mFirst + ",mTraversalBarrier = " + mTraversalBarrier + ",this = " + this);
        }


        if (mTraversalScheduled) {
            mTraversalScheduled = false;
            mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);


            if (mProfile) {
                Debug.startMethodTracing("ViewAncestor");
            }


            performTraversals();


            if (mProfile) {
                Debug.stopMethodTracing();
                mProfile = false;
            }
        }

    }

 

 

分支 2:

frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\KeyguardService.java



        @Override // Binder interface
        public void onScreenTurningOn(IKeyguardDrawnCallback callback) {
            Trace.beginSection("KeyguardService.mBinder#onScreenTurningOn");
            checkPermission();
            mKeyguardViewMediator.onScreenTurningOn(callback);
            mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNING_ON);
            Trace.endSection();

        }

mKeyguardViewMediator.onScreenTurningOn(callback);==》

frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\KeyguardViewMediator.java

    public void onScreenTurningOn(IKeyguardDrawnCallback callback) {
        Trace.beginSection("KeyguardViewMediator#onScreenTurningOn");
        notifyScreenOn(callback);
        Trace.endSection();

    }

    private void notifyScreenOn(IKeyguardDrawnCallback callback) {
        if (DEBUG) Log.d(TAG, "notifyScreenOn");
        Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_TURNING_ON, callback);
        mHandler.sendMessage(msg);

    }

mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNING_ON);==》

frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\KeyguardLifecyclesDispatcher.java

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SCREEN_TURNING_ON:
                    mScreenLifecycle.dispatchScreenTurningOn();
                    break;
                case SCREEN_TURNED_ON:
                    mScreenLifecycle.dispatchScreenTurnedOn();

                    break;

 

frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\ScreenLifecycle.java

    public void dispatchScreenTurningOn() {
        setScreenState(SCREEN_TURNING_ON);
        dispatch(Observer::onScreenTurningOn);

    }

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBar.java

    ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() {
        @Override
        public void onScreenTurningOn() {
            mFalsingManager.onScreenTurningOn();
            mNotificationPanel.onScreenTurningOn();


            maybePrepareWakeUpFromAod();


            if (mLaunchCameraOnScreenTurningOn) {
                mNotificationPanel.launchCamera(false, mLastCameraLaunchSource);
                mLaunchCameraOnScreenTurningOn = false;
            }

        }

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\NotificationPanelView.java

public void onScreenTurningOn() {

        mKeyguardStatusView.refreshTime();
    }

com.android.keyguard.KeyguardStatusView.refreshTime(KeyguardStatusView.java:200)



01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: scheduleTraversals: mTraversalBarrier = 436,this = ViewRoot{c5a3c5b StatusBar,ident = 3}
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: java.lang.Throwable: scheduleTraversals
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.view.ViewRootImpl.scheduleTraversals(ViewRootImpl.java:1416)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1207)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.GridLayout.requestLayout(GridLayout.java:1098)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:360)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.TextView.checkForRelayout(TextView.java:8553)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.TextView.setText(TextView.java:5416)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.TextView.setText(TextView.java:5272)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.TextView.setText(TextView.java:5229)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.TextClock.onTimeChanged(TextClock.java:601)
01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.TextClock.setFormat12Hour(TextClock.java:312)

01-04 21:53:29.571177  1135  1135 V ViewRootImpl[StatusBar]: at com.android.keyguard.KeyguardStatusView.refreshTime(KeyguardStatusView.java:200)

 

 

分支3:

135  1135 D KeyguardViewMediator: handleNotifyScreenTurnedOn
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: scheduleTraversals: mTraversalBarrier = 441,this = ViewRoot{c5a3c5b StatusBar,ident = 3}
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: java.lang.Throwable: scheduleTraversals
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.view.ViewRootImpl.scheduleTraversals(ViewRootImpl.java:1416)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.view.ViewRootImpl.invalidate(ViewRootImpl.java:1227)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.view.ViewRootImpl.onDescendantInvalidated(ViewRootImpl.java:1221)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.view.ViewGroup.onDescendantInvalidated(ViewGroup.java:5811)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.view.ViewGroup.onDescendantInvalidated(ViewGroup.java:5811)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.view.ViewGroup.onDescendantInvalidated(ViewGroup.java:5811)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.view.ViewGroup.invalidateChild(ViewGroup.java:5829)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.view.View.invalidateInternal(View.java:15594)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.view.View.invalidate(View.java:15555)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.view.View.invalidate(View.java:15538)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.ImageView.invalidateDrawable(ImageView.java:281)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:450)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.graphics.drawable.VectorDrawable.setAlpha(VectorDrawable.java:377)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.ImageView.applyColorMod(ImageView.java:1561)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.ImageView.updateDrawable(ImageView.java:1017)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.widget.ImageView.setImageDrawable(ImageView.java:567)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at com.android.systemui.statusbar.KeyguardAffordanceView.setImageDrawable(KeyguardAffordanceView.java:148)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at com.android.systemui.statusbar.phone.LockIcon.update(LockIcon.java:181)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at com.android.systemui.statusbar.phone.LockIcon.update(LockIcon.java:120)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at com.android.systemui.statusbar.phone.LockIcon.setScreenOn(LockIcon.java:103)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at com.android.systemui.statusbar.phone.KeyguardBottomAreaView$4.onScreenTurnedOn(KeyguardBottomAreaView.java:767)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at com.android.keyguard.KeyguardUpdateMonitor.handleScreenTurnedOn(KeyguardUpdateMonitor.java:1174)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at com.android.keyguard.KeyguardUpdateMonitor.-wrap20(Unknown Source:0)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at com.android.keyguard.KeyguardUpdateMonitor$1.handleMessage(KeyguardUpdateMonitor.java:332)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.os.Handler.dispatchMessage(Handler.java:106)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.os.Looper.loop(Looper.java:164)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at android.app.ActivityThread.main(ActivityThread.java:6566)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at java.lang.reflect.Method.invoke(Native Method)
01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)

01-04 21:53:29.950334  1135  1135 V ViewRootImpl[StatusBar]: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)

frameworks\base\packages\SystemUI\src\com\android\keyguard\KeyguardUpdateMonitor.java

                case MSG_SCREEN_TURNED_ON:
                    handleScreenTurnedOn();

                    break;

 

    private void handleScreenTurnedOn() {
        final int count = mCallbacks.size();
        for (int i = 0; i < count; i++) {
            KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
            if (cb != null) {
                cb.onScreenTurnedOn();
            }
        }

    }

 

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\KeyguardBottomAreaView.java


                @Override
                public void onScreenTurnedOn() {
                    mLockIcon.setScreenOn(true);

                }

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\LockIcon.java

    public void setScreenOn(boolean screenOn) {
        mScreenOn = screenOn;
        update();

    }

 

分支 4:

01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: scheduleTraversals: mTraversalBarrier = 671,this = ViewRoot{81395ec com.android.launcher3/com.android.launcher3.Launcher,ident = 0mFrame=671}
01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: java.lang.Throwable: scheduleTraversals
01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: at android.view.ViewRootImpl.scheduleTraversals(ViewRootImpl.java:1416)
01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: at android.view.ViewRootImpl$1.onDisplayChanged(ViewRootImpl.java:1136)
01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.handleMessage(DisplayManagerGlobal.java:493)
01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: at android.os.Handler.dispatchMessage(Handler.java:106)
01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: at android.os.Looper.loop(Looper.java:164)
01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: at android.app.ActivityThread.main(ActivityThread.java:6566)
01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: at java.lang.reflect.Method.invoke(Native Method)
01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)

01-05 00:05:33.570  1647  1647 V ViewRootImpl[Launcher]: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)

 

 

 

mDisplayManager.registerDisplayListener(mDisplayListener, mHandler);

 

 

 

 

frameworks\base\core\java\android\view\ViewRootImpl.java

scheduleTraversals() 调用

 

=》 mChoreographer.postCallback(

                    Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);

 

    final class TraversalRunnable implements Runnable {
        @Override
        public void run() {
            doTraversal();
        }
    }

    final TraversalRunnable mTraversalRunnable = new TraversalRunnable();

 

    void doTraversal() {
        if (mTraversalScheduled) {
            mTraversalScheduled = false;
            mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);


            if (mProfile) {
                Debug.startMethodTracing("ViewAncestor");
            }


            performTraversals();


            if (mProfile) {
                Debug.stopMethodTracing();
                mProfile = false;
            }
        }
    }

 

https://www.jianshu.com/p/a65861e946cb

=>performTraversals()   中会执行

 performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
 performLayout(lp, mWidth, mHeight);

 performDraw()

 

=》performDraw()中执行

draw(fullRedrawNeeded);

pendingDrawFinished();或者postDrawFinished()

=》pendingDrawFinished(); 中执行

pendingDrawFinished();

->reportDrawFinished();

->mWindowSession.finishDrawing(mWindow);

 

或者

=>postDrawFinished() 中执行

->MSG_DRAW_FINISHED

->reportDrawFinished();

->mWindowSession.finishDrawing(mWindow);

 

 

frameworks\base\services\core\java\com\android\server\wm\Session.java    

    @Override
    public void finishDrawing(IWindow window) {
        if (WindowManagerService.localLOGV) Slog.v(
            TAG_WM, "IWindow finishDrawing called for " + window);
        mService.finishDrawingWindow(this, window);

    }

 

frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java

    void finishDrawingWindow(Session session, IWindow client) {
        final long origId = Binder.clearCallingIdentity();
        try {
            synchronized (mWindowMap) {
                WindowState win = windowForClientLocked(session, client, false);
                if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, "finishDrawingWindow: " + win + " mDrawState="
                        + (win != null ? win.mWinAnimator.drawStateToString() : "null"));
                if (win != null && win.mWinAnimator.finishDrawingLocked()) {
                    if ((win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
                        win.getDisplayContent().pendingLayoutChanges |=
                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
                    }
                    win.setDisplayLayoutNeeded();
                    mWindowPlacerLocked.requestTraversal();
                }
            }
        } finally {
            Binder.restoreCallingIdentity(origId);
        }
    }

 

==》 mWindowPlacerLocked.requestTraversal();

 

 

 

Android 5.1 Keyguard初识

https://blog.csdn.net/u013656135/article/details/49122205

 

 

View绘制流程及源码解析(一)——performTraversals()源码分析

https://www.jianshu.com/p/a65861e946cb

 

 

界面显示_视图Choreographer控制

https://www.jianshu.com/p/47c866f6fb67

 

Android Choreographer 源码分析

https://www.jianshu.com/p/6f2043570de4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值