From 221f3ec59c9e774d3bcdceb7e1058dcb303b1dcf Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Mon, 15 Jun 2020 14:28:14 +0100 Subject: [PATCH] Mark boot completion via apexservice Use the StagingManager lifecycle class to call into ApexManager when the boot completed broadcast is received. ApexManager will then call into apexservice to inform apexd of the boot completion, instead of apexd relying on the sys.boot_completed property. Test: atest StagedInstallTest Test: atest ApexRollbackTests Bug: 158467962 Change-Id: Ibcb4cb784243530eb2cf8c2633651342e8115d14 --- .../com/android/server/pm/ApexManager.java | 19 +++++++++++++++++++ .../com/android/server/pm/StagingManager.java | 5 +++++ 2 files changed, 24 insertions(+) diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 3810e14ff04d5..951f462ed2013 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -349,6 +349,11 @@ public abstract class ApexManager { */ public abstract boolean destroyCeSnapshotsNotSpecified(int userId, int[] retainRollbackIds); + /** + * Inform apexd that the boot has completed. + */ + public abstract void markBootCompleted(); + /** * Dumps various state information to the provided {@link PrintWriter} object. * @@ -880,6 +885,15 @@ public abstract class ApexManager { } } + @Override + public void markBootCompleted() { + try { + waitForApexService().markBootCompleted(); + } catch (RemoteException re) { + Slog.e(TAG, "Unable to contact apexservice", re); + } + } + /** * Dump information about the packages contained in a particular cache * @param packagesCache the cache to print information about. @@ -1126,6 +1140,11 @@ public abstract class ApexManager { return true; } + @Override + public void markBootCompleted() { + // No-op + } + @Override void dump(PrintWriter pw, String packageName) { // No-op diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index c99a56fc6f8fc..f94b32bc52b54 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -164,6 +164,7 @@ public class StagingManager { public void onBootPhase(int phase) { if (phase == SystemService.PHASE_BOOT_COMPLETED && sStagingManager != null) { sStagingManager.markStagedSessionsAsSuccessful(); + sStagingManager.markBootCompleted(); } } } @@ -179,6 +180,10 @@ public class StagingManager { } } + private void markBootCompleted() { + mApexManager.markBootCompleted(); + } + ParceledListSlice getSessions(int callingUid) { final List result = new ArrayList<>(); synchronized (mStagedSessions) {