diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/ApexManager.java | 27 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/StagingManager.java | 9 |
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) { + } } } |