diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/ApexManager.java | 14 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/StagingManager.java | 12 |
2 files changed, 17 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 2301e3fb093d..dd099b15a464 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -158,9 +158,9 @@ abstract class ApexManager { * applied at next reboot. * * @param sessionId the identifier of the {@link PackageInstallerSession} being marked as ready. - * @return true upon success, false if the session is unknown. + * @throws PackageManagerException if call to apexd fails */ - abstract boolean markStagedSessionReady(int sessionId); + abstract void markStagedSessionReady(int sessionId) throws PackageManagerException; /** * Marks a staged session as successful. @@ -402,12 +402,16 @@ abstract class ApexManager { } @Override - boolean markStagedSessionReady(int sessionId) { + void markStagedSessionReady(int sessionId) throws PackageManagerException { try { - return mApexService.markStagedSessionReady(sessionId); + mApexService.markStagedSessionReady(sessionId); } catch (RemoteException re) { Slog.e(TAG, "Unable to contact apexservice", re); throw new RuntimeException(re); + } catch (Exception e) { + throw new PackageManagerException( + PackageInstaller.SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, + "Failed to mark apexd session as ready : " + e.getMessage()); } } @@ -576,7 +580,7 @@ abstract class ApexManager { } @Override - boolean markStagedSessionReady(int sessionId) { + void markStagedSessionReady(int sessionId) { 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 404b515e233e..42b65c357959 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -278,10 +278,14 @@ public class StagingManager { // session as ready), then if a device gets rebooted right after the call to apexd, only // apex part of the train will be applied, leaving device in an inconsistent state. session.setStagedSessionReady(); - if (hasApex && !mApexManager.markStagedSessionReady(session.sessionId)) { - session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, - "APEX staging failed, check logcat messages from apexd for more " - + "details."); + if (!hasApex) { + // Session doesn't contain apex, nothing to do. + return; + } + try { + mApexManager.markStagedSessionReady(session.sessionId); + } catch (PackageManagerException e) { + session.setStagedSessionFailed(e.error, e.getMessage()); } } |