summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Isak Evaldsson <isak.evaldsson@sony.com> 2023-12-07 10:13:41 +0100
committer Snild Dolkow <snild@sony.com> 2024-04-25 15:47:34 +0200
commit6259da54de2154ede7926e04695c6f13fdfcb4ec (patch)
tree9237badb7aa0565a20b160d6b29bdafe052d613d
parent548ee3851e394f9eeac1f105904cba9f2a6f2d10 (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.java43
-rw-r--r--core/java/android/os/Process.java3
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.