From 699f88d05479db9708ae6012692f51681de368d2 Mon Sep 17 00:00:00 2001 From: Lee Shombert Date: Thu, 28 Jan 2021 10:34:21 -0800 Subject: [PATCH] Make 4 PackageManagerService APIs lock-free Bug: 178754214 The following public PackageManagerService APIs are handled by the snapshot computer. * filterAppAccess * getSigningDetails Compared the times from startUser, stopUser, and switchUser to the baseline and saw no regression. Test: atest * FrameworksServicesTests:UserSystemPackageInstallerTest * FrameworksServicesTests:PackageManagerSettingsTests * FrameworksServicesTests:PackageManagerServiceTest * FrameworksServicesTests:AppsFilterTest * FrameworksServicesTests:PackageInstallerSessionTest * FrameworksServicesTests:ScanTests * UserLifecycleTests#startUser * UserLifecycleTests#stopUser * UserLifecycleTests#switchUser Change-Id: Ic5c707f2d65f427883d578b822fe9968e584f42c --- .../server/pm/PackageManagerService.java | 108 +++++++++++++----- 1 file changed, 78 insertions(+), 30 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index c27e670c4c99c..8b34c5fecf6ae 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2153,6 +2153,10 @@ public class PackageManagerService extends IPackageManager.Stub void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, boolean requireFullPermission, boolean checkShell, boolean requirePermissionWhenSameUser, String message); + SigningDetails getSigningDetails(@NonNull String packageName); + SigningDetails getSigningDetails(int uid); + boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId); + boolean filterAppAccess(String packageName, int callingUid, int userId); } /** @@ -4578,6 +4582,40 @@ public class PackageManagerService extends IPackageManager.Stub throw new SecurityException(errorMessage); } + public SigningDetails getSigningDetails(@NonNull String packageName) { + AndroidPackage p = mPackages.get(packageName); + if (p == null) { + return null; + } + return p.getSigningDetails(); + } + + public SigningDetails getSigningDetails(int uid) { + final int appId = UserHandle.getAppId(uid); + final Object obj = mSettings.getSettingLPr(appId); + if (obj != null) { + if (obj instanceof SharedUserSetting) { + return ((SharedUserSetting) obj).signatures.mSigningDetails; + } else if (obj instanceof PackageSetting) { + final PackageSetting ps = (PackageSetting) obj; + return ps.signatures.mSigningDetails; + } + } + return SigningDetails.UNKNOWN; + } + + public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { + PackageSetting ps = getPackageSetting(pkg.getPackageName()); + return shouldFilterApplicationLocked(ps, callingUid, + userId); + } + + public boolean filterAppAccess(String packageName, int callingUid, int userId) { + PackageSetting ps = getPackageSetting(packageName); + return shouldFilterApplicationLocked(ps, callingUid, + userId); + } + } /** @@ -4728,6 +4766,26 @@ public class PackageManagerService extends IPackageManager.Stub return super.getPackageUidInternal(packageName, flags, userId, callingUid); } } + public SigningDetails getSigningDetails(@NonNull String packageName) { + synchronized (mLock) { + return super.getSigningDetails(packageName); + } + } + public SigningDetails getSigningDetails(int uid) { + synchronized (mLock) { + return super.getSigningDetails(uid); + } + } + public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { + synchronized (mLock) { + return super.filterAppAccess(pkg, callingUid, userId); + } + } + public boolean filterAppAccess(String packageName, int callingUid, int userId) { + synchronized (mLock) { + return super.filterAppAccess(packageName, callingUid, userId); + } + } } @@ -26560,6 +26618,22 @@ public class PackageManagerService extends IPackageManager.Stub return snapshotComputer().getPackage(uid); } + private SigningDetails getSigningDetails(@NonNull String packageName) { + return snapshotComputer().getSigningDetails(packageName); + } + + private SigningDetails getSigningDetails(int uid) { + return snapshotComputer().getSigningDetails(uid); + } + + private boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { + return snapshotComputer().filterAppAccess(pkg, callingUid, userId); + } + + private boolean filterAppAccess(String packageName, int callingUid, int userId) { + return snapshotComputer().filterAppAccess(packageName, callingUid, userId); + } + private class PackageManagerInternalImpl extends PackageManagerInternal { @Override public List getInstalledApplications(int flags, int userId, @@ -26615,29 +26689,11 @@ public class PackageManagerService extends IPackageManager.Stub } private SigningDetails getSigningDetails(@NonNull String packageName) { - synchronized (mLock) { - AndroidPackage p = mPackages.get(packageName); - if (p == null) { - return null; - } - return p.getSigningDetails(); - } + return PackageManagerService.this.getSigningDetails(packageName); } private SigningDetails getSigningDetails(int uid) { - synchronized (mLock) { - final int appId = UserHandle.getAppId(uid); - final Object obj = mSettings.getSettingLPr(appId); - if (obj != null) { - if (obj instanceof SharedUserSetting) { - return ((SharedUserSetting) obj).signatures.mSigningDetails; - } else if (obj instanceof PackageSetting) { - final PackageSetting ps = (PackageSetting) obj; - return ps.signatures.mSigningDetails; - } - } - return SigningDetails.UNKNOWN; - } + return PackageManagerService.this.getSigningDetails(uid); } @Override @@ -26652,20 +26708,12 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { - synchronized (mLock) { - PackageSetting ps = getPackageSetting(pkg.getPackageName()); - return PackageManagerService.this.shouldFilterApplicationLocked(ps, callingUid, - userId); - } + return PackageManagerService.this.filterAppAccess(pkg, callingUid, userId); } @Override public boolean filterAppAccess(String packageName, int callingUid, int userId) { - synchronized (mLock) { - PackageSetting ps = getPackageSetting(packageName); - return PackageManagerService.this.shouldFilterApplicationLocked(ps, callingUid, - userId); - } + return PackageManagerService.this.filterAppAccess(packageName, callingUid, userId); } @Override