Allow StagingManager to abort individual staged session
Now that apexd can stage multiple sessions, we need to be able to abort
specific staged session during pre-reboot verification. The only need to
abort activated session while resuming staged session during boot.
Bug: 141843321
Test: atest StagedInstallTest
Change-Id: I97d4216e1fe9ec6c98474ec12f4046b002d9edda
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index 44c36ee0..4f9b396 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -209,6 +209,13 @@
abstract boolean abortActiveSession();
/**
+ * Abandons the staged session with the given sessionId.
+ *
+ * @return {@code true} upon success, {@code false} if any remote exception occurs
+ */
+ abstract boolean abortStagedSession(int sessionId) throws PackageManagerException;
+
+ /**
* Uninstalls given {@code apexPackage}.
*
* <p>NOTE. Device must be rebooted in order for uninstall to take effect.
@@ -496,6 +503,21 @@
}
@Override
+ boolean abortStagedSession(int sessionId) throws PackageManagerException {
+ try {
+ mApexService.abortStagedSession(sessionId);
+ return true;
+ } catch (RemoteException re) {
+ Slog.e(TAG, "Unable to contact apexservice", re);
+ return false;
+ } catch (Exception e) {
+ throw new PackageManagerException(
+ PackageInstaller.SessionInfo.STAGED_SESSION_VERIFICATION_FAILED,
+ "Failed to abort staged session : " + e.getMessage());
+ }
+ }
+
+ @Override
boolean uninstallApex(String apexPackagePath) {
try {
mApexService.unstagePackages(Collections.singletonList(apexPackagePath));
@@ -683,6 +705,11 @@
}
@Override
+ boolean abortStagedSession(int sessionId) throws PackageManagerException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
boolean uninstallApex(String apexPackagePath) {
throw new UnsupportedOperationException();
}