[ActivityManager] Use synchronized to protect object

Symptom: ArrayIndexOutOfBoundsException at mResourcePackages
Root Cause: Race condition issue
Solution: Use synchronized to protect object

Change-Id: Ia2d89d50919d95d95f6f8ac2eb75594a93e8f2da
This commit is contained in:
mark_chen
2014-12-12 15:38:48 +08:00
committed by Mark Chen
parent 3146212878
commit 89764e337b

View File

@@ -4161,22 +4161,24 @@ public final class ActivityThread {
final void handleDispatchPackageBroadcast(int cmd, String[] packages) {
boolean hasPkgInfo = false;
if (packages != null) {
for (int i=packages.length-1; i>=0; i--) {
//Slog.i(TAG, "Cleaning old package: " + packages[i]);
if (!hasPkgInfo) {
WeakReference<LoadedApk> ref;
ref = mPackages.get(packages[i]);
if (ref != null && ref.get() != null) {
hasPkgInfo = true;
} else {
ref = mResourcePackages.get(packages[i]);
synchronized (mResourcesManager) {
for (int i=packages.length-1; i>=0; i--) {
//Slog.i(TAG, "Cleaning old package: " + packages[i]);
if (!hasPkgInfo) {
WeakReference<LoadedApk> ref;
ref = mPackages.get(packages[i]);
if (ref != null && ref.get() != null) {
hasPkgInfo = true;
} else {
ref = mResourcePackages.get(packages[i]);
if (ref != null && ref.get() != null) {
hasPkgInfo = true;
}
}
}
mPackages.remove(packages[i]);
mResourcePackages.remove(packages[i]);
}
mPackages.remove(packages[i]);
mResourcePackages.remove(packages[i]);
}
}
ApplicationPackageManager.handlePackageBroadcast(cmd, packages,