Loading core/java/android/content/rollback/PackageRollbackInfo.java +24 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. */ Loading Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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 Loading services/core/java/com/android/server/rollback/AppDataRollbackHelper.java +32 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); } } } Loading services/core/java/com/android/server/rollback/Rollback.java +9 −6 Original line number Diff line number Diff line Loading @@ -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)) { Loading @@ -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); Loading @@ -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; } } Loading services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading services/core/java/com/android/server/rollback/RollbackStore.java +9 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -345,6 +346,8 @@ class RollbackStore { json.put("installedUsers", convertToJsonArray(snapshottedUsers)); json.put("ceSnapshotInodes", ceSnapshotInodesToJson(info.getCeSnapshotInodes())); json.put("rollbackDataPolicy", info.getRollbackDataPolicy()); return json; } Loading @@ -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 Loading
core/java/android/content/rollback/PackageRollbackInfo.java +24 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. */ Loading Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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 Loading
services/core/java/com/android/server/rollback/AppDataRollbackHelper.java +32 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); } } } Loading
services/core/java/com/android/server/rollback/Rollback.java +9 −6 Original line number Diff line number Diff line Loading @@ -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)) { Loading @@ -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); Loading @@ -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; } } Loading
services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
services/core/java/com/android/server/rollback/RollbackStore.java +9 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -345,6 +346,8 @@ class RollbackStore { json.put("installedUsers", convertToJsonArray(snapshottedUsers)); json.put("ceSnapshotInodes", ceSnapshotInodesToJson(info.getCeSnapshotInodes())); json.put("rollbackDataPolicy", info.getRollbackDataPolicy()); return json; } Loading @@ -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