From bca1229305be2e8e6631f9212898856f3ae2a6b7 Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Fri, 10 May 2019 08:27:01 -0700 Subject: [PATCH] Add extra debug to capture system state 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 --- .../server/pm/PackageManagerService.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index eaae00918d102..92012c8abeaf8 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -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 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 ? "<>" : obj.toString())); } } return null;