summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/rollback/IRollbackManager.aidl4
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java2
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java60
3 files changed, 46 insertions, 20 deletions
diff --git a/core/java/android/content/rollback/IRollbackManager.aidl b/core/java/android/content/rollback/IRollbackManager.aidl
index db9fcb6abdfa..1b84f2987a8f 100644
--- a/core/java/android/content/rollback/IRollbackManager.aidl
+++ b/core/java/android/content/rollback/IRollbackManager.aidl
@@ -30,9 +30,9 @@ interface IRollbackManager {
String callerPackageName, in IntentSender statusReceiver);
// Exposed for use from the system server only. Callback from the package
- // manager during the install flow when user data can be restored for a given
+ // manager during the install flow when user data can be backed up and restored for a given
// package.
- void restoreUserData(String packageName, in int[] userIds, int appId, long ceDataInode,
+ void snapshotAndRestoreUserData(String packageName, in int[] userIds, int appId, long ceDataInode,
String seInfo, int token);
// Exposed for test purposes only.
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 84470f9c2838..6ad32495c0ba 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -14748,7 +14748,7 @@ public class PackageManagerService extends IPackageManager.Stub
if (ps != null) {
try {
- rm.restoreUserData(packageName, installedUsers, appId, ceDataInode,
+ rm.snapshotAndRestoreUserData(packageName, installedUsers, appId, ceDataInode,
seInfo, token);
} catch (RemoteException re) {
// Cannot happen, the RollbackManager is hosted in the same process.
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index 9a2778dbf535..301f65061045 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -923,8 +923,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
if (rd != null) {
- // This is the apk session for a staged session. We have already
- // backed up the apks, we just need to do user data backup.
+ // This is the apk session for a staged session. We do not need to create a new rollback
+ // for this session.
PackageParser.PackageLite newPackage = null;
try {
newPackage = PackageParser.parsePackageLite(
@@ -937,8 +937,6 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
for (PackageRollbackInfo info : rd.info.getPackages()) {
if (info.getPackageName().equals(packageName)) {
info.getInstalledUsers().addAll(IntArray.wrap(installedUsers));
- mAppDataRollbackHelper.snapshotAppData(rd.info.getRollbackId(), info);
- saveRollbackData(rd);
return true;
}
}
@@ -959,8 +957,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
newRollback.addToken(token);
- return enableRollbackForPackageSession(newRollback.data, packageSession,
- installedUsers, /* snapshotUserData*/ true);
+ return enableRollbackForPackageSession(newRollback.data, packageSession, installedUsers);
}
/**
@@ -971,8 +968,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
* @return true on success, false on failure.
*/
private boolean enableRollbackForPackageSession(RollbackData data,
- PackageInstaller.SessionInfo session, @NonNull int[] installedUsers,
- boolean snapshotUserData) {
+ PackageInstaller.SessionInfo session, @NonNull int[] installedUsers) {
// TODO: Don't attempt to enable rollback for split installs.
final int installFlags = session.installFlags;
if ((installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) == 0) {
@@ -1033,10 +1029,6 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
isApex, IntArray.wrap(installedUsers),
new SparseLongArray() /* ceSnapshotInodes */);
- if (snapshotUserData && !isApex) {
- mAppDataRollbackHelper.snapshotAppData(data.info.getRollbackId(), packageRollbackInfo);
- }
-
try {
ApplicationInfo appInfo = pkgInfo.applicationInfo;
RollbackStore.backupPackageCodePath(data, packageName, appInfo.sourceDir);
@@ -1057,13 +1049,15 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
@Override
- public void restoreUserData(String packageName, int[] userIds, int appId, long ceDataInode,
- String seInfo, int token) {
+ public void snapshotAndRestoreUserData(String packageName, int[] userIds, int appId,
+ long ceDataInode, String seInfo, int token) {
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
- throw new SecurityException("restoreUserData may only be called by the system.");
+ throw new SecurityException(
+ "snapshotAndRestoreUserData may only be called by the system.");
}
getHandler().post(() -> {
+ snapshotUserDataInternal(packageName);
restoreUserDataInternal(packageName, userIds, appId, ceDataInode, seInfo, token);
final PackageManagerInternal pmi = LocalServices.getService(
PackageManagerInternal.class);
@@ -1071,6 +1065,38 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
});
}
+ private void snapshotUserDataInternal(String packageName) {
+ synchronized (mLock) {
+ // staged installs
+ ensureRollbackDataLoadedLocked();
+ for (int i = 0; i < mRollbacks.size(); i++) {
+ RollbackData data = mRollbacks.get(i);
+ if (data.state != RollbackData.ROLLBACK_STATE_ENABLING) {
+ continue;
+ }
+
+ for (PackageRollbackInfo info : data.info.getPackages()) {
+ if (info.getPackageName().equals(packageName)) {
+ mAppDataRollbackHelper.snapshotAppData(data.info.getRollbackId(), info);
+ saveRollbackData(data);
+ return;
+ }
+ }
+ }
+ // non-staged installs
+ PackageRollbackInfo info;
+ for (NewRollback rollback : mNewRollbacks) {
+ info = getPackageRollbackInfo(rollback.data, packageName);
+ if (info != null) {
+ mAppDataRollbackHelper.snapshotAppData(rollback.data.info.getRollbackId(),
+ info);
+ saveRollbackData(rollback.data);
+ return;
+ }
+ }
+ }
+ }
+
private void restoreUserDataInternal(String packageName, int[] userIds, int appId,
long ceDataInode, String seInfo, int token) {
PackageRollbackInfo info = null;
@@ -1130,7 +1156,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
if (!session.isMultiPackage()) {
if (!enableRollbackForPackageSession(newRollback.data, session,
- new int[0], /* snapshotUserData */ false)) {
+ new int[0])) {
Log.e(TAG, "Unable to enable rollback for session: " + sessionId);
result.offer(false);
return;
@@ -1145,7 +1171,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return;
}
if (!enableRollbackForPackageSession(newRollback.data, childSession,
- new int[0], /* snapshotUserData */ false)) {
+ new int[0])) {
Log.e(TAG, "Unable to enable rollback for session: " + sessionId);
result.offer(false);
return;