From b793c2174ec133b6f7d3b1d439d30423fffcf59f Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Wed, 30 Oct 2019 20:54:37 +0800 Subject: [PATCH] Reschedule the pre-reboot verification after boot completed. Bug: 143528612 Test: atest CtsStagedInstallHostTestCases Change-Id: I34d7ee3b84bc351d58ebf024a7ed10dd7db1f55b --- .../server/pm/PackageInstallerService.java | 1 + .../com/android/server/pm/StagingManager.java | 36 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 47a41f56efa8f..e2dfa126225f3 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -217,6 +217,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements public void systemReady() { mAppOps = mContext.getSystemService(AppOpsManager.class); + mStagingManager.systemReady(); synchronized (mSessions) { readSessionsLocked(); diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 688c34fed44f1..6c3eb31d22aff 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -22,10 +22,12 @@ import android.apex.ApexInfo; import android.apex.ApexInfoList; import android.apex.ApexSessionInfo; import android.apex.ApexSessionParams; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.IIntentReceiver; import android.content.IIntentSender; import android.content.Intent; +import android.content.IntentFilter; import android.content.IntentSender; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; @@ -774,6 +776,17 @@ public class StagingManager { } } + void systemReady() { + // Register the receiver of boot completed intent for staging manager. + mContext.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context ctx, Intent intent) { + mPreRebootVerificationHandler.readyToStart(); + ctx.unregisterReceiver(this); + } + }, new IntentFilter(Intent.ACTION_BOOT_COMPLETED)); + } + private static class LocalIntentReceiverAsync { final Consumer mConsumer; @@ -824,6 +837,9 @@ public class StagingManager { } private final class PreRebootVerificationHandler extends Handler { + // Hold session ids before handler gets ready to do the verification. + private IntArray mPendingSessionIds; + private boolean mIsReady; PreRebootVerificationHandler(Looper looper) { super(looper); @@ -876,8 +892,26 @@ public class StagingManager { } } + // Notify the handler that system is ready, and reschedule the pre-reboot verifications. + private synchronized void readyToStart() { + mIsReady = true; + if (mPendingSessionIds != null) { + for (int i = 0; i < mPendingSessionIds.size(); i++) { + startPreRebootVerification(mPendingSessionIds.get(i)); + } + mPendingSessionIds = null; + } + } + // Method for starting the pre-reboot verification - private void startPreRebootVerification(int sessionId) { + private synchronized void startPreRebootVerification(int sessionId) { + if (!mIsReady) { + if (mPendingSessionIds == null) { + mPendingSessionIds = new IntArray(); + } + mPendingSessionIds.add(sessionId); + return; + } obtainMessage(MSG_PRE_REBOOT_VERIFICATION_START, sessionId, 0).sendToTarget(); }