diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 5a69e6bdef301..376a211dbc7d9 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -844,6 +844,13 @@ public abstract class PackageManagerInternal { */ public abstract void forEachPackage(Consumer actionLocked); + /** + * Perform the given action for each installed package for a user. + * Note that packages lock will be held while performin the actions. + */ + public abstract void forEachInstalledPackage( + @NonNull Consumer actionLocked, @UserIdInt int userId); + /** Returns the list of enabled components */ public abstract ArraySet getEnabledComponents(String packageName, int userId); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e86f56f90cb41..719e166d5b98c 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -24783,6 +24783,12 @@ public class PackageManagerService extends IPackageManager.Stub PackageManagerService.this.forEachPackage(actionLocked); } + @Override + public void forEachInstalledPackage(@NonNull Consumer actionLocked, + @UserIdInt int userId) { + PackageManagerService.this.forEachInstalledPackage(actionLocked, userId); + } + @Override public ArraySet getEnabledComponents(String packageName, int userId) { synchronized (mPackages) { @@ -25075,6 +25081,21 @@ public class PackageManagerService extends IPackageManager.Stub } } + void forEachInstalledPackage(@NonNull Consumer actionLocked, + @UserIdInt int userId) { + synchronized (mPackages) { + int numPackages = mPackages.size(); + for (int i = 0; i < numPackages; i++) { + PackageParser.Package pkg = mPackages.valueAt(i); + PackageSetting setting = mSettings.getPackageLPr(pkg.packageName); + if (setting == null || !setting.getInstalled(userId)) { + continue; + } + actionLocked.accept(pkg); + } + } + } + private static void enforceSystemOrPhoneCaller(String tag) { int callingUid = Binder.getCallingUid(); if (callingUid != Process.PHONE_UID && callingUid != Process.SYSTEM_UID) { diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index 33803b7420421..9cd6b0d327937 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -280,7 +280,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); ByteArrayOutputStream out = new ByteArrayOutputStream(); - pm.forEachPackage(FunctionalUtils.uncheckExceptions(pkg -> { + pm.forEachInstalledPackage(FunctionalUtils.uncheckExceptions(pkg -> { out.write(pkg.packageName.getBytes()); out.write(BitUtils.toBytes(pkg.getLongVersionCode())); out.write(pm.getApplicationEnabledState(pkg.packageName, userId)); @@ -288,6 +288,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C ArraySet enabledComponents = pm.getEnabledComponents(pkg.packageName, userId); int numComponents = CollectionUtils.size(enabledComponents); + out.write(numComponents); for (int i = 0; i < numComponents; i++) { out.write(enabledComponents.valueAt(i).getBytes()); } @@ -301,7 +302,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C for (Signature signature : pkg.mSigningDetails.signatures) { out.write(signature.toByteArray()); } - })); + }), userId); return PackageUtils.computeSha256Digest(out.toByteArray()); }