diff options
| author | 2019-02-05 13:55:11 +0000 | |
|---|---|---|
| committer | 2019-02-05 16:43:47 +0000 | |
| commit | 6fa7d13ebe29545b4f29667f5ab286502b64c140 (patch) | |
| tree | 878f04333f3d4dc77eb548b0647efb3ffecdfb5b | |
| parent | 60ac706fdce0c5b86e989058efc68f96051fcfc4 (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
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. |