diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7e1856ecd91f8..8b264195241dc 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -811,10 +811,16 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mProtectedBroadcasts") final ArraySet mProtectedBroadcasts = new ArraySet<>(); - /** List of packages waiting for verification. */ + /** + * List of packages waiting for verification. + * Handler thread only! + */ final SparseArray mPendingVerification = new SparseArray<>(); - /** List of packages waiting for rollback to be enabled. */ + /** + * List of packages waiting for rollback to be enabled. + * Handler thread only! + */ final SparseArray mPendingEnableRollback = new SparseArray<>(); final PackageInstallerService mInstallerService; @@ -835,10 +841,16 @@ public class PackageManagerService extends IPackageManager.Stub // Cache of users who need badging. private final SparseBooleanArray mUserNeedsBadging = new SparseBooleanArray(); - /** Token for keys in mPendingVerification. */ + /** + * Token for keys in mPendingVerification. + * Handler thread only! + */ int mPendingVerificationToken = 0; - /** Token for keys in mPendingEnableRollback. */ + /** + * Token for keys in mPendingEnableRollback. + * Handler thread only! + */ int mPendingEnableRollbackToken = 0; @Watched(manual = true) @@ -6347,25 +6359,28 @@ public class PackageManagerService extends IPackageManager.Stub android.Manifest.permission.PACKAGE_VERIFICATION_AGENT, "Only package verification agents can extend verification timeouts"); - final PackageVerificationState state = mPendingVerification.get(id); - final PackageVerificationResponse response = new PackageVerificationResponse( - verificationCodeAtTimeout, Binder.getCallingUid()); + mHandler.post(() -> { + final PackageVerificationState state = mPendingVerification.get(id); + final PackageVerificationResponse response = new PackageVerificationResponse( + verificationCodeAtTimeout, Binder.getCallingUid()); - if (millisecondsToDelay > PackageManager.MAXIMUM_VERIFICATION_TIMEOUT) { - millisecondsToDelay = PackageManager.MAXIMUM_VERIFICATION_TIMEOUT; - } - if (millisecondsToDelay < 0) { - millisecondsToDelay = 0; - } + long delay = millisecondsToDelay; + if (delay > PackageManager.MAXIMUM_VERIFICATION_TIMEOUT) { + delay = PackageManager.MAXIMUM_VERIFICATION_TIMEOUT; + } + if (delay < 0) { + delay = 0; + } - if ((state != null) && !state.timeoutExtended()) { - state.extendTimeout(); + if ((state != null) && !state.timeoutExtended()) { + state.extendTimeout(); - final Message msg = mHandler.obtainMessage(PACKAGE_VERIFIED); - msg.arg1 = id; - msg.obj = response; - mHandler.sendMessageDelayed(msg, millisecondsToDelay); - } + final Message msg = mHandler.obtainMessage(PACKAGE_VERIFIED); + msg.arg1 = id; + msg.obj = response; + mHandler.sendMessageDelayed(msg, delay); + } + }); } private void setEnableRollbackCode(int token, int enableRollbackCode) { diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 7c3b733e92dd5..9cb8863415661 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -527,26 +527,6 @@ public class StagingManager { } } - /** - * Returns id of a committed and non-finalized stated session that contains same - * {@code packageName}, or {@code -1} if no sessions have this {@code packageName} staged. - */ - int getSessionIdByPackageName(@NonNull String packageName) { - synchronized (mStagedSessions) { - for (int i = 0; i < mStagedSessions.size(); i++) { - StagedSession stagedSession = mStagedSessions.valueAt(i); - if (!stagedSession.isCommitted() || stagedSession.isDestroyed() - || stagedSession.isInTerminalState()) { - continue; - } - if (stagedSession.getPackageName().equals(packageName)) { - return stagedSession.sessionId(); - } - } - } - return -1; - } - @VisibleForTesting void createSession(@NonNull StagedSession sessionInfo) { synchronized (mStagedSessions) { diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java index b72f05fee0feb..663bb2bd2d676 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java @@ -453,66 +453,6 @@ public class StagingManagerTest { assertThat(apkSession.getErrorMessage()).isEqualTo("Another apex session failed"); } - @Test - public void getSessionIdByPackageName() throws Exception { - FakeStagedSession session = new FakeStagedSession(239); - session.setCommitted(true); - session.setSessionReady(); - session.setPackageName("com.foo"); - - mStagingManager.createSession(session); - assertThat(mStagingManager.getSessionIdByPackageName("com.foo")).isEqualTo(239); - } - - @Test - public void getSessionIdByPackageName_appliedSession_ignores() throws Exception { - FakeStagedSession session = new FakeStagedSession(37); - session.setCommitted(true); - session.setSessionApplied(); - session.setPackageName("com.foo"); - - mStagingManager.createSession(session); - assertThat(mStagingManager.getSessionIdByPackageName("com.foo")).isEqualTo(-1); - } - - @Test - public void getSessionIdByPackageName_failedSession_ignores() throws Exception { - FakeStagedSession session = new FakeStagedSession(73); - session.setCommitted(true); - session.setSessionFailed(1, "whatevs"); - session.setPackageName("com.foo"); - - mStagingManager.createSession(session); - assertThat(mStagingManager.getSessionIdByPackageName("com.foo")).isEqualTo(-1); - } - - @Test - public void getSessionIdByPackageName_destroyedSession_ignores() throws Exception { - FakeStagedSession session = new FakeStagedSession(23); - session.setCommitted(true); - session.setDestroyed(true); - session.setPackageName("com.foo"); - - mStagingManager.createSession(session); - assertThat(mStagingManager.getSessionIdByPackageName("com.foo")).isEqualTo(-1); - } - - @Test - public void getSessionIdByPackageName_noSessions() throws Exception { - assertThat(mStagingManager.getSessionIdByPackageName("com.foo")).isEqualTo(-1); - } - - @Test - public void getSessionIdByPackageName_noSessionHasThisPackage() throws Exception { - FakeStagedSession session = new FakeStagedSession(37); - session.setCommitted(true); - session.setSessionApplied(); - session.setPackageName("com.foo"); - - mStagingManager.createSession(session); - assertThat(mStagingManager.getSessionIdByPackageName("com.bar")).isEqualTo(-1); - } - @Test public void getStagedApexInfos_validatePreConditions() throws Exception { // Invalid session: null session