From ab4d7354ea374fed6261e107be90bb349ea48c49 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Tue, 9 Jul 2019 20:48:54 +0100 Subject: Populate error message if apexd.markStagedSessionReady fails Test: atest CtsStagedInstallHostTestCases Bug: 136548037 Bug: 122952270 Change-Id: I6fde70418990ee27c1966619badc437c9bffb697 --- services/core/java/com/android/server/pm/ApexManager.java | 14 +++++++++----- .../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()); } } -- cgit v1.2.3-59-g8ed1b