summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/ApexManager.java14
-rw-r--r--services/core/java/com/android/server/pm/StagingManager.java12
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());
}
}