diff options
| author | 2019-05-22 13:04:12 -0700 | |
|---|---|---|
| committer | 2019-05-22 19:36:30 -0700 | |
| commit | eb8b460c8f63b106ffae254ab51310c9be6c3e0c (patch) | |
| tree | 6c068e775f20f7084b8534d3a90d49aade416eb4 | |
| parent | 09c5edd7a0bed51df6150d1caf0d87f58e33250b (diff) | |
Exclude packages that's not installed from the hash for role.
Otherwise we won't detect the change when a package is set to
installed for an user.
Also added the number of enabled components to the hash so that when
an enabled component get disabled but the order didn't change, we can
still detect the change.
Fixes: 129004850
Test: follow the repro step in b/129004850 and confirm it's fixed
Change-Id: I87d62daf0f6a4d34939ee03ee783e9bdb19bf558
3 files changed, 31 insertions, 2 deletions
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 5a69e6bdef30..376a211dbc7d 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<PackageParser.Package> 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<PackageParser.Package> actionLocked, @UserIdInt int userId); + /** Returns the list of enabled components */ public abstract ArraySet<String> 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 e07a13284457..d5b7fe1103ac 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -24767,6 +24767,12 @@ public class PackageManagerService extends IPackageManager.Stub } @Override + public void forEachInstalledPackage(@NonNull Consumer<PackageParser.Package> actionLocked, + @UserIdInt int userId) { + PackageManagerService.this.forEachInstalledPackage(actionLocked, userId); + } + + @Override public ArraySet<String> getEnabledComponents(String packageName, int userId) { synchronized (mPackages) { PackageSetting setting = mSettings.getPackageLPr(packageName); @@ -25058,6 +25064,21 @@ public class PackageManagerService extends IPackageManager.Stub } } + void forEachInstalledPackage(@NonNull Consumer<PackageParser.Package> 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 33803b742042..9cd6b0d32793 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<String> 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()); } |