diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java index 878b7a0e8e10e..3c7c962eaa12d 100644 --- a/core/java/android/os/Handler.java +++ b/core/java/android/os/Handler.java @@ -231,6 +231,18 @@ public class Handler { mAsynchronous = async; } + /** {@hide} */ + public String getTraceName(Message message) { + final StringBuilder sb = new StringBuilder(); + sb.append(getClass().getName()).append(": "); + if (message.callback != null) { + sb.append(message.callback.getClass().getName()); + } else { + sb.append("#").append(message.what); + } + return sb.toString(); + } + /** * Returns a string representing the name of the specified message. * The default implementation will either return the class name of the @@ -739,8 +751,8 @@ public class Handler { message.callback.run(); } - final MessageQueue mQueue; final Looper mLooper; + final MessageQueue mQueue; final Callback mCallback; final boolean mAsynchronous; IMessenger mMessenger; diff --git a/core/java/android/os/Looper.java b/core/java/android/os/Looper.java index 34c880f60520a..b58ff1fd4755a 100644 --- a/core/java/android/os/Looper.java +++ b/core/java/android/os/Looper.java @@ -72,6 +72,7 @@ public final class Looper { final Thread mThread; private Printer mLogging; + private long mTraceTag; /** Initialize the current thread as a looper. * This gives you a chance to create handlers that then reference @@ -139,13 +140,23 @@ public final class Looper { } // This must be in a local variable, in case a UI event sets the logger - Printer logging = me.mLogging; + final Printer logging = me.mLogging; if (logging != null) { logging.println(">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what); } - msg.target.dispatchMessage(msg); + final long traceTag = me.mTraceTag; + if (traceTag != 0) { + Trace.traceBegin(traceTag, msg.target.getTraceName(msg)); + } + try { + msg.target.dispatchMessage(msg); + } finally { + if (traceTag != 0) { + Trace.traceEnd(traceTag); + } + } if (logging != null) { logging.println("<<<<< Finished to " + msg.target + " " + msg.callback); @@ -208,6 +219,11 @@ public final class Looper { mLogging = printer; } + /** {@hide} */ + public void setTraceTag(long traceTag) { + mTraceTag = traceTag; + } + /** * Quits the looper. *
diff --git a/core/java/com/android/internal/os/BackgroundThread.java b/core/java/com/android/internal/os/BackgroundThread.java index d6f7b20189a86..cffba0177d14d 100644 --- a/core/java/com/android/internal/os/BackgroundThread.java +++ b/core/java/com/android/internal/os/BackgroundThread.java @@ -18,6 +18,7 @@ package com.android.internal.os; import android.os.Handler; import android.os.HandlerThread; +import android.os.Trace; /** * Shared singleton background thread for each process. @@ -34,6 +35,7 @@ public final class BackgroundThread extends HandlerThread { if (sInstance == null) { sInstance = new BackgroundThread(); sInstance.start(); + sInstance.getLooper().setTraceTag(Trace.TRACE_TAG_ACTIVITY_MANAGER); sHandler = new Handler(sInstance.getLooper()); } } diff --git a/services/core/java/com/android/server/DisplayThread.java b/services/core/java/com/android/server/DisplayThread.java index aa0a80508d0f9..9ef02598c1d38 100644 --- a/services/core/java/com/android/server/DisplayThread.java +++ b/services/core/java/com/android/server/DisplayThread.java @@ -17,6 +17,7 @@ package com.android.server; import android.os.Handler; +import android.os.Trace; /** * Shared singleton foreground thread for the system. This is a thread for @@ -36,6 +37,7 @@ public final class DisplayThread extends ServiceThread { if (sInstance == null) { sInstance = new DisplayThread(); sInstance.start(); + sInstance.getLooper().setTraceTag(Trace.TRACE_TAG_ACTIVITY_MANAGER); sHandler = new Handler(sInstance.getLooper()); } } diff --git a/services/core/java/com/android/server/FgThread.java b/services/core/java/com/android/server/FgThread.java index 03765db35bae2..5f85cbac21d5f 100644 --- a/services/core/java/com/android/server/FgThread.java +++ b/services/core/java/com/android/server/FgThread.java @@ -17,6 +17,7 @@ package com.android.server; import android.os.Handler; +import android.os.Trace; /** * Shared singleton foreground thread for the system. This is a thread for regular @@ -38,6 +39,7 @@ public final class FgThread extends ServiceThread { if (sInstance == null) { sInstance = new FgThread(); sInstance.start(); + sInstance.getLooper().setTraceTag(Trace.TRACE_TAG_ACTIVITY_MANAGER); sHandler = new Handler(sInstance.getLooper()); } } diff --git a/services/core/java/com/android/server/IoThread.java b/services/core/java/com/android/server/IoThread.java index 0f29857db3459..ad4c19485f263 100644 --- a/services/core/java/com/android/server/IoThread.java +++ b/services/core/java/com/android/server/IoThread.java @@ -17,6 +17,7 @@ package com.android.server; import android.os.Handler; +import android.os.Trace; /** * Shared singleton I/O thread for the system. This is a thread for non-background @@ -35,6 +36,7 @@ public final class IoThread extends ServiceThread { if (sInstance == null) { sInstance = new IoThread(); sInstance.start(); + sInstance.getLooper().setTraceTag(Trace.TRACE_TAG_ACTIVITY_MANAGER); sHandler = new Handler(sInstance.getLooper()); } } diff --git a/services/core/java/com/android/server/UiThread.java b/services/core/java/com/android/server/UiThread.java index 0beb77fb4b92a..c06afc2505ee0 100644 --- a/services/core/java/com/android/server/UiThread.java +++ b/services/core/java/com/android/server/UiThread.java @@ -17,6 +17,7 @@ package com.android.server; import android.os.Handler; +import android.os.Trace; /** * Shared singleton thread for showing UI. This is a foreground thread, and in @@ -35,6 +36,7 @@ public final class UiThread extends ServiceThread { if (sInstance == null) { sInstance = new UiThread(); sInstance.start(); + sInstance.getLooper().setTraceTag(Trace.TRACE_TAG_ACTIVITY_MANAGER); sHandler = new Handler(sInstance.getLooper()); } }