From 37b966d5bdde09fd9dd680529c35cee0faeaca5d Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Fri, 14 Jul 2017 11:39:52 -0700 Subject: Handle onUnlockUser on fg thread AppWidgetService.onUserUnlocked can block ActivityManager thread for 500+ ms. The code is guarded by mLock, so it's safe to simply offload it to the worker thread without additional synchronization. Test: Setup widgets/rebooted the device and unlocked Test: Create/switch to guest user + setup widgets Bug: 63389529 Change-Id: Ib3bc76f79bdbc707c0ac270d7fc35c8b27af9af0 --- .../appwidget/java/com/android/server/appwidget/AppWidgetService.java | 3 ++- .../java/com/android/server/appwidget/AppWidgetServiceImpl.java | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'services/appwidget/java') diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java index 9cc53f02de1c..c9c7adc45697 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java @@ -19,6 +19,7 @@ package com.android.server.appwidget; import android.content.Context; import com.android.server.AppWidgetBackupBridge; +import com.android.server.FgThread; import com.android.server.SystemService; /** @@ -48,7 +49,7 @@ public class AppWidgetService extends SystemService { @Override public void onUnlockUser(int userHandle) { - mImpl.onUserUnlocked(userHandle); + FgThread.getHandler().post(() -> mImpl.onUserUnlocked(userHandle)); } @Override diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 7ebda358afb4..80b54770e4b7 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -2645,6 +2645,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku Slog.w(TAG, "User " + userId + " is no longer unlocked - exiting"); return; } + long time = SystemClock.elapsedRealtime(); synchronized (mLock) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "appwidget ensure"); ensureGroupStateLoadedLocked(userId); @@ -2673,6 +2674,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } } + Slog.i(TAG, "Async processing of onUserUnlocked u" + userId + " took " + + (SystemClock.elapsedRealtime() - time) + " ms"); } // only call from initialization -- it assumes that the data structures are all empty -- cgit v1.2.3-59-g8ed1b