From dbb902d4adffaad1d054e5179552e46d047f7832 Mon Sep 17 00:00:00 2001 From: riddle_hsu Date: Wed, 13 May 2015 18:59:03 +0800 Subject: [PATCH] Also restart provider if there is external handle. e.g. ContentResolver.getType will call ActivityManagerService.getProviderMimeType that will not have connection but increase externalProcessNoHandleCount. Change-Id: I649c0b2390a749c77c6be5e7dfadc1acb689ec4c --- .../java/com/android/server/am/ActivityManagerService.java | 4 ++-- .../java/com/android/server/am/ContentProviderRecord.java | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 215839515a4e7..e4f57dfbfcd05 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -15089,7 +15089,7 @@ public final class ActivityManagerService extends ActivityManagerNative ContentProviderRecord cpr = app.pubProviders.valueAt(i); final boolean always = app.bad || !allowRestart; boolean inLaunching = removeDyingProviderLocked(app, cpr, always); - if ((inLaunching || always) && !cpr.connections.isEmpty()) { + if ((inLaunching || always) && cpr.hasConnectionOrHandle()) { // We left the provider in the launching list, need to // restart it. restart = true; @@ -15233,7 +15233,7 @@ public final class ActivityManagerService extends ActivityManagerNative for (int i = mLaunchingProviders.size() - 1; i >= 0; i--) { ContentProviderRecord cpr = mLaunchingProviders.get(i); if (cpr.launchingApp == app) { - if (!alwaysBad && !app.bad && !cpr.connections.isEmpty()) { + if (!alwaysBad && !app.bad && cpr.hasConnectionOrHandle()) { restart = true; } else { removeDyingProviderLocked(app, cpr, true); diff --git a/services/core/java/com/android/server/am/ContentProviderRecord.java b/services/core/java/com/android/server/am/ContentProviderRecord.java index a37249da39fd0..dceadf453c28b 100644 --- a/services/core/java/com/android/server/am/ContentProviderRecord.java +++ b/services/core/java/com/android/server/am/ContentProviderRecord.java @@ -139,6 +139,10 @@ final class ContentProviderRecord { return (externalProcessTokenToHandle != null || externalProcessNoHandleCount > 0); } + public boolean hasConnectionOrHandle() { + return !connections.isEmpty() || hasExternalProcessHandles(); + } + void dump(PrintWriter pw, String prefix, boolean full) { if (full) { pw.print(prefix); pw.print("package=");