From 8d3253599b4be53f7d9825ab4050f8ffe8d79c88 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Fri, 23 Aug 2019 18:26:31 +0100 Subject: [PATCH] ApexManager: Post populateAllPackagesCacheIfNeeded to a background thread populateAllPackagesCacheIfNeeded is rather expensive method and shouldn't be run in broadcast handler thread (it was my mistake to suggest this in ag/9204784). It's fine to use background thread to execute populateAllPackagesCacheIfNeeded because components that need to match APEX are not doing it on user critical path. Bug: 138460874 Test: adb shell pm list packages --apex-only --show-versioncode Change-Id: Ib17fadb978f112c26c113e3bc42b9edaeeefca8a --- services/core/java/com/android/server/pm/ApexManager.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 1da5bc6c26ee5..dc00cb45596c8 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -261,11 +261,12 @@ abstract class ApexManager { mContext.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - populateAllPackagesCacheIfNeeded(); + // Post populateAllPackagesCacheIfNeeded to a background thread, since it's + // expensive to run it in broadcast handler thread. + BackgroundThread.getHandler().post(() -> populateAllPackagesCacheIfNeeded()); mContext.unregisterReceiver(this); } - }, new IntentFilter(Intent.ACTION_BOOT_COMPLETED), /* broadcastPermission */ null, - BackgroundThread.getHandler()); + }, new IntentFilter(Intent.ACTION_BOOT_COMPLETED)); } private void populateAllPackagesCacheIfNeeded() {