diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java index 698f1ebfb594a..73aca652dd5a0 100644 --- a/services/core/java/com/android/server/PersistentDataBlockService.java +++ b/services/core/java/com/android/server/PersistentDataBlockService.java @@ -46,6 +46,8 @@ import java.nio.channels.FileChannel; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; /** * Service for reading and writing blocks to a persistent partition. @@ -79,6 +81,7 @@ public class PersistentDataBlockService extends SystemService { private final Context mContext; private final String mDataBlockFile; private final Object mLock = new Object(); + private final CountDownLatch mInitDoneSignal = new CountDownLatch(1); private int mAllowedUid = -1; private long mBlockDeviceSize; @@ -109,9 +112,29 @@ public class PersistentDataBlockService extends SystemService { @Override public void onStart() { - enforceChecksumValidity(); - formatIfOemUnlockEnabled(); - publishBinderService(Context.PERSISTENT_DATA_BLOCK_SERVICE, mService); + // Do init on a separate thread, will join in PHASE_ACTIVITY_MANAGER_READY + FgThread.getHandler().post(() -> { + enforceChecksumValidity(); + formatIfOemUnlockEnabled(); + publishBinderService(Context.PERSISTENT_DATA_BLOCK_SERVICE, mService); + mInitDoneSignal.countDown(); + }); + } + + @Override + public void onBootPhase(int phase) { + // Wait for initialization in onStart to finish + if (phase == PHASE_SYSTEM_SERVICES_READY) { + try { + if (!mInitDoneSignal.await(10, TimeUnit.SECONDS)) { + throw new IllegalStateException("Service " + TAG + " init timeout"); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new IllegalStateException("Service " + TAG + " init interrupted", e); + } + } + super.onBootPhase(phase); } private void formatIfOemUnlockEnabled() { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 1fc4378de2776..0edc91701588d 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1484,8 +1484,10 @@ public final class SystemServer { @Override public void run() { Slog.i(TAG, "Making services ready"); + traceBeginAndSlog("StartActivityManagerReadyPhase"); mSystemServiceManager.startBootPhase( SystemService.PHASE_ACTIVITY_MANAGER_READY); + traceEnd(); traceBeginAndSlog("PhaseActivityManagerReady"); traceBeginAndSlog("StartObservingNativeCrashes");