From 815e75595269c70c48c3716f9d8b29f6620f7057 Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Fri, 25 Mar 2022 16:37:11 -0700 Subject: [PATCH] Move keys removal to background handler. After 600 app uninstalls, the delay as compared to immedate call: 50% 0ms 75% 1ms 90% 1.2ms 95% 3.1ms 99% 12.04ms 99.9% 62.216ms Bug: 220083428 Test: presubmit Change-Id: I73d18283a49beb7724a8f86a5767c28970ba8170 --- .../android/server/pm/RemovePackageHelper.java | 17 ++++++++++++++--- .../src/com/android/server/pm/MockSystem.kt | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java index b181cdd92379d..baa3a9d85b0a1 100644 --- a/services/core/java/com/android/server/pm/RemovePackageHelper.java +++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java @@ -17,6 +17,7 @@ package com.android.server.pm; import static android.content.pm.PackageManager.UNINSTALL_REASON_UNKNOWN; +import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static android.os.incremental.IncrementalManager.isIncrementalPath; import static android.os.storage.StorageManager.FLAG_STORAGE_CE; import static android.os.storage.StorageManager.FLAG_STORAGE_DE; @@ -29,6 +30,7 @@ import static com.android.server.pm.PackageManagerService.TAG; import android.annotation.NonNull; import android.content.pm.PackageManager; +import android.os.Trace; import android.os.UserHandle; import android.os.incremental.IncrementalManager; import android.util.Log; @@ -334,10 +336,19 @@ final class RemovePackageHelper { mPm.mSettings.writeKernelMappingLPr(deletedPs); } } + if (removedAppId != -1) { - // A user ID was deleted here. Go through all users and remove it - // from KeyStore. - mAppDataHelper.clearKeystoreData(UserHandle.USER_ALL, removedAppId); + // A user ID was deleted here. Go through all users and remove it from KeyStore. + final int appIdToRemove = removedAppId; + mPm.mInjector.getBackgroundHandler().post(() -> { + try { + Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, + "clearKeystoreData:" + appIdToRemove); + mAppDataHelper.clearKeystoreData(UserHandle.USER_ALL, appIdToRemove); + } finally { + Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); + } + }); } } } diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt index 1af6fb7a40272..0567f58b1bbe2 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt @@ -203,6 +203,7 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) { val domainVerificationManagerInternal: DomainVerificationManagerInternal = mock() val handler = TestHandler(null) val defaultAppProvider: DefaultAppProvider = mock() + val backgroundHandler = TestHandler(null) } companion object { @@ -286,6 +287,7 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) { .thenReturn(mocks.domainVerificationManagerInternal) whenever(mocks.injector.handler) { mocks.handler } whenever(mocks.injector.defaultAppProvider) { mocks.defaultAppProvider } + whenever(mocks.injector.backgroundHandler) { mocks.backgroundHandler } wheneverStatic { SystemConfig.getInstance() }.thenReturn(mocks.systemConfig) whenever(mocks.systemConfig.availableFeatures).thenReturn(DEFAULT_AVAILABLE_FEATURES_MAP) whenever(mocks.systemConfig.sharedLibraries).thenReturn(DEFAULT_SHARED_LIBRARIES_LIST)