summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java4
-rw-r--r--services/core/java/com/android/server/pm/PackageHandler.java18
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java30
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;
}
}
}