Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ebe0e5f7 authored by Tetsutoki Shiozawa's avatar Tetsutoki Shiozawa Committed by Todd Kennedy
Browse files

Keep the legacy ssaid for apps on SD card

Symptom:
After O OS upgrade, LINE application on SD card got crash loop. The
encrypted data depended on the ssaid and it was changed by OS upgrade.

Root cause:
At the 1st boot-time of OS upgrade, StorageProvider migrates the legacy
ssaids.

At that moment, SD card is not mounted yet. The target of migration
depends on the list of PMS#getInstalledPackages() and the list doesn't
contain the apps on unmounted SD card.
As a result, the ssaids for the apps on SD card are not migrated.

Solution:
The target of ssaid migration respects the all known packages of PMS.
To achieve it, getInstalledPackages() with MATCH_UNINSTALLED_PACKAGES
is improved. Now, it can provide the information of package which has
an inaccessible package file.
Even though SD card is not mounted, the package list contains the apps
on SD card.

Bug: 72343790
Change-Id: If5d31e44cf7ec44da6010434515a157b00a5a09a
parent b97eb6b8
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -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);
                                }
                            }
                        }
                    }
+44 −22
Original line number Diff line number Diff line
@@ -3849,10 +3849,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
@@ -3864,6 +3860,14 @@ Slog.e("TODD",
            return null;
        }
        if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0
                && ps.isSystem()) {
            flags |= MATCH_ANY_USER;
        }
        final PackageUserState state = ps.readUserState(userId);
        PackageParser.Package p = ps.pkg;
        if (p != null) {
            final PermissionsState permissionsState = ps.getPermissionsState();
            // Compute GIDs only if requested
@@ -3872,12 +3876,6 @@ Slog.e("TODD",
            // 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);
@@ -3890,6 +3888,30 @@ Slog.e("TODD",
                    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