diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index acdff4fb52fd7..58a041aec894d 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -748,6 +748,11 @@ interface IWindowManager */ void setLayerTracingFlags(int flags); + /** + * Toggle active SurfaceFlinger transaction tracing. + */ + void setActiveTransactionTracing(boolean active); + /** * Forwards a scroll capture request to the appropriate window, if available. * diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 0e6903e1336fe..a00375f91ff7c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8764,6 +8764,41 @@ public class WindowManagerService extends IWindowManager.Stub } } + /** + * Toggle active transaction tracing. + * Setting to true increases the buffer size for active debugging. + * Setting to false resets the buffer size and dumps the trace to file. + */ + public void setActiveTransactionTracing(boolean active) { + if (!checkCallingPermission( + android.Manifest.permission.DUMP, "setActiveTransactionTracing()")) { + throw new SecurityException("Requires DUMP permission"); + } + + final long token = Binder.clearCallingIdentity(); + try { + Parcel data = null; + try { + IBinder sf = ServiceManager.getService("SurfaceFlinger"); + if (sf != null) { + data = Parcel.obtain(); + data.writeInterfaceToken("android.ui.ISurfaceComposer"); + data.writeInt(active ? 1 : 0); + sf.transact(/* TRANSACTION_TRACE_CONTROL_CODE */ 1041, data, + null, 0 /* flags */); + } + } catch (RemoteException e) { + Slog.e(TAG, "Failed to set transaction tracing"); + } finally { + if (data != null) { + data.recycle(); + } + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + @Override public boolean mirrorDisplay(int displayId, SurfaceControl outSurfaceControl) { if (!checkCallingPermission(READ_FRAME_BUFFER, "mirrorDisplay()")) {