diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index ddbd9c9266d07..6947a71a5e6f9 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -564,6 +564,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } void onUnlockUser(int userId) { + // In order to ensure that no package begins running while a backup or restore is taking + // place, onUnlockUser must remain blocked until all pending backups and restores have + // completed. + CountDownLatch latch = new CountDownLatch(1); getHandler().post(() -> { final List rollbacks; synchronized (mLock) { @@ -576,7 +580,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { for (Rollback rollback : changed) { saveRollback(rollback); } + latch.countDown(); }); + + try { + latch.await(); + } catch (InterruptedException ie) { + throw new IllegalStateException("RollbackManagerHandlerThread interrupted"); + } } private void updateRollbackLifetimeDurationInMillis() {