diff options
| author | 2023-12-07 10:13:41 +0100 | |
|---|---|---|
| committer | 2024-04-25 15:47:34 +0200 | |
| commit | 6259da54de2154ede7926e04695c6f13fdfcb4ec (patch) | |
| tree | 9237badb7aa0565a20b160d6b29bdafe052d613d | |
| parent | 548ee3851e394f9eeac1f105904cba9f2a6f2d10 (diff) | |
Looper: Add app and thread info to slow message log
Adding app name, thread group and main flag indicating if the specific
looper is the app's main looper to the slow delivery/dispatch log
messages.
Having the app name and main flag within the log messages makes it
possible to detect if an app's main looper delivers or dispatches
messages slowly, causing the overall app user experience to feel
sluggish. Logging the thread group allows the distinction between
foreground or background processes, whose sluggishness affects the user
experience differently.
The same information could be extracted by fetching the uid for the
logging app, and then lookup its cgroup and process. However, that can
only be done at runtime, while having the information within the logs
allows it to be read at a later date.
Bug: 326356810
Test: manual - observe slow dispatch/delivery log messages
Based-on-patch-by: Nicklas Ekstrand <nicklas.ekstrand@sonymobile.com>
Change-Id: I270b2a173ed25455c84d015cffa56edc509faa9c
| -rw-r--r-- | core/java/android/os/Looper.java | 43 | ||||
| -rw-r--r-- | core/java/android/os/Process.java | 3 |
2 files changed, 42 insertions, 4 deletions
diff --git a/core/java/android/os/Looper.java b/core/java/android/os/Looper.java index ddf2b61324ad..012590510714 100644 --- a/core/java/android/os/Looper.java +++ b/core/java/android/os/Looper.java @@ -332,16 +332,55 @@ public final class Looper { return -1; } + private static int getThreadGroup() { + int threadGroup = Process.THREAD_GROUP_DEFAULT; + + if (!Process.isIsolated()) { + threadGroup = Process.getProcessGroup(Process.myTid()); + } + return threadGroup; + } + + private static String threadGroupToString(int threadGroup) { + switch (threadGroup) { + case Process.THREAD_GROUP_BACKGROUND: + return "BACKGROUND"; + case Process.THREAD_GROUP_FOREGROUND: + return "FOREGROUND"; + case Process.THREAD_GROUP_SYSTEM: + return "SYSTEM"; + case Process.THREAD_GROUP_AUDIO_APP: + return "AUDIO_APP"; + case Process.THREAD_GROUP_AUDIO_SYS: + return "AUDIO_SYS"; + case Process.THREAD_GROUP_TOP_APP: + return "TOP_APP"; + case Process.THREAD_GROUP_RT_APP: + return "RT_APP"; + case Process.THREAD_GROUP_RESTRICTED: + return "RESTRICTED"; + default: + return "UNKNOWN"; + } + } + private static boolean showSlowLog(long threshold, long measureStart, long measureEnd, String what, Message msg) { final long actualTime = measureEnd - measureStart; if (actualTime < threshold) { return false; } + + String name = Process.myProcessName(); + String threadGroup = threadGroupToString(getThreadGroup()); + boolean isMain = myLooper() == getMainLooper(); + // For slow delivery, the current message isn't really important, but log it anyway. Slog.w(TAG, "Slow " + what + " took " + actualTime + "ms " - + Thread.currentThread().getName() + " h=" - + msg.target.getClass().getName() + " c=" + msg.callback + " m=" + msg.what); + + Thread.currentThread().getName() + " app=" + name + + " main=" + isMain + " group=" + threadGroup + + " h=" + msg.target.getClass().getName() + " c=" + msg.callback + + " m=" + msg.what); return true; } diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index c65c10c23bd6..ab853d7fc518 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -542,10 +542,9 @@ public class Process { * Foreground thread group - All threads in * this group are scheduled with a normal share of the CPU. * Value is same as constant SP_FOREGROUND of enum SchedPolicy. - * Not used at this level. * @hide **/ - private static final int THREAD_GROUP_FOREGROUND = 1; + public static final int THREAD_GROUP_FOREGROUND = 1; /** * System thread group. |