diff options
| author | 2019-02-12 10:23:47 +0100 | |
|---|---|---|
| committer | 2019-02-12 10:27:35 +0100 | |
| commit | b27a8ea766bf4f4777fb0fbdf92101486ff355b3 (patch) | |
| tree | bd0d82d7a0453e7318248643bbc9d4f50f5ace15 | |
| parent | 0671c44a85bf38db54445a909979382d521318cc (diff) | |
Make app zygote launches more robust.
In case a process launch times out, there are paths in
ActivityManagerService that call removeProcessNameLocked() more than
once; in case such a process is using the application zygote, that can
cause the logic to remove the same ProcessRecord from the application
zygote twice, resulting in a NullPointerException.
Bug: 123758436
Test: atest android.app.cts.ServiceTest#testActivityServiceBindingLru
Change-Id: Id5462b6005a7c0601820332344af5be6d10eb319
| -rw-r--r-- | services/core/java/com/android/server/am/ProcessList.java | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index f01305eab761..0d49e4cdc9d0 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -1681,7 +1681,8 @@ public final class ProcessList { public void killAppZygoteIfNeededLocked(AppZygote appZygote) { final ApplicationInfo appInfo = appZygote.getAppInfo(); ArrayList<ProcessRecord> zygoteProcesses = mAppZygoteProcesses.get(appZygote); - if (zygoteProcesses.size() == 0) { // Only remove if no longer in use now + if (zygoteProcesses != null && zygoteProcesses.size() == 0) { + // Only remove if no longer in use now mAppZygotes.remove(appInfo.processName, appInfo.uid); mAppZygoteProcesses.remove(appZygote); mAppIsolatedUidRangeAllocator.freeUidRangeLocked(appInfo); @@ -1703,6 +1704,7 @@ public final class ProcessList { ArrayList<ProcessRecord> zygoteProcesses = mAppZygoteProcesses.get(appZygote); zygoteProcesses.remove(app); if (zygoteProcesses.size() == 0) { + mService.mHandler.removeMessages(KILL_APP_ZYGOTE_MSG); Message msg = mService.mHandler.obtainMessage(KILL_APP_ZYGOTE_MSG); msg.obj = appZygote; mService.mHandler.sendMessageDelayed(msg, KILL_APP_ZYGOTE_DELAY_MS); |