OSDN Git Service

Add extra debug to capture system state
authorTodd Kennedy <toddke@google.com>
Fri, 10 May 2019 15:27:01 +0000 (08:27 -0700)
committerTodd Kennedy <toddke@google.com>
Fri, 10 May 2019 15:59:43 +0000 (08:59 -0700)
Current set of logs / bugreports is insufficient to debug the issue.
Add more logs to hopefully catch enough information to track down
the root cause.

Bug: 111075456
Test: Manual. Builds and runs
Change-Id: I2bc1c371b6c9c5b9e1886e8f6541d74fc8e54618

services/core/java/com/android/server/pm/PackageManagerService.java

index eaae009..92012c8 100644 (file)
@@ -5678,6 +5678,27 @@ public class PackageManagerService extends IPackageManager.Stub
             final PackageParser.Package pkg = (packageNames != null && packageNames.length > 0)
                     ? mPackages.get(packageNames[0])
                     : null;
+            // Additional logs for b/111075456; ignore system UIDs
+            if (pkg == null && UserHandle.getAppId(uid) >= Process.FIRST_APPLICATION_UID) {
+                if (packageNames == null || packageNames.length < 2) {
+                    // unclear if this is shared user or just a missing application
+                    Log.e(TAG, "Failed to find package"
+                            + "; permName: " + permName
+                            + ", uid: " + uid
+                            + ", caller: " + Binder.getCallingUid(),
+                            new Throwable());
+                } else {
+                    // definitely shared user
+                    Log.e(TAG, "Failed to find package"
+                            + "; permName: " + permName
+                            + ", uid: " + uid
+                            + ", caller: " + Binder.getCallingUid()
+                            + ", packages: " + Arrays.toString(packageNames),
+                            new Throwable());
+                }
+                // run again just to try to get debug output
+                getPackagesForUid_debug(uid, true);
+            }
             return mPermissionManager.checkUidPermission(permName, pkg, uid, getCallingUid());
         }
     }
@@ -6395,15 +6416,25 @@ public class PackageManagerService extends IPackageManager.Stub
 
     @Override
     public String[] getPackagesForUid(int uid) {
+        return getPackagesForUid_debug(uid, false);
+    }
+    // Debug output for b/111075456
+    private String[] getPackagesForUid_debug(int uid, boolean debug) {
         final int callingUid = Binder.getCallingUid();
         final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
         final int userId = UserHandle.getUserId(uid);
         final int appId = UserHandle.getAppId(uid);
+        if (debug) Slog.e(TAG, "Finding packages for UID"
+                + "; uid: " + uid
+                + ", userId: " + userId
+                + ", appId: " + appId
+                + ", caller: " + callingUid);
         // reader
         synchronized (mPackages) {
             final Object obj = mSettings.getSettingLPr(appId);
             if (obj instanceof SharedUserSetting) {
                 if (isCallerInstantApp) {
+                    if (debug) Slog.e(TAG, "Caller is instant and package has shared users");
                     return null;
                 }
                 final SharedUserSetting sus = (SharedUserSetting) obj;
@@ -6411,8 +6442,13 @@ public class PackageManagerService extends IPackageManager.Stub
                 String[] res = new String[N];
                 final Iterator<PackageSetting> it = sus.packages.iterator();
                 int i = 0;
+                if (debug && !it.hasNext()) Slog.e(TAG, "Shared user, but, no packages");
                 while (it.hasNext()) {
                     PackageSetting ps = it.next();
+                    if (debug) Slog.e(TAG, "Check shared package"
+                            + "; installed? " + ps.getInstalled(userId)
+                            + ", shared setting: " + ps
+                            + ", package setting: " + mSettings.mPackages.get(ps.name));
                     if (ps.getInstalled(userId)) {
                         res[i++] = ps.name;
                     } else {
@@ -6425,6 +6461,12 @@ public class PackageManagerService extends IPackageManager.Stub
                 if (ps.getInstalled(userId) && !filterAppAccessLPr(ps, callingUid, userId)) {
                     return new String[]{ps.name};
                 }
+                if (debug) Slog.e(TAG, "Removing normal package"
+                        + "; installed? " + ps.getInstalled(userId)
+                        + ", filtered? " + filterAppAccessLPr(ps, callingUid, userId));
+            } else if (debug) {
+                if (debug) Slog.e(TAG, "No setting found"
+                        + "; obj: " + (obj == null ? "<<NULL>>" : obj.toString()));
             }
         }
         return null;