OSDN Git Service

Skip uninstalled package for getPackagesForUid()
authorliulvping <liulvping@xiaomi.com>
Mon, 6 Jun 2016 02:20:48 +0000 (10:20 +0800)
committerTodd Kennedy <toddke@google.com>
Thu, 22 Sep 2016 16:53:21 +0000 (16:53 +0000)
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 <liulvping@xiaomi.com>
services/core/java/com/android/server/pm/PackageManagerService.java

index 76d987b..85cc124 100644 (file)
@@ -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<PackageSetting> 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) {