From 4ffc3180121b36eec2577b3c311ad4da44c3af56 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Wed, 4 May 2016 15:06:02 -0700 Subject: [PATCH] Debug traces to facilitate screen timeout debugging bug: 27522448 Change-Id: I4d51be316e4aedecffb7001126849d7c6136d517 --- core/java/android/view/ViewRootImpl.java | 9 ++++++++ .../server/wm/WindowManagerDebugConfig.java | 3 +++ .../server/wm/WindowManagerService.java | 21 +++++++++++++++++++ .../server/wm/WindowSurfacePlacer.java | 21 +++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index edf05ba5fc33c..24ec2faeea46c 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -562,6 +562,11 @@ public final class ViewRootImpl implements ViewParent, } attrs = mWindowAttributes; setTag(); + + if ((mClientWindowLayoutFlags&WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) != 0 + && (attrs.flags&WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) == 0) { + Slog.d(mTag, "setView: FLAG_KEEP_SCREEN_ON changed from true to false!!!"); + } // Keep track of the actual window flags supplied by the client. mClientWindowLayoutFlags = attrs.flags; @@ -889,6 +894,10 @@ public final class ViewRootImpl implements ViewParent, final int oldInsetBottom = mWindowAttributes.surfaceInsets.bottom; final int oldSoftInputMode = mWindowAttributes.softInputMode; final boolean oldHasManualSurfaceInsets = mWindowAttributes.hasManualSurfaceInsets; + if ((mClientWindowLayoutFlags&WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) != 0 + && (attrs.flags&WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) == 0) { + Slog.d(mTag, "setLayoutParams: FLAG_KEEP_SCREEN_ON from true to false!!!"); + } // Keep track of the actual window flags supplied by the client. mClientWindowLayoutFlags = attrs.flags; diff --git a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java index 0979cd32a1e28..5d3cc1694e29c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java +++ b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java @@ -73,4 +73,7 @@ public class WindowManagerDebugConfig { static final boolean SHOW_LIGHT_TRANSACTIONS = false || SHOW_TRANSACTIONS; static final boolean SHOW_STACK_CRAWLS = false; static final boolean DEBUG_WINDOW_CROP = false; + + static final String TAG_KEEP_SCREEN_ON = "DebugKeepScreenOn"; + static final boolean DEBUG_KEEP_SCREEN_ON = true; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index dfe44213499da..4d2e49fd22ef9 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -221,6 +221,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT_METHOD; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEYGUARD; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_RESIZE; @@ -240,6 +241,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_STACK_CRAWLS; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_VERBOSE_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING; @@ -509,6 +511,10 @@ public class WindowManagerService extends IWindowManager.Stub boolean mShowingBootMessages = false; boolean mBootAnimationStopped = false; + // Following variables are for debugging screen wakelock only. + WindowState mLastWakeLockHoldingWindow = null; + WindowState mLastWakeLockObscuringWindow = null; + /** Dump of the windows and app tokens at the time of the last ANR. Cleared after * LAST_ANR_LIFETIME_DURATION_MSECS */ String mLastANRState; @@ -9275,9 +9281,21 @@ public class WindowManagerService extends IWindowManager.Stub final boolean state = mHoldingScreenWakeLock.isHeld(); if (hold != state) { if (hold) { + if (DEBUG_KEEP_SCREEN_ON) { + Slog.d(TAG_KEEP_SCREEN_ON, "Acquiring screen wakelock due to " + + mWindowPlacerLocked.mHoldScreenWindow); + } + mLastWakeLockHoldingWindow = mWindowPlacerLocked.mHoldScreenWindow; + mLastWakeLockObscuringWindow = null; mHoldingScreenWakeLock.acquire(); mPolicy.keepScreenOnStartedLw(); } else { + if (DEBUG_KEEP_SCREEN_ON) { + Slog.d(TAG_KEEP_SCREEN_ON, "Releasing screen wakelock, obscured by " + + mWindowPlacerLocked.mObsuringWindow); + } + mLastWakeLockHoldingWindow = null; + mLastWakeLockObscuringWindow = mWindowPlacerLocked.mObsuringWindow; mPolicy.keepScreenOnStoppedLw(); mHoldingScreenWakeLock.release(); } @@ -10208,6 +10226,9 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(mLastFinishedFreezeSource); } pw.println(); + pw.print(" mLastWakeLockHoldingWindow=");pw.print(mLastWakeLockHoldingWindow); + pw.print(" mLastWakeLockObscuringWindow="); pw.print(mLastWakeLockObscuringWindow); + pw.println(); mInputMonitor.dump(pw, " "); diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index a45ae60026920..49082980acbc4 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -32,8 +32,10 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMEN import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.H.DO_TRAVERSAL; @@ -131,6 +133,12 @@ class WindowSurfacePlacer { private boolean mSustainedPerformanceModeEnabled = false; private boolean mSustainedPerformanceModeCurrent = false; + // Following variables are for debugging screen wakelock only. + // Last window that requires screen wakelock + WindowState mHoldScreenWindow = null; + // Last window that obscures all windows below + WindowState mObsuringWindow = null; + private static final class LayerAndToken { public int layer; public AppWindowToken token; @@ -287,6 +295,8 @@ class WindowSurfacePlacer { } mHoldScreen = null; + mHoldScreenWindow = null; + mObsuringWindow = null; mScreenBrightness = -1; mButtonBrightness = -1; mUserActivityTimeout = -1; @@ -1424,12 +1434,21 @@ class WindowSurfacePlacer { // This window completely covers everything behind it, // so we want to leave all of them as undimmed (for // performance reasons). + if (!mObscured) { + mObsuringWindow = w; + } + mObscured = true; } if (w.mHasSurface) { if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { mHoldScreen = w.mSession; + mHoldScreenWindow = w; + } else if (DEBUG_KEEP_SCREEN_ON && w == mService.mLastWakeLockHoldingWindow) { + Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w + " was holding " + + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!! called by" + + Debug.getCallers(10)); } if (!mSyswin && w.mAttrs.screenBrightness >= 0 && mScreenBrightness < 0) { @@ -1685,5 +1704,7 @@ class WindowSurfacePlacer { public void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.print("mTraversalScheduled="); pw.println(mTraversalScheduled); + pw.print(prefix); pw.print("mHoldScreenWindow="); pw.println(mHoldScreenWindow); + pw.print(prefix); pw.print("mObsuringWindow="); pw.println(mObsuringWindow); } }