summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hai Zhang <zhanghai@google.com> 2019-05-22 13:04:12 -0700
committer Hai Zhang <zhanghai@google.com> 2019-05-22 19:36:30 -0700
commiteb8b460c8f63b106ffae254ab51310c9be6c3e0c (patch)
tree6c068e775f20f7084b8534d3a90d49aade416eb4
parent09c5edd7a0bed51df6150d1caf0d87f58e33250b (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
-rw-r--r--core/java/android/content/pm/PackageManagerInternal.java7
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java21
-rw-r--r--services/core/java/com/android/server/role/RoleManagerService.java5
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());
}