From 2527fa3067ce5ccc707203a06f00eea595d05308 Mon Sep 17 00:00:00 2001 From: liulvping Date: Mon, 6 Jun 2016 10:20:48 +0800 Subject: [PATCH] Skip uninstalled package for getPackagesForUid() If a package with sharedUserId had been setInstalled with false, then the result of getPackagesForUid() should not include it. https://code.google.com/p/android/issues/detail?id=212255 Change-Id: I7b984051db34ecc2d0ef9518786d51100ab9ac79 Signed-off-by: liulvping --- .../android/server/pm/PackageManagerService.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 76d987b54e441..85cc12427cef4 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4578,6 +4578,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public String[] getPackagesForUid(int uid) { + final int userId = UserHandle.getUserId(uid); uid = UserHandle.getAppId(uid); // reader synchronized (mPackages) { @@ -4585,9 +4586,16 @@ public class PackageManagerService extends IPackageManager.Stub { if (obj instanceof SharedUserSetting) { final SharedUserSetting sus = (SharedUserSetting) obj; final int N = sus.packages.size(); - final String[] res = new String[N]; - for (int i = 0; i < N; i++) { - res[i] = sus.packages.valueAt(i).name; + String[] res = new String[N]; + final Iterator it = sus.packages.iterator(); + int i = 0; + while (it.hasNext()) { + PackageSetting ps = it.next(); + if (ps.getInstalled(userId)) { + res[i++] = ps.name; + } else { + res = ArrayUtils.removeElement(String.class, res, res[i]); + } } return res; } else if (obj instanceof PackageSetting) {