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

Commit 3cdf7d9a authored by JW Wang's avatar JW Wang Committed by Android (Google) Code Review
Browse files

Merge "Respect the rollback data policy (3/n)"

parents 1029e500 82768bf9
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.content.rollback;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.content.pm.PackageManager;
import android.content.pm.VersionedPackage;
import android.os.Parcel;
import android.os.Parcelable;
@@ -87,6 +88,11 @@ public final class PackageRollbackInfo implements Parcelable {
    // NOTE: Not a part of the Parcelable representation of this object.
    private final SparseLongArray mCeSnapshotInodes;

    /**
     * The userdata policy to execute when a rollback for this package is committed.
     */
    private final int mRollbackDataPolicy;

    /**
     * Returns the name of the package to roll back from.
     */
@@ -147,6 +153,11 @@ public final class PackageRollbackInfo implements Parcelable {
        return mIsApex;
    }

    /** @hide */
    public @PackageManager.RollbackDataPolicy int getRollbackDataPolicy() {
        return mRollbackDataPolicy;
    }

    /** @hide */
    public IntArray getSnapshottedUsers() {
        return mSnapshottedUsers;
@@ -181,11 +192,23 @@ public final class PackageRollbackInfo implements Parcelable {
            @NonNull IntArray pendingBackups, @NonNull ArrayList<RestoreInfo> pendingRestores,
            boolean isApex, @NonNull IntArray snapshottedUsers,
            @NonNull SparseLongArray ceSnapshotInodes) {
        this(packageRolledBackFrom, packageRolledBackTo, pendingBackups, pendingRestores, isApex,
                snapshottedUsers, ceSnapshotInodes, PackageManager.RollbackDataPolicy.RESTORE);
    }

    /** @hide */
    public PackageRollbackInfo(VersionedPackage packageRolledBackFrom,
            VersionedPackage packageRolledBackTo,
            @NonNull IntArray pendingBackups, @NonNull ArrayList<RestoreInfo> pendingRestores,
            boolean isApex, @NonNull IntArray snapshottedUsers,
            @NonNull SparseLongArray ceSnapshotInodes,
            @PackageManager.RollbackDataPolicy int rollbackDataPolicy) {
        this.mVersionRolledBackFrom = packageRolledBackFrom;
        this.mVersionRolledBackTo = packageRolledBackTo;
        this.mPendingBackups = pendingBackups;
        this.mPendingRestores = pendingRestores;
        this.mIsApex = isApex;
        this.mRollbackDataPolicy = rollbackDataPolicy;
        this.mSnapshottedUsers = snapshottedUsers;
        this.mCeSnapshotInodes = ceSnapshotInodes;
    }
@@ -198,6 +221,7 @@ public final class PackageRollbackInfo implements Parcelable {
        this.mPendingBackups = null;
        this.mSnapshottedUsers = null;
        this.mCeSnapshotInodes = null;
        this.mRollbackDataPolicy = PackageManager.RollbackDataPolicy.RESTORE;
    }

    @Override
+32 −9
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.rollback;

import android.content.pm.PackageManager;
import android.content.rollback.PackageRollbackInfo;
import android.content.rollback.PackageRollbackInfo.RestoreInfo;
import android.os.storage.StorageManager;
@@ -119,11 +120,22 @@ public class AppDataRollbackHelper {
        }

        try {
            mInstaller.restoreAppDataSnapshot(packageRollbackInfo.getPackageName(), appId, seInfo,
                    userId, rollbackId, storageFlags);
            switch (packageRollbackInfo.getRollbackDataPolicy()) {
                case PackageManager.RollbackDataPolicy.WIPE:
                    mInstaller.clearAppData(null, packageRollbackInfo.getPackageName(),
                            userId, storageFlags, 0);
                    break;
                case PackageManager.RollbackDataPolicy.RESTORE:
                    mInstaller.restoreAppDataSnapshot(packageRollbackInfo.getPackageName(), appId,
                            seInfo, userId, rollbackId, storageFlags);
                    break;
                default:
                    break;
            }
        } catch (InstallerException ie) {
            Slog.e(TAG, "Unable to restore app data snapshot: "
                        + packageRollbackInfo.getPackageName(), ie);
            Slog.e(TAG, "Unable to restore/wipe app data: "
                    + packageRollbackInfo.getPackageName() + " policy="
                    + packageRollbackInfo.getRollbackDataPolicy(), ie);
        }

        return changedRollback;
@@ -207,13 +219,24 @@ public class AppDataRollbackHelper {

            if (hasPendingRestore) {
                try {
                    switch (info.getRollbackDataPolicy()) {
                        case PackageManager.RollbackDataPolicy.WIPE:
                            mInstaller.clearAppData(null, info.getPackageName(), userId,
                                    Installer.FLAG_STORAGE_CE, 0);
                            break;
                        case PackageManager.RollbackDataPolicy.RESTORE:
                            mInstaller.restoreAppDataSnapshot(info.getPackageName(), ri.appId,
                                    ri.seInfo, userId, rollback.info.getRollbackId(),
                                    Installer.FLAG_STORAGE_CE);
                            break;
                        default:
                            break;
                    }
                    info.removeRestoreInfo(ri);
                } catch (InstallerException ie) {
                    Slog.e(TAG, "Unable to restore app data snapshot for: "
                            + info.getPackageName(), ie);
                    Slog.e(TAG, "Unable to restore/wipe app data for: "
                            + info.getPackageName() + " policy="
                            + info.getRollbackDataPolicy(), ie);
                }
            }
        }
+9 −6
Original line number Diff line number Diff line
@@ -306,7 +306,7 @@ class Rollback {
     * @return boolean True if the rollback was enabled successfully for the specified package.
     */
    boolean enableForPackage(String packageName, long newVersion, long installedVersion,
            boolean isApex, String sourceDir, String[] splitSourceDirs) {
            boolean isApex, String sourceDir, String[] splitSourceDirs, int rollbackDataPolicy) {
        try {
            RollbackStore.backupPackageCodePath(this, packageName, sourceDir);
            if (!ArrayUtils.isEmpty(splitSourceDirs)) {
@@ -323,7 +323,8 @@ class Rollback {
                new VersionedPackage(packageName, newVersion),
                new VersionedPackage(packageName, installedVersion),
                new IntArray() /* pendingBackups */, new ArrayList<>() /* pendingRestores */,
                isApex, new IntArray(), new SparseLongArray() /* ceSnapshotInodes */);
                isApex, new IntArray(), new SparseLongArray() /* ceSnapshotInodes */,
                rollbackDataPolicy);

        synchronized (mLock) {
            info.getPackages().add(packageRollbackInfo);
@@ -344,10 +345,12 @@ class Rollback {

            for (PackageRollbackInfo pkgRollbackInfo : info.getPackages()) {
                if (pkgRollbackInfo.getPackageName().equals(packageName)) {
                    if (pkgRollbackInfo.getRollbackDataPolicy()
                            == PackageManager.RollbackDataPolicy.RESTORE) {
                        dataHelper.snapshotAppData(info.getRollbackId(), pkgRollbackInfo, userIds);

                    RollbackStore.saveRollback(this);
                        pkgRollbackInfo.getSnapshottedUsers().addAll(IntArray.wrap(userIds));
                        RollbackStore.saveRollback(this);
                    }
                    break;
                }
            }
+1 −1
Original line number Diff line number Diff line
@@ -841,7 +841,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
        ApplicationInfo appInfo = pkgInfo.applicationInfo;
        return rollback.enableForPackage(packageName, newPackage.versionCode,
                pkgInfo.getLongVersionCode(), isApex, appInfo.sourceDir,
                appInfo.splitSourceDirs);
                appInfo.splitSourceDirs, session.rollbackDataPolicy);
    }

    @Override
+9 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.os.UserHandle.USER_SYSTEM;
import static com.android.server.rollback.Rollback.rollbackStateFromString;

import android.annotation.NonNull;
import android.content.pm.PackageManager;
import android.content.pm.VersionedPackage;
import android.content.rollback.PackageRollbackInfo;
import android.content.rollback.PackageRollbackInfo.RestoreInfo;
@@ -345,6 +346,8 @@ class RollbackStore {
        json.put("installedUsers", convertToJsonArray(snapshottedUsers));
        json.put("ceSnapshotInodes", ceSnapshotInodesToJson(info.getCeSnapshotInodes()));

        json.put("rollbackDataPolicy", info.getRollbackDataPolicy());

        return json;
    }

@@ -367,8 +370,13 @@ class RollbackStore {
        final SparseLongArray ceSnapshotInodes = ceSnapshotInodesFromJson(
                json.getJSONArray("ceSnapshotInodes"));

        // Backward compatibility: no such field for old versions.
        final int rollbackDataPolicy = json.optInt("rollbackDataPolicy",
                PackageManager.RollbackDataPolicy.RESTORE);

        return new PackageRollbackInfo(versionRolledBackFrom, versionRolledBackTo,
                pendingBackups, pendingRestores, isApex, snapshottedUsers, ceSnapshotInodes);
                pendingBackups, pendingRestores, isApex, snapshottedUsers, ceSnapshotInodes,
                rollbackDataPolicy);
    }

    private static JSONArray versionedPackagesToJson(List<VersionedPackage> packages)
Loading