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
This commit is contained in:
Lee Shombert
2021-01-28 10:34:21 -08:00
parent a049b3853c
commit 699f88d054

View File

@@ -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<ApplicationInfo> 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