Work on death recipient leaks in Activity Manager and Content Service.
This should fix a leak of process death recipients in the activity manager.
Also add debugging of content observers to try to track down what looks
like a leak of them in the content service.
Change-Id: Id6823679493ef0cde5307bb66490ebe31b878556
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index a8fb1ed..94af46d 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -3610,8 +3610,10 @@
String processName = app.processName;
try {
- thread.asBinder().linkToDeath(new AppDeathRecipient(
- app, pid, thread), 0);
+ AppDeathRecipient adr = new AppDeathRecipient(
+ app, pid, thread);
+ thread.asBinder().linkToDeath(adr, 0);
+ app.deathRecipient = adr;
} catch (RemoteException e) {
app.resetPackageList();
startProcessLocked(app, "link fail", processName);
@@ -3687,6 +3689,7 @@
Slog.w(TAG, "Exception thrown during bind!", e);
app.resetPackageList();
+ app.unlinkDeathRecipient();
startProcessLocked(app, "bind fail", processName);
return false;
}
@@ -9210,6 +9213,7 @@
app.notResponding = false;
app.resetPackageList();
+ app.unlinkDeathRecipient();
app.thread = null;
app.forcingToForeground = null;
app.foregroundServices = false;
@@ -9327,7 +9331,6 @@
// This app is persistent, so we need to keep its record around.
// If it is not already on the pending app list, add it there
// and start a new process for it.
- app.thread = null;
app.forcingToForeground = null;
app.foregroundServices = false;
if (mPersistentStartingProcesses.indexOf(app) < 0) {