diff options
| -rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java | 11 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 66 |
2 files changed, 53 insertions, 24 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 81aaaeadfa4d..adb4dbf98dd0 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -2328,7 +2328,9 @@ public class SettingsProvider extends ContentProvider { // Get all uids for the user's packages. final List<PackageInfo> packages; try { - packages = mPackageManager.getInstalledPackages(0, user.id).getList(); + packages = mPackageManager.getInstalledPackages( + PackageManager.MATCH_UNINSTALLED_PACKAGES, + user.id).getList(); } catch (RemoteException e) { throw new IllegalStateException("Package manager not available"); } @@ -3401,7 +3403,9 @@ public class SettingsProvider extends ContentProvider { // Fill each uid with the legacy ssaid to be backwards compatible. final List<PackageInfo> packages; try { - packages = mPackageManager.getInstalledPackages(0, userId).getList(); + packages = mPackageManager.getInstalledPackages( + PackageManager.MATCH_UNINSTALLED_PACKAGES, + userId).getList(); } catch (RemoteException e) { throw new IllegalStateException("Package manager not available"); } @@ -3416,6 +3420,9 @@ public class SettingsProvider extends ContentProvider { // Android Id doesn't exist for this package so create it. ssaidSettings.insertSettingLocked(uid, legacySsaid, null, true, info.packageName); + if (DEBUG) { + Slog.d(LOG_TAG, "Keep the legacy ssaid for uid=" + uid); + } } } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 82cd2d9a3c5d..a0cb7227ad9f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3840,10 +3840,6 @@ Slog.e("TODD", if (ps == null) { return null; } - PackageParser.Package p = ps.pkg; - if (p == null) { - return null; - } final int callingUid = Binder.getCallingUid(); // Filter out ephemeral app metadata: // * The system/shell/root can see metadata for any app @@ -3855,32 +3851,58 @@ Slog.e("TODD", return null; } - final PermissionsState permissionsState = ps.getPermissionsState(); - - // Compute GIDs only if requested - final int[] gids = (flags & PackageManager.GET_GIDS) == 0 - ? EMPTY_INT_ARRAY : permissionsState.computeGids(userId); - // Compute granted permissions only if package has requested permissions - final Set<String> permissions = ArrayUtils.isEmpty(p.requestedPermissions) - ? Collections.<String>emptySet() : permissionsState.getPermissions(userId); - final PackageUserState state = ps.readUserState(userId); - if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0 && ps.isSystem()) { flags |= MATCH_ANY_USER; } - PackageInfo packageInfo = PackageParser.generatePackageInfo(p, gids, flags, - ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId); + final PackageUserState state = ps.readUserState(userId); + PackageParser.Package p = ps.pkg; + if (p != null) { + final PermissionsState permissionsState = ps.getPermissionsState(); + + // Compute GIDs only if requested + final int[] gids = (flags & PackageManager.GET_GIDS) == 0 + ? EMPTY_INT_ARRAY : permissionsState.computeGids(userId); + // Compute granted permissions only if package has requested permissions + final Set<String> permissions = ArrayUtils.isEmpty(p.requestedPermissions) + ? Collections.<String>emptySet() : permissionsState.getPermissions(userId); - if (packageInfo == null) { - return null; - } + PackageInfo packageInfo = PackageParser.generatePackageInfo(p, gids, flags, + ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId); - packageInfo.packageName = packageInfo.applicationInfo.packageName = - resolveExternalPackageNameLPr(p); + if (packageInfo == null) { + return null; + } - return packageInfo; + packageInfo.packageName = packageInfo.applicationInfo.packageName = + resolveExternalPackageNameLPr(p); + + return packageInfo; + } else if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0 && state.isAvailable(flags)) { + PackageInfo pi = new PackageInfo(); + pi.packageName = ps.name; + pi.setLongVersionCode(ps.versionCode); + pi.sharedUserId = (ps.sharedUser != null) ? ps.sharedUser.name : null; + pi.firstInstallTime = ps.firstInstallTime; + pi.lastUpdateTime = ps.lastUpdateTime; + + ApplicationInfo ai = new ApplicationInfo(); + ai.packageName = ps.name; + ai.uid = UserHandle.getUid(userId, ps.appId); + ai.primaryCpuAbi = ps.primaryCpuAbiString; + ai.secondaryCpuAbi = ps.secondaryCpuAbiString; + ai.versionCode = ps.versionCode; + ai.flags = ps.pkgFlags; + ai.privateFlags = ps.pkgPrivateFlags; + pi.applicationInfo = PackageParser.generateApplicationInfo(ai, flags, state, userId); + + if (DEBUG_PACKAGE_INFO) Log.v(TAG, "ps.pkg is n/a for [" + + ps.name + "]. Provides a minimum info."); + return pi; + } else { + return null; + } } @Override |