From 105add8d1aebad3904a8863860fa596712151f65 Mon Sep 17 00:00:00 2001 From: riddle_hsu Date: Sat, 15 Nov 2014 18:25:34 +0800 Subject: [PATCH] [ActivityManager] Prevent provider from been created twice. Root Cause: If a process which contains provider is starting but not from accessing provider, e.g. service/activity/receiver, its providers' will be created during handleBindApplication. And before the process complete publish provider to ActivityManagerService, if there is an access call to process provider before the process completes publishing providers to ActivityManagerService, then the providers will be created again. Solution: Don't schedule install provider if the provider record already exist and will be published later. Change-Id: Ic200ceae042c014c86e7edee0acd013b513af334 --- .../android/server/am/ActivityManagerService.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 8dfb3217c0af1..ba8a35979f74a 100755 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -9464,11 +9464,13 @@ public final class ActivityManagerService extends ActivityManagerNative if (DEBUG_PROVIDER) { Slog.d(TAG, "Installing in existing process " + proc); } - checkTime(startTime, "getContentProviderImpl: scheduling install"); - proc.pubProviders.put(cpi.name, cpr); - try { - proc.thread.scheduleInstallProvider(cpi); - } catch (RemoteException e) { + if (!proc.pubProviders.containsKey(cpi.name)) { + checkTime(startTime, "getContentProviderImpl: scheduling install"); + proc.pubProviders.put(cpi.name, cpr); + try { + proc.thread.scheduleInstallProvider(cpi); + } catch (RemoteException e) { + } } } else { checkTime(startTime, "getContentProviderImpl: before start process");