Capture transaction traces before system reboot
Bug: 299937754
Test: bugreport - data/misc/wmtrace/systemRestart_transactions.winscope
Test: go/winscope
Change-Id: I3dddb937005972f1a6878f72a7aedb8a9876eb3c
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 1cd7d34..c3e045b 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -302,6 +302,7 @@
long desiredPresentTimeNanos);
private static native void nativeSetFrameTimeline(long transactionObj,
long vsyncId);
+ private static native void nativeNotifyShutdown();
/**
* Transforms that can be applied to buffers as they are displayed to a window.
@@ -4765,4 +4766,11 @@
return nativeGetStalledTransactionInfo(pid);
}
+ /**
+ * Notify the SurfaceFlinger to capture transaction traces when shutdown.
+ * @hide
+ */
+ public static void notifyShutdown() {
+ nativeNotifyShutdown();
+ }
}
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 1aa635c..23f7808 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -2201,6 +2201,10 @@
return jStalledTransactionInfo;
}
+static void nativeNotifyShutdown() {
+ SurfaceComposerClient::notifyShutdown();
+}
+
// ----------------------------------------------------------------------------
SurfaceControl* android_view_SurfaceControl_getNativeSurfaceControl(JNIEnv* env,
@@ -2476,6 +2480,8 @@
(void*) nativeGetStalledTransactionInfo },
{"nativeSetDesiredPresentTimeNanos", "(JJ)V",
(void*) nativeSetDesiredPresentTimeNanos },
+ {"nativeNotifyShutdown", "()V",
+ (void*)nativeNotifyShutdown },
// clang-format on
};
diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java
index afcf49d..6b7f2fa 100644
--- a/services/core/java/com/android/server/power/ShutdownThread.java
+++ b/services/core/java/com/android/server/power/ShutdownThread.java
@@ -54,6 +54,7 @@
import android.util.Log;
import android.util.Slog;
import android.util.TimingsTraceLog;
+import android.view.SurfaceControl;
import android.view.WindowManager;
import com.android.internal.annotations.VisibleForTesting;
@@ -459,6 +460,10 @@
metricShutdownStart();
metricStarted(METRIC_SYSTEM_SERVER);
+ // Notify SurfaceFlinger that the device is shutting down.
+ // Transaction traces should be captured at this stage.
+ SurfaceControl.notifyShutdown();
+
// Start dumping check points for this shutdown in a separate thread.
Thread dumpCheckPointsThread = ShutdownCheckPoints.newDumpThread(
new File(CHECK_POINTS_FILE_BASENAME));