summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Martijn Coenen <maco@google.com> 2019-02-12 10:23:47 +0100
committer Martijn Coenen <maco@google.com> 2019-02-12 10:27:35 +0100
commitb27a8ea766bf4f4777fb0fbdf92101486ff355b3 (patch)
treebd0d82d7a0453e7318248643bbc9d4f50f5ace15
parent0671c44a85bf38db54445a909979382d521318cc (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.java4
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);