summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Richard Uhler <ruhler@google.com> 2019-02-05 13:55:11 +0000
committer Richard Uhler <ruhler@google.com> 2019-02-05 16:43:47 +0000
commit6fa7d13ebe29545b4f29667f5ab286502b64c140 (patch)
tree878f04333f3d4dc77eb548b0647efb3ffecdfb5b
parent60ac706fdce0c5b86e989058efc68f96051fcfc4 (diff)
Notify RollbackManager of the apk session for a staged install.
The rollback manager needs to know the apk session to avoid doing an extra backup of the apks when the apk session is applied post-reboot. Bug: 112431924 Test: atest RollbackTest Change-Id: Ie84969760b9b1fd3949a7241f23e52cfb403e294
-rw-r--r--core/java/android/content/rollback/IRollbackManager.aidl4
-rw-r--r--services/core/java/com/android/server/pm/StagingManager.java13
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java5
3 files changed, 22 insertions, 0 deletions
diff --git a/core/java/android/content/rollback/IRollbackManager.aidl b/core/java/android/content/rollback/IRollbackManager.aidl
index d951756bb513..db9fcb6abdfa 100644
--- a/core/java/android/content/rollback/IRollbackManager.aidl
+++ b/core/java/android/content/rollback/IRollbackManager.aidl
@@ -47,4 +47,8 @@ interface IRollbackManager {
//
// NOTE: This call is synchronous.
boolean notifyStagedSession(int sessionId);
+
+ // Used by the staging manager to notify the RollbackManager of the apk
+ // session for a staged session.
+ void notifyStagedApkSession(int originalSessionId, int apkSessionId);
}
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 55eb7ea7da4d..89aea36429d2 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -380,6 +380,19 @@ public class StagingManager {
private boolean commitApkSession(@NonNull PackageInstallerSession apkSession,
int originalSessionId) {
+
+ if ((apkSession.params.installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0) {
+ // If rollback is available for this session, notify the rollback
+ // manager of the apk session so it can properly enable rollback.
+ final IRollbackManager rm = IRollbackManager.Stub.asInterface(
+ ServiceManager.getService(Context.ROLLBACK_SERVICE));
+ try {
+ rm.notifyStagedApkSession(originalSessionId, apkSession.sessionId);
+ } catch (RemoteException re) {
+ // Cannot happen, the rollback manager is in the same process.
+ }
+ }
+
final LocalIntentReceiver receiver = new LocalIntentReceiver();
apkSession.commit(receiver.getIntentSender(), false);
final Intent result = receiver.getResult();
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index 438e47964c5e..7445c0019fe5 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -928,6 +928,11 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
}
+ @Override
+ public void notifyStagedApkSession(int originalSessionId, int apkSessionId) {
+ // TODO: Handle this callback.
+ }
+
/**
* Gets the version of the package currently installed.
* Returns null if the package is not currently installed.