diff options
3 files changed, 32 insertions, 20 deletions
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index a0fbc008475c..a8f31f90d1e0 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -849,7 +849,9 @@ final class InstallPackageHelper { int token; if (mPm.mNextInstallToken < 0) mPm.mNextInstallToken = 1; token = mPm.mNextInstallToken++; - mPm.mRunningInstalls.put(token, request); + synchronized (mPm.mRunningInstalls) { + mPm.mRunningInstalls.put(token, request); + } if (DEBUG_INSTALL) Log.v(TAG, "+ starting restore round-trip " + token); diff --git a/services/core/java/com/android/server/pm/PackageHandler.java b/services/core/java/com/android/server/pm/PackageHandler.java index bc03b10b41b4..9916be680374 100644 --- a/services/core/java/com/android/server/pm/PackageHandler.java +++ b/services/core/java/com/android/server/pm/PackageHandler.java @@ -82,14 +82,20 @@ final class PackageHandler extends Handler { case POST_INSTALL: { if (DEBUG_INSTALL) Log.v(TAG, "Handling post-install for " + msg.arg1); - InstallRequest request = mPm.mRunningInstalls.get(msg.arg1); - final boolean didRestore = (msg.arg2 != 0); - mPm.mRunningInstalls.delete(msg.arg1); + final InstallRequest request; + final int token; + final boolean didRestore; + synchronized (mPm.mRunningInstalls) { + request= mPm.mRunningInstalls.get(msg.arg1); + token = msg.arg1; + didRestore = (msg.arg2 != 0); + mPm.mRunningInstalls.delete(token); + } if (request == null) { if (DEBUG_INSTALL) { Slog.i(TAG, "InstallRequest is null. Nothing to do for post-install " - + "token " + msg.arg1); + + "token " + token); } break; } @@ -100,10 +106,10 @@ final class PackageHandler extends Handler { mPm.handlePackagePostInstall(request, didRestore); } else if (DEBUG_INSTALL) { // No post-install when we run restore from installExistingPackageForUser - Slog.i(TAG, "Nothing to do for post-install token " + msg.arg1); + Slog.i(TAG, "Nothing to do for post-install token " + token); } - Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "postInstall", msg.arg1); + Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "postInstall", token); } break; case DEFERRED_NO_KILL_POST_DELETE: { CleanUpArgs args = (CleanUpArgs) msg.obj; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index aaa4fdf12411..f60e086e7c5d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -960,6 +960,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService // Stores a list of users whose package restrictions file needs to be updated final ArraySet<Integer> mDirtyUsers = new ArraySet<>(); + @GuardedBy("mRunningInstalls") final SparseArray<InstallRequest> mRunningInstalls = new SparseArray<>(); int mNextInstallToken = 1; // nonzero; will be wrapped back to 1 when ++ overflows @@ -3291,20 +3292,23 @@ public class PackageManagerService implements PackageSender, TestUtilityService // and been launched through some other means, so it is not in a problematic // state for observers to see the FIRST_LAUNCH signal. mHandler.post(() -> { - for (int i = 0; i < mRunningInstalls.size(); i++) { - final InstallRequest installRequest = mRunningInstalls.valueAt(i); - if (installRequest.getReturnCode() != PackageManager.INSTALL_SUCCEEDED) { - continue; - } - if (packageName.equals(installRequest.getPkg().getPackageName())) { - // right package; but is it for the right user? - for (int uIndex = 0; uIndex < installRequest.getNewUsers().length; uIndex++) { - if (userId == installRequest.getNewUsers()[uIndex]) { - if (DEBUG_BACKUP) { - Slog.i(TAG, "Package " + packageName - + " being restored so deferring FIRST_LAUNCH"); + synchronized (mRunningInstalls) { + for (int i = 0; i < mRunningInstalls.size(); i++) { + final InstallRequest installRequest = mRunningInstalls.valueAt(i); + if (installRequest.getReturnCode() != PackageManager.INSTALL_SUCCEEDED) { + continue; + } + final int[] newUsers = installRequest.getNewUsers(); + if (packageName.equals(installRequest.getPkg().getPackageName())) { + // right package; but is it for the right user? + for (int uIndex = 0; uIndex < newUsers.length; uIndex++) { + if (userId == newUsers[uIndex]) { + if (DEBUG_BACKUP) { + Slog.i(TAG, "Package " + packageName + + " being restored so deferring FIRST_LAUNCH"); + } + return; } - return; } } } |