summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/rollback/RollbackInfo.java18
-rw-r--r--services/core/java/com/android/server/rollback/AppDataRollbackHelper.java6
-rw-r--r--services/core/java/com/android/server/rollback/RollbackData.java51
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java89
-rw-r--r--services/core/java/com/android/server/rollback/RollbackStore.java104
-rw-r--r--services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java16
6 files changed, 156 insertions, 128 deletions
diff --git a/core/java/android/content/rollback/RollbackInfo.java b/core/java/android/content/rollback/RollbackInfo.java
index 0cde6ba38099..9459ad366f76 100644
--- a/core/java/android/content/rollback/RollbackInfo.java
+++ b/core/java/android/content/rollback/RollbackInfo.java
@@ -17,12 +17,10 @@
package android.content.rollback;
import android.annotation.SystemApi;
-import android.content.pm.PackageInstaller;
import android.content.pm.VersionedPackage;
import android.os.Parcel;
import android.os.Parcelable;
-import java.util.Collections;
import java.util.List;
/**
@@ -44,13 +42,7 @@ public final class RollbackInfo implements Parcelable {
private final List<VersionedPackage> mCausePackages;
private final boolean mIsStaged;
- private final int mCommittedSessionId;
-
- /** @hide */
- public RollbackInfo(int rollbackId, List<PackageRollbackInfo> packages, boolean isStaged) {
- this(rollbackId, packages, isStaged, Collections.emptyList(),
- PackageInstaller.SessionInfo.INVALID_ID);
- }
+ private int mCommittedSessionId;
/** @hide */
public RollbackInfo(int rollbackId, List<PackageRollbackInfo> packages, boolean isStaged,
@@ -101,6 +93,14 @@ public final class RollbackInfo implements Parcelable {
}
/**
+ * Sets the session ID for the committed rollback for staged rollbacks.
+ * @hide
+ */
+ public void setCommittedSessionId(int sessionId) {
+ mCommittedSessionId = sessionId;
+ }
+
+ /**
* Gets the list of package versions that motivated this rollback.
* As provided to {@link #commitRollback} when the rollback was committed.
* This is only applicable for rollbacks that have been committed.
diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
index e9ccea54fe99..36f18f05c23e 100644
--- a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
+++ b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
@@ -166,7 +166,7 @@ public class AppDataRollbackHelper {
List<RollbackData> rd = new ArrayList<>();
for (RollbackData data : availableRollbacks) {
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
final IntArray pendingBackupUsers = info.getPendingBackups();
if (pendingBackupUsers != null) {
final int idx = pendingBackupUsers.indexOf(userId);
@@ -246,13 +246,13 @@ public class AppDataRollbackHelper {
if (!pendingBackupPackages.isEmpty()) {
for (RollbackData data : pendingBackups) {
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
final IntArray pendingBackupUsers = info.getPendingBackups();
final int idx = pendingBackupUsers.indexOf(userId);
if (idx != -1) {
try {
long ceSnapshotInode = mInstaller.snapshotAppData(info.getPackageName(),
- userId, data.rollbackId, Installer.FLAG_STORAGE_CE);
+ userId, data.info.getRollbackId(), Installer.FLAG_STORAGE_CE);
info.putCeSnapshotInode(userId, ceSnapshotInode);
pendingBackupUsers.remove(idx);
} catch (InstallerException ie) {
diff --git a/services/core/java/com/android/server/rollback/RollbackData.java b/services/core/java/com/android/server/rollback/RollbackData.java
index fcd5297f1363..655bf4ab57a7 100644
--- a/services/core/java/com/android/server/rollback/RollbackData.java
+++ b/services/core/java/com/android/server/rollback/RollbackData.java
@@ -16,12 +16,11 @@
package com.android.server.rollback;
-import android.content.rollback.PackageRollbackInfo;
+import android.content.rollback.RollbackInfo;
import java.io.File;
import java.time.Instant;
import java.util.ArrayList;
-import java.util.List;
/**
* Information about a rollback available for a set of atomically installed
@@ -29,14 +28,9 @@ import java.util.List;
*/
class RollbackData {
/**
- * A unique identifier for this rollback.
+ * The rollback info for this rollback.
*/
- public final int rollbackId;
-
- /**
- * The per-package rollback information.
- */
- public final List<PackageRollbackInfo> packages = new ArrayList<>();
+ public final RollbackInfo info;
/**
* The directory where the rollback data is stored.
@@ -69,24 +63,49 @@ class RollbackData {
public int apkSessionId = -1;
/**
- * Whether this Rollback is currently in progress. This field is true from the point
- * we commit a {@code PackageInstaller} session containing these packages to the point the
- * {@code PackageInstaller} calls into the {@code onFinished} callback.
+ * True if we are expecting the package manager to call restoreUserData
+ * for this rollback because it has just been committed but the rollback
+ * has not yet been fully applied.
*/
// NOTE: All accesses to this field are from the RollbackManager handler thread.
- public boolean inProgress = false;
+ public boolean restoreUserDataInProgress = false;
- RollbackData(int rollbackId, File backupDir, int stagedSessionId, boolean isAvailable) {
- this.rollbackId = rollbackId;
+ /**
+ * Constructs a new, empty RollbackData instance.
+ *
+ * @param rollbackId the id of the rollback.
+ * @param backupDir the directory where the rollback data is stored.
+ * @param stagedSessionId the session id if this is a staged rollback, -1 otherwise.
+ */
+ RollbackData(int rollbackId, File backupDir, int stagedSessionId) {
+ this.info = new RollbackInfo(rollbackId,
+ /* packages */ new ArrayList<>(),
+ /* isStaged */ stagedSessionId != -1,
+ /* causePackages */ new ArrayList<>(),
+ /* committedSessionId */ -1);
+ this.backupDir = backupDir;
+ this.stagedSessionId = stagedSessionId;
+ this.isAvailable = (stagedSessionId == -1);
+ }
+
+ /**
+ * Constructs a RollbackData instance with full rollback data information.
+ */
+ RollbackData(RollbackInfo info, File backupDir, Instant timestamp, int stagedSessionId,
+ boolean isAvailable, int apkSessionId, boolean restoreUserDataInProgress) {
+ this.info = info;
this.backupDir = backupDir;
+ this.timestamp = timestamp;
this.stagedSessionId = stagedSessionId;
this.isAvailable = isAvailable;
+ this.apkSessionId = apkSessionId;
+ this.restoreUserDataInProgress = restoreUserDataInProgress;
}
/**
* Whether the rollback is for rollback of a staged install.
*/
public boolean isStaged() {
- return stagedSessionId != -1;
+ return info.isStaged();
}
}
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index 88a5fb48ada4..52d441255da6 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -243,8 +243,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
RollbackData data = mAvailableRollbacks.get(i);
if (data.isAvailable) {
- rollbacks.add(new RollbackInfo(data.rollbackId,
- data.packages, data.isStaged()));
+ rollbacks.add(data.info);
}
}
return new ParceledListSlice<>(rollbacks);
@@ -297,12 +296,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
data.timestamp = data.timestamp.plusMillis(timeDifference);
try {
- mRollbackStore.saveAvailableRollback(data);
+ mRollbackStore.saveRollbackData(data);
} catch (IOException ioe) {
// TODO: figure out the right way to deal with this, especially if
// it fails for some data and succeeds for others.
- Log.e(TAG, "Unable to save rollback info for : " + data.rollbackId,
- ioe);
+ Log.e(TAG, "Unable to save rollback info for : "
+ + data.info.getRollbackId(), ioe);
}
}
@@ -335,7 +334,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return;
}
- if (data.inProgress) {
+ if (data.restoreUserDataInProgress) {
sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
"Rollback for package is already in progress.");
return;
@@ -349,7 +348,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
// rollback racing with a roll-forward fix of a buggy package.
// Figure out how to ensure we don't commit the rollback if
// roll forward happens at the same time.
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
VersionedPackage installedVersion = getInstalledPackageVersion(info.getPackageName());
if (installedVersion == null) {
// TODO: Test this case
@@ -391,7 +390,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
int parentSessionId = packageInstaller.createSession(parentParams);
PackageInstaller.Session parentSession = packageInstaller.openSession(parentSessionId);
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
// TODO: We can't get the installerPackageName for apex
@@ -441,7 +440,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
getHandler().post(() -> {
// We've now completed the rollback, so we mark it as no longer in
// progress.
- data.inProgress = false;
+ data.restoreUserDataInProgress = false;
int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
PackageInstaller.STATUS_FAILURE);
@@ -453,9 +452,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return;
}
- addRecentlyExecutedRollback(new RollbackInfo(
- data.rollbackId, data.packages, data.isStaged(),
- causePackages, parentSessionId));
+ data.info.setCommittedSessionId(parentSessionId);
+ data.info.getCausePackages().addAll(causePackages);
+ addRecentlyExecutedRollback(data.info);
sendSuccess(statusReceiver);
Intent broadcast = new Intent(Intent.ACTION_ROLLBACK_COMMITTED);
@@ -469,7 +468,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
);
- data.inProgress = true;
+ data.restoreUserDataInProgress = true;
parentSession.commit(receiver.getIntentSender());
} catch (IOException e) {
Log.e(TAG, "Rollback failed", e);
@@ -510,7 +509,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
while (iter.hasNext()) {
RollbackData data = iter.next();
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
if (info.getPackageName().equals(packageName)) {
iter.remove();
deleteRollback(data);
@@ -537,9 +536,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
for (RollbackData rd : changed) {
try {
- mRollbackStore.saveAvailableRollback(rd);
+ mRollbackStore.saveRollbackData(rd);
} catch (IOException ioe) {
- Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe);
+ Log.e(TAG, "Unable to save rollback info for : "
+ + rd.info.getRollbackId(), ioe);
}
}
@@ -575,7 +575,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
for (RollbackData data : mAvailableRollbacks) {
- if (data.stagedSessionId != -1) {
+ if (!data.isAvailable && data.isStaged()) {
staged.add(data);
}
}
@@ -591,10 +591,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
data.isAvailable = true;
}
try {
- mRollbackStore.saveAvailableRollback(data);
+ mRollbackStore.saveRollbackData(data);
} catch (IOException ioe) {
Log.e(TAG, "Unable to save rollback info for : "
- + data.rollbackId, ioe);
+ + data.info.getRollbackId(), ioe);
}
} else if (session.isStagedSessionFailed()) {
// TODO: Do we need to remove this from
@@ -641,7 +641,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
private void loadAllRollbackDataLocked() {
mAvailableRollbacks = mRollbackStore.loadAvailableRollbacks();
for (RollbackData data : mAvailableRollbacks) {
- mAllocatedRollbackIds.put(data.rollbackId, true);
+ mAllocatedRollbackIds.put(data.info.getRollbackId(), true);
}
mRecentlyExecutedRollbacks = mRollbackStore.loadRecentlyExecutedRollbacks();
@@ -665,7 +665,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
while (iter.hasNext()) {
RollbackData data = iter.next();
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
if (info.getPackageName().equals(packageName)
&& !packageVersionsEqual(
info.getVersionRolledBackFrom(),
@@ -897,18 +897,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return false;
}
String packageName = newPackage.packageName;
- for (PackageRollbackInfo info : rd.packages) {
+ for (PackageRollbackInfo info : rd.info.getPackages()) {
if (info.getPackageName().equals(packageName)) {
info.getInstalledUsers().addAll(IntArray.wrap(installedUsers));
- mAppDataRollbackHelper.snapshotAppData(rd.rollbackId, info);
+ mAppDataRollbackHelper.snapshotAppData(rd.info.getRollbackId(), info);
try {
- mRollbackStore.saveAvailableRollback(rd);
+ mRollbackStore.saveRollbackData(rd);
} catch (IOException ioe) {
// TODO: Hopefully this is okay because we will try
// again to save the rollback when the staged session
// is applied. Just so long as the device doesn't
// reboot before then.
- Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe);
+ Log.e(TAG, "Unable to save rollback info for : "
+ + rd.info.getRollbackId(), ioe);
}
return true;
}
@@ -989,14 +990,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
if (data == null) {
int rollbackId = allocateRollbackIdLocked();
if (session.isStaged()) {
- data = mRollbackStore.createPendingStagedRollback(rollbackId,
- parentSessionId);
+ data = mRollbackStore.createStagedRollback(rollbackId, parentSessionId);
} else {
- data = mRollbackStore.createAvailableRollback(rollbackId);
+ data = mRollbackStore.createNonStagedRollback(rollbackId);
}
mPendingRollbacks.put(parentSessionId, data);
}
- data.packages.add(info);
+ data.info.getPackages().add(info);
}
} catch (IOException e) {
Log.e(TAG, "Unable to create rollback for " + packageName, e);
@@ -1004,7 +1004,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
if (snapshotUserData && !isApex) {
- mAppDataRollbackHelper.snapshotAppData(data.rollbackId, info);
+ mAppDataRollbackHelper.snapshotAppData(data.info.getRollbackId(), info);
}
try {
@@ -1044,7 +1044,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return;
}
- if (!rollbackData.inProgress) {
+ if (!rollbackData.restoreUserDataInProgress) {
Log.e(TAG, "Request to restore userData for: " + packageName
+ ", but no rollback in progress.");
return;
@@ -1053,12 +1053,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
for (int userId : userIds) {
final PackageRollbackInfo info = getPackageRollbackInfo(rollbackData, packageName);
final boolean changedRollbackData = mAppDataRollbackHelper.restoreAppData(
- rollbackData.rollbackId, info, userId, appId, seInfo);
+ rollbackData.info.getRollbackId(), info, userId, appId, seInfo);
// We've updated metadata about this rollback, so save it to flash.
if (changedRollbackData) {
try {
- mRollbackStore.saveAvailableRollback(rollbackData);
+ mRollbackStore.saveRollbackData(rollbackData);
} catch (IOException ioe) {
// TODO(narayan): What is the right thing to do here ? This isn't a fatal
// error, since it will only result in us trying to restore data again,
@@ -1137,9 +1137,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
if (rd != null) {
try {
- mRollbackStore.saveAvailableRollback(rd);
+ mRollbackStore.saveRollbackData(rd);
} catch (IOException ioe) {
- Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe);
+ Log.e(TAG, "Unable to save rollback info for : "
+ + rd.info.getRollbackId(), ioe);
}
}
});
@@ -1212,7 +1213,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
try {
data.timestamp = Instant.now();
- mRollbackStore.saveAvailableRollback(data);
+ mRollbackStore.saveRollbackData(data);
synchronized (mLock) {
// Note: There is a small window of time between when
// the session has been committed by the package
@@ -1233,8 +1234,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
// After enabling and commiting any rollback, observe packages and
// prepare to rollback if packages crashes too frequently.
List<String> packages = new ArrayList<>();
- for (int i = 0; i < data.packages.size(); i++) {
- packages.add(data.packages.get(i).getPackageName());
+ for (int i = 0; i < data.info.getPackages().size(); i++) {
+ packages.add(data.info.getPackages().get(i).getPackageName());
}
mPackageHealthObserver.startObservingHealth(packages,
mRollbackLifetimeDurationInMillis);
@@ -1307,7 +1308,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
ensureRollbackDataLoadedLocked();
for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
RollbackData data = mAvailableRollbacks.get(i);
- if (data.isAvailable && data.rollbackId == rollbackId) {
+ if (data.isAvailable && data.info.getRollbackId() == rollbackId) {
return data;
}
}
@@ -1322,7 +1323,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
*/
private static PackageRollbackInfo getPackageRollbackInfo(RollbackData data,
String packageName) {
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
if (info.getPackageName().equals(packageName)) {
return info;
}
@@ -1347,14 +1348,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
private void deleteRollback(RollbackData rollbackData) {
- for (PackageRollbackInfo info : rollbackData.packages) {
+ for (PackageRollbackInfo info : rollbackData.info.getPackages()) {
IntArray installedUsers = info.getInstalledUsers();
for (int i = 0; i < installedUsers.size(); i++) {
int userId = installedUsers.get(i);
- mAppDataRollbackHelper.destroyAppDataSnapshot(rollbackData.rollbackId, info,
- userId);
+ mAppDataRollbackHelper.destroyAppDataSnapshot(rollbackData.info.getRollbackId(),
+ info, userId);
}
}
- mRollbackStore.deleteAvailableRollback(rollbackData);
+ mRollbackStore.deleteRollbackData(rollbackData);
}
}
diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java
index bb4e89eca5da..ecdb2ccd872b 100644
--- a/services/core/java/com/android/server/rollback/RollbackStore.java
+++ b/services/core/java/com/android/server/rollback/RollbackStore.java
@@ -183,6 +183,25 @@ class RollbackStore {
return ceSnapshotInodes;
}
+ private static JSONObject rollbackInfoToJson(RollbackInfo rollback) throws JSONException {
+ JSONObject json = new JSONObject();
+ json.put("rollbackId", rollback.getRollbackId());
+ json.put("packages", toJson(rollback.getPackages()));
+ json.put("isStaged", rollback.isStaged());
+ json.put("causePackages", versionedPackagesToJson(rollback.getCausePackages()));
+ json.put("committedSessionId", rollback.getCommittedSessionId());
+ return json;
+ }
+
+ private static RollbackInfo rollbackInfoFromJson(JSONObject json) throws JSONException {
+ return new RollbackInfo(
+ json.getInt("rollbackId"),
+ packageRollbackInfosFromJson(json.getJSONArray("packages")),
+ json.getBoolean("isStaged"),
+ versionedPackagesFromJson(json.getJSONArray("causePackages")),
+ json.getInt("committedSessionId"));
+ }
+
/**
* Reads the list of recently executed rollbacks from persistent storage.
*/
@@ -197,17 +216,7 @@ class RollbackStore {
JSONObject object = new JSONObject(jsonString);
JSONArray array = object.getJSONArray("recentlyExecuted");
for (int i = 0; i < array.length(); ++i) {
- JSONObject element = array.getJSONObject(i);
- int rollbackId = element.getInt("rollbackId");
- List<PackageRollbackInfo> packages = packageRollbackInfosFromJson(
- element.getJSONArray("packages"));
- boolean isStaged = element.getBoolean("isStaged");
- List<VersionedPackage> causePackages = versionedPackagesFromJson(
- element.getJSONArray("causePackages"));
- int committedSessionId = element.getInt("committedSessionId");
- RollbackInfo rollback = new RollbackInfo(rollbackId, packages, isStaged,
- causePackages, committedSessionId);
- recentlyExecutedRollbacks.add(rollback);
+ recentlyExecutedRollbacks.add(rollbackInfoFromJson(array.getJSONObject(i)));
}
} catch (IOException | JSONException e) {
// TODO: What to do here? Surely we shouldn't just forget about
@@ -220,17 +229,22 @@ class RollbackStore {
}
/**
- * Creates a new RollbackData instance with backupDir assigned.
+ * Creates a new RollbackData instance for a non-staged rollback with
+ * backupDir assigned.
*/
- RollbackData createAvailableRollback(int rollbackId) throws IOException {
+ RollbackData createNonStagedRollback(int rollbackId) throws IOException {
File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId));
- return new RollbackData(rollbackId, backupDir, -1, true);
+ return new RollbackData(rollbackId, backupDir, -1);
}
- RollbackData createPendingStagedRollback(int rollbackId, int stagedSessionId)
+ /**
+ * Creates a new RollbackData instance for a staged rollback with
+ * backupDir assigned.
+ */
+ RollbackData createStagedRollback(int rollbackId, int stagedSessionId)
throws IOException {
File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId));
- return new RollbackData(rollbackId, backupDir, stagedSessionId, false);
+ return new RollbackData(rollbackId, backupDir, stagedSessionId);
}
/**
@@ -263,17 +277,17 @@ class RollbackStore {
}
/**
- * Writes the metadata for an available rollback to persistent storage.
+ * Saves the rollback data to persistent storage.
*/
- void saveAvailableRollback(RollbackData data) throws IOException {
+ void saveRollbackData(RollbackData data) throws IOException {
try {
JSONObject dataJson = new JSONObject();
- dataJson.put("rollbackId", data.rollbackId);
- dataJson.put("packages", toJson(data.packages));
+ dataJson.put("info", rollbackInfoToJson(data.info));
dataJson.put("timestamp", data.timestamp.toString());
dataJson.put("stagedSessionId", data.stagedSessionId);
dataJson.put("isAvailable", data.isAvailable);
dataJson.put("apkSessionId", data.apkSessionId);
+ dataJson.put("restoreUserDataInProgress", data.restoreUserDataInProgress);
PrintWriter pw = new PrintWriter(new File(data.backupDir, "rollback.json"));
pw.println(dataJson.toString());
@@ -284,10 +298,9 @@ class RollbackStore {
}
/**
- * Removes all persistant storage associated with the given available
- * rollback.
+ * Removes all persistant storage associated with the given rollback data.
*/
- void deleteAvailableRollback(RollbackData data) {
+ void deleteRollbackData(RollbackData data) {
removeFile(data.backupDir);
}
@@ -302,13 +315,7 @@ class RollbackStore {
for (int i = 0; i < recentlyExecutedRollbacks.size(); ++i) {
RollbackInfo rollback = recentlyExecutedRollbacks.get(i);
- JSONObject element = new JSONObject();
- element.put("rollbackId", rollback.getRollbackId());
- element.put("packages", toJson(rollback.getPackages()));
- element.put("isStaged", rollback.isStaged());
- element.put("causePackages", versionedPackagesToJson(rollback.getCausePackages()));
- element.put("committedSessionId", rollback.getCommittedSessionId());
- array.put(element);
+ array.put(rollbackInfoToJson(rollback));
}
PrintWriter pw = new PrintWriter(mRecentlyExecutedRollbacksFile);
@@ -324,40 +331,39 @@ class RollbackStore {
* Reads the metadata for a rollback from the given directory.
* @throws IOException in case of error reading the data.
*/
- private RollbackData loadRollbackData(File backupDir) throws IOException {
+ private static RollbackData loadRollbackData(File backupDir) throws IOException {
try {
File rollbackJsonFile = new File(backupDir, "rollback.json");
JSONObject dataJson = new JSONObject(
IoUtils.readFileAsString(rollbackJsonFile.getAbsolutePath()));
- int rollbackId = dataJson.getInt("rollbackId");
- int stagedSessionId = dataJson.getInt("stagedSessionId");
- boolean isAvailable = dataJson.getBoolean("isAvailable");
- RollbackData data = new RollbackData(rollbackId, backupDir,
- stagedSessionId, isAvailable);
- data.packages.addAll(packageRollbackInfosFromJson(dataJson.getJSONArray("packages")));
- data.timestamp = Instant.parse(dataJson.getString("timestamp"));
- data.apkSessionId = dataJson.getInt("apkSessionId");
- return data;
+ return new RollbackData(
+ rollbackInfoFromJson(dataJson.getJSONObject("info")),
+ backupDir,
+ Instant.parse(dataJson.getString("timestamp")),
+ dataJson.getInt("stagedSessionId"),
+ dataJson.getBoolean("isAvailable"),
+ dataJson.getInt("apkSessionId"),
+ dataJson.getBoolean("restoreUserDataInProgress"));
} catch (JSONException | DateTimeParseException e) {
throw new IOException(e);
}
}
- private JSONObject toJson(VersionedPackage pkg) throws JSONException {
+ private static JSONObject toJson(VersionedPackage pkg) throws JSONException {
JSONObject json = new JSONObject();
json.put("packageName", pkg.getPackageName());
json.put("longVersionCode", pkg.getLongVersionCode());
return json;
}
- private VersionedPackage versionedPackageFromJson(JSONObject json) throws JSONException {
+ private static VersionedPackage versionedPackageFromJson(JSONObject json) throws JSONException {
String packageName = json.getString("packageName");
long longVersionCode = json.getLong("longVersionCode");
return new VersionedPackage(packageName, longVersionCode);
}
- private JSONObject toJson(PackageRollbackInfo info) throws JSONException {
+ private static JSONObject toJson(PackageRollbackInfo info) throws JSONException {
JSONObject json = new JSONObject();
json.put("versionRolledBackFrom", toJson(info.getVersionRolledBackFrom()));
json.put("versionRolledBackTo", toJson(info.getVersionRolledBackTo()));
@@ -376,7 +382,8 @@ class RollbackStore {
return json;
}
- private PackageRollbackInfo packageRollbackInfoFromJson(JSONObject json) throws JSONException {
+ private static PackageRollbackInfo packageRollbackInfoFromJson(JSONObject json)
+ throws JSONException {
VersionedPackage versionRolledBackFrom = versionedPackageFromJson(
json.getJSONObject("versionRolledBackFrom"));
VersionedPackage versionRolledBackTo = versionedPackageFromJson(
@@ -397,7 +404,7 @@ class RollbackStore {
pendingBackups, pendingRestores, isApex, installedUsers, ceSnapshotInodes);
}
- private JSONArray versionedPackagesToJson(List<VersionedPackage> packages)
+ private static JSONArray versionedPackagesToJson(List<VersionedPackage> packages)
throws JSONException {
JSONArray json = new JSONArray();
for (VersionedPackage pkg : packages) {
@@ -406,7 +413,8 @@ class RollbackStore {
return json;
}
- private List<VersionedPackage> versionedPackagesFromJson(JSONArray json) throws JSONException {
+ private static List<VersionedPackage> versionedPackagesFromJson(JSONArray json)
+ throws JSONException {
List<VersionedPackage> packages = new ArrayList<>();
for (int i = 0; i < json.length(); ++i) {
packages.add(versionedPackageFromJson(json.getJSONObject(i)));
@@ -414,7 +422,7 @@ class RollbackStore {
return packages;
}
- private JSONArray toJson(List<PackageRollbackInfo> infos) throws JSONException {
+ private static JSONArray toJson(List<PackageRollbackInfo> infos) throws JSONException {
JSONArray json = new JSONArray();
for (PackageRollbackInfo info : infos) {
json.put(toJson(info));
@@ -422,7 +430,7 @@ class RollbackStore {
return json;
}
- private List<PackageRollbackInfo> packageRollbackInfosFromJson(JSONArray json)
+ private static List<PackageRollbackInfo> packageRollbackInfosFromJson(JSONArray json)
throws JSONException {
List<PackageRollbackInfo> infos = new ArrayList<>();
for (int i = 0; i < json.length(); ++i) {
diff --git a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
index d848b2dc75fe..fc7ccc576abb 100644
--- a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
@@ -236,20 +236,20 @@ public class AppDataRollbackHelperTest {
wasRecentlyRestored.getPendingRestores().add(
new RestoreInfo(73 /* userId */, 239 /* appId*/, "seInfo"));
- RollbackData dataWithPendingBackup = new RollbackData(101, new File("/does/not/exist"), -1,
- true);
- dataWithPendingBackup.packages.add(pendingBackup);
+ RollbackData dataWithPendingBackup = new RollbackData(101, new File("/does/not/exist"), -1);
+ dataWithPendingBackup.info.getPackages().add(pendingBackup);
RollbackData dataWithRecentRestore = new RollbackData(17239, new File("/does/not/exist"),
- -1, true);
- dataWithRecentRestore.packages.add(wasRecentlyRestored);
+ -1);
+ dataWithRecentRestore.info.getPackages().add(wasRecentlyRestored);
RollbackData dataForDifferentUser = new RollbackData(17239, new File("/does/not/exist"),
- -1, true);
- dataForDifferentUser.packages.add(ignoredInfo);
+ -1);
+ dataForDifferentUser.info.getPackages().add(ignoredInfo);
RollbackInfo rollbackInfo = new RollbackInfo(17239,
- Arrays.asList(pendingRestore, wasRecentlyRestored), false);
+ Arrays.asList(pendingRestore, wasRecentlyRestored), false,
+ new ArrayList<>(), -1);
List<RollbackData> changed = helper.commitPendingBackupAndRestoreForUser(37,
Arrays.asList(dataWithPendingBackup, dataWithRecentRestore, dataForDifferentUser),