diff options
| author | 2023-10-02 09:48:17 +0000 | |
|---|---|---|
| committer | 2023-10-02 09:48:17 +0000 | |
| commit | 0861bc8f7be385175b42385481eff64d8876806c (patch) | |
| tree | 8ed0b1327abf58abe17a2334d6702a5d0ef5783a | |
| parent | 5497554292b4a2395095e3c1c434b465a79fb6ea (diff) | |
| parent | e51c0d8ddfb202c477216a976846b309e384263c (diff) | |
Merge changes Ib8514d3c,I5c0b018c into main
* changes:
Add ServiceThread to WallpaperManagerService.
Add a flag for binding wallpaper service on its own thread.
| -rw-r--r-- | core/java/android/content/pm/multiuser.aconfig | 7 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wallpaper/WallpaperManagerService.java | 17 |
2 files changed, 23 insertions, 1 deletions
diff --git a/core/java/android/content/pm/multiuser.aconfig b/core/java/android/content/pm/multiuser.aconfig index 07ff7be00114..ea0f049cece3 100644 --- a/core/java/android/content/pm/multiuser.aconfig +++ b/core/java/android/content/pm/multiuser.aconfig @@ -6,3 +6,10 @@ flag { description: "Save guest and device policy global restrictions on the SYSTEM user's XML file." bug: "301067944" } + +flag { + name: "bind_wallpaper_service_on_its_own_thread_during_a_user_switch" + namespace: "multiuser" + description: "Bind wallpaper service on its own thread instead of system_server's main handler during a user switch." + bug: "302100344" +} diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 4c525e902b88..01ea33f1aecd 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -28,6 +28,7 @@ import static android.os.ParcelFileDescriptor.MODE_CREATE; import static android.os.ParcelFileDescriptor.MODE_READ_ONLY; import static android.os.ParcelFileDescriptor.MODE_READ_WRITE; import static android.os.ParcelFileDescriptor.MODE_TRUNCATE; +import static android.os.Process.THREAD_PRIORITY_FOREGROUND; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; @@ -74,6 +75,7 @@ import android.graphics.BitmapFactory; import android.graphics.Rect; import android.graphics.RectF; import android.hardware.display.DisplayManager; +import android.multiuser.Flags; import android.os.Binder; import android.os.Bundle; import android.os.FileObserver; @@ -114,6 +116,7 @@ import com.android.internal.util.DumpUtils; import com.android.server.EventLogTags; import com.android.server.FgThread; import com.android.server.LocalServices; +import com.android.server.ServiceThread; import com.android.server.SystemService; import com.android.server.pm.UserManagerInternal; import com.android.server.utils.TimingsTraceAndSlog; @@ -132,6 +135,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.function.Predicate; @@ -746,6 +750,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } private final Context mContext; + private final AtomicBoolean mIsInitialBinding = new AtomicBoolean(true); + private final ServiceThread mHandlerThread; private final WindowManagerInternal mWindowManagerInternal; private final PackageManagerInternal mPackageManagerInternal; private final IPackageManager mIPackageManager; @@ -1619,6 +1625,12 @@ public class WallpaperManagerService extends IWallpaperManager.Stub public WallpaperManagerService(Context context) { if (DEBUG) Slog.v(TAG, "WallpaperService startup"); mContext = context; + if (Flags.bindWallpaperServiceOnItsOwnThreadDuringAUserSwitch()) { + mHandlerThread = new ServiceThread(TAG, THREAD_PRIORITY_FOREGROUND, true /*allowIo*/); + mHandlerThread.start(); + } else { + mHandlerThread = null; + } mShuttingDown = false; mImageWallpaper = ComponentName.unflattenFromString( context.getResources().getString(R.string.image_wallpaper_component)); @@ -3652,7 +3664,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub com.android.internal.R.bool.config_wallpaperTopApp)) { bindFlags |= Context.BIND_SCHEDULE_LIKE_TOP_APP; } - boolean bindSuccess = mContext.bindServiceAsUser(intent, newConn, bindFlags, + Handler handler = Flags.bindWallpaperServiceOnItsOwnThreadDuringAUserSwitch() + && !mIsInitialBinding.compareAndSet(true, false) + ? mHandlerThread.getThreadHandler() : mContext.getMainThreadHandler(); + boolean bindSuccess = mContext.bindServiceAsUser(intent, newConn, bindFlags, handler, new UserHandle(serviceUserId)); if (!bindSuccess) { String msg = "Unable to bind service: " + componentName; |