summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/ApexManager.java27
-rw-r--r--services/core/java/com/android/server/pm/StagingManager.java9
2 files changed, 33 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index 44c36ee01bbf..4f9b3962a9ea 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 class ApexManager {
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 @@ abstract class ApexManager {
}
@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 @@ abstract class ApexManager {
}
@Override
+ boolean abortStagedSession(int sessionId) throws PackageManagerException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
boolean uninstallApex(String apexPackagePath) {
throw new UnsupportedOperationException();
}
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 5bb42d46b746..845f06d1ce5f 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -215,7 +215,7 @@ public class StagingManager {
}
final long activeVersion = activePackage.applicationInfo.longVersionCode;
if (activeVersion != session.params.requiredInstalledVersionCode) {
- if (!mApexManager.abortActiveSession()) {
+ if (!mApexManager.abortStagedSession(session.sessionId)) {
Slog.e(TAG, "Failed to abort apex session " + session.sessionId);
}
throw new PackageManagerException(
@@ -234,7 +234,7 @@ public class StagingManager {
final boolean allowsDowngrade = PackageManagerServiceUtils.isDowngradePermitted(
session.params.installFlags, activePackage.applicationInfo.flags);
if (activeVersion > newVersionCode && !allowsDowngrade) {
- if (!mApexManager.abortActiveSession()) {
+ if (!mApexManager.abortStagedSession(session.sessionId)) {
Slog.e(TAG, "Failed to abort apex session " + session.sessionId);
}
throw new PackageManagerException(
@@ -678,7 +678,10 @@ public class StagingManager {
+ " because it is not active or APEXD is not reachable");
return;
}
- mApexManager.abortActiveSession();
+ try {
+ mApexManager.abortStagedSession(session.sessionId);
+ } catch (Exception ignore) {
+ }
}
}