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

Commit f80b52b0 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Persist version data on a per-volume basis.

Now that we support multiple adopted external storage devices, we
need to keep track of version data for each volume.  This means we
now correctly handle certificate upgrade edge cases, permission
regranting, and clearing of code caches on a per-volume basis.

Bug: 22298966
Change-Id: Ifb9940c197f6c058a3ecca728257f853ce0fd7f4
parent 2a500e32
Loading
Loading
Loading
Loading
+65 −49
Original line number Diff line number Diff line
@@ -224,6 +224,7 @@ import com.android.server.SystemConfig;
import com.android.server.Watchdog;
import com.android.server.pm.PermissionsState.PermissionState;
import com.android.server.pm.Settings.DatabaseVersion;
import com.android.server.pm.Settings.VersionInfo;
import com.android.server.storage.DeviceStorageMonitorInternal;
import org.xmlpull.v1.XmlPullParser;
@@ -1654,6 +1655,11 @@ public class PackageManagerService extends IPackageManager.Stub {
        @Override
        public void onVolumeForgotten(String fsUuid) {
            if (TextUtils.isEmpty(fsUuid)) {
                Slog.w(TAG, "Forgetting internal storage is probably a mistake; ignoring");
                return;
            }
            // Remove any apps installed on the forgotten volume
            synchronized (mPackages) {
                final List<PackageSetting> packages = mSettings.getVolumePackagesLPr(fsUuid);
@@ -1663,6 +1669,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                            UserHandle.USER_OWNER, PackageManager.DELETE_ALL_USERS);
                }
                mSettings.onVolumeForgotten(fsUuid);
                mSettings.writeLPr();
            }
        }
@@ -2239,17 +2246,16 @@ public class PackageManagerService extends IPackageManager.Stub {
            // cases get permissions that the user didn't initially explicitly
            // allow...  it would be nice to have some better way to handle
            // this situation.
            final boolean regrantPermissions = mSettings.mInternalSdkPlatform
                    != mSdkVersion;
            if (regrantPermissions) Slog.i(TAG, "Platform changed from "
                    + mSettings.mInternalSdkPlatform + " to " + mSdkVersion
                    + "; regranting permissions for internal storage");
            mSettings.mInternalSdkPlatform = mSdkVersion;
            updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL
                    | (regrantPermissions
                            ? (UPDATE_PERMISSIONS_REPLACE_PKG|UPDATE_PERMISSIONS_REPLACE_ALL)
                            : 0));
            final VersionInfo ver = mSettings.getInternalVersion();
            int updateFlags = UPDATE_PERMISSIONS_ALL;
            if (ver.sdkVersion != mSdkVersion) {
                Slog.i(TAG, "Platform changed from " + ver.sdkVersion + " to "
                        + mSdkVersion + "; regranting permissions for internal storage");
                updateFlags |= UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL;
            }
            updatePermissionsLPw(null, null, updateFlags);
            ver.sdkVersion = mSdkVersion;
            // If this is the first boot, and it is a normal boot, then
            // we need to initialize the default preferred apps.
@@ -2261,20 +2267,22 @@ public class PackageManagerService extends IPackageManager.Stub {
            // If this is first boot after an OTA, and a normal boot, then
            // we need to clear code cache directories.
            mIsUpgrade = !Build.FINGERPRINT.equals(mSettings.mFingerprint);
            mIsUpgrade = !Build.FINGERPRINT.equals(ver.fingerprint);
            if (mIsUpgrade && !onlyCore) {
                Slog.i(TAG, "Build fingerprint changed; clearing code caches");
                for (int i = 0; i < mSettings.mPackages.size(); i++) {
                    final PackageSetting ps = mSettings.mPackages.valueAt(i);
                    if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, ps.volumeUuid)) {
                        deleteCodeCacheDirsLI(ps.volumeUuid, ps.name);
                    }
                mSettings.mFingerprint = Build.FINGERPRINT;
                }
                ver.fingerprint = Build.FINGERPRINT;
            }
            checkDefaultBrowser();
            // All the changes are done during package scanning.
            mSettings.updateInternalDatabaseVersion();
            ver.databaseVersion = Settings.CURRENT_DATABASE_VERSION;
            // can downgrade to reader
            mSettings.writeLPr();
@@ -3915,10 +3923,8 @@ public class PackageManagerService extends IPackageManager.Stub {
     * were updated, return true.
     */
    private boolean isCompatSignatureUpdateNeeded(PackageParser.Package scannedPkg) {
        return (isExternal(scannedPkg) && mSettings.isExternalDatabaseVersionOlderThan(
                DatabaseVersion.SIGNATURE_END_ENTITY))
                || (!isExternal(scannedPkg) && mSettings.isInternalDatabaseVersionOlderThan(
                        DatabaseVersion.SIGNATURE_END_ENTITY));
        final VersionInfo ver = getSettingsVersionForPackage(scannedPkg);
        return ver.databaseVersion < DatabaseVersion.SIGNATURE_END_ENTITY;
    }
    /**
@@ -3965,13 +3971,8 @@ public class PackageManagerService extends IPackageManager.Stub {
    }
    private boolean isRecoverSignatureUpdateNeeded(PackageParser.Package scannedPkg) {
        if (isExternal(scannedPkg)) {
            return mSettings.isExternalDatabaseVersionOlderThan(
                    DatabaseVersion.SIGNATURE_MALFORMED_RECOVER);
        } else {
            return mSettings.isInternalDatabaseVersionOlderThan(
                    DatabaseVersion.SIGNATURE_MALFORMED_RECOVER);
        }
        final VersionInfo ver = getSettingsVersionForPackage(scannedPkg);
        return ver.databaseVersion < DatabaseVersion.SIGNATURE_MALFORMED_RECOVER;
    }
    private int compareSignaturesRecover(PackageSignatures existingSigs,
@@ -12487,6 +12488,18 @@ public class PackageManagerService extends IPackageManager.Stub {
        return installFlags;
    }
    private VersionInfo getSettingsVersionForPackage(PackageParser.Package pkg) {
        if (isExternal(pkg)) {
            if (TextUtils.isEmpty(pkg.volumeUuid)) {
                return mSettings.getExternalVersion();
            } else {
                return mSettings.findOrCreateVersion(pkg.volumeUuid);
            }
        } else {
            return mSettings.getInternalVersion();
        }
    }
    private void deleteTempPackageFiles() {
        final FilenameFilter filter = new FilenameFilter() {
            public boolean accept(File dir, String name) {
@@ -14752,16 +14765,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                    if (dumpState.onTitlePrinted())
                        pw.println();
                    pw.println("Database versions:");
                    pw.print("  SDK Version:");
                    pw.print(" internal=");
                    pw.print(mSettings.mInternalSdkPlatform);
                    pw.print(" external=");
                    pw.println(mSettings.mExternalSdkPlatform);
                    pw.print("  DB Version:");
                    pw.print(" internal=");
                    pw.print(mSettings.mInternalDatabaseVersion);
                    pw.print(" external=");
                    pw.println(mSettings.mExternalDatabaseVersion);
                    mSettings.dumpVersionLPr(new IndentingPrintWriter(pw, "  "));
                }
            }
@@ -15408,20 +15412,18 @@ public class PackageManagerService extends IPackageManager.Stub {
            // cases get permissions that the user didn't initially explicitly
            // allow... it would be nice to have some better way to handle
            // this situation.
            final boolean regrantPermissions = mSettings.mExternalSdkPlatform != mSdkVersion;
            if (regrantPermissions)
                Slog.i(TAG, "Platform changed from " + mSettings.mExternalSdkPlatform + " to "
                        + mSdkVersion + "; regranting permissions for external storage");
            mSettings.mExternalSdkPlatform = mSdkVersion;
            final VersionInfo ver = mSettings.getExternalVersion();
            // Make sure group IDs have been assigned, and any permission
            // changes in other apps are accounted for
            updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL
                    | (regrantPermissions
                            ? (UPDATE_PERMISSIONS_REPLACE_PKG|UPDATE_PERMISSIONS_REPLACE_ALL)
                            : 0));
            int updateFlags = UPDATE_PERMISSIONS_ALL;
            if (ver.sdkVersion != mSdkVersion) {
                logCriticalInfo(Log.INFO, "Platform changed from " + ver.sdkVersion + " to "
                        + mSdkVersion + "; regranting permissions for external");
                updateFlags |= UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL;
            }
            updatePermissionsLPw(null, null, updateFlags);
            mSettings.updateExternalDatabaseVersion();
            // Yay, everything is now upgraded
            ver.forceCurrent();
            // can downgrade to reader
            // Persist settings
@@ -15513,6 +15515,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        final int parseFlags = mDefParseFlags | PackageParser.PARSE_EXTERNAL_STORAGE;
        synchronized (mInstallLock) {
        synchronized (mPackages) {
            final VersionInfo ver = mSettings.findOrCreateVersion(vol.fsUuid);
            final List<PackageSetting> packages = mSettings.getVolumePackagesLPr(vol.fsUuid);
            for (PackageSetting ps : packages) {
                final PackageParser.Package pkg;
@@ -15522,9 +15525,22 @@ public class PackageManagerService extends IPackageManager.Stub {
                } catch (PackageManagerException e) {
                    Slog.w(TAG, "Failed to scan " + ps.codePath + ": " + e.getMessage());
                }
                if (!Build.FINGERPRINT.equals(ver.fingerprint)) {
                    deleteCodeCacheDirsLI(ps.volumeUuid, ps.name);
                }
            }
            int updateFlags = UPDATE_PERMISSIONS_ALL;
            if (ver.sdkVersion != mSdkVersion) {
                logCriticalInfo(Log.INFO, "Platform changed from " + ver.sdkVersion + " to "
                        + mSdkVersion + "; regranting permissions for " + vol.fsUuid);
                updateFlags |= UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL;
            }
            updatePermissionsLPw(null, null, updateFlags);
            // TODO: regrant any permissions that changed based since original install
            // Yay, everything is now upgraded
            ver.forceCurrent();
            mSettings.writeLPr();
        }
+141 −101

File changed.

Preview size limit exceeded, changes collapsed.