From cc269d93b5d2bf2dc566f969e8d49cc525ec8864 Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Mon, 14 May 2018 14:20:29 -0700 Subject: [PATCH] Update service map when application info is updated Bug: 77271275 Test: PoC app from b/77271275#3 on user 0 and 10 Change-Id: I78dec7e4b0649928cca8275b84259cdd72fe3c97 --- .../com/android/server/am/ActiveServices.java | 15 +++++++++++++++ .../android/server/am/ActivityManagerService.java | 1 + .../java/com/android/server/am/ServiceRecord.java | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index b32ece710a666..0b37fdb1680da 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -3592,6 +3592,21 @@ public final class ActiveServices { } } + public void updateServiceApplicationInfoLocked(ApplicationInfo applicationInfo) { + final int userId = UserHandle.getUserId(applicationInfo.uid); + ServiceMap serviceMap = mServiceMap.get(userId); + if (serviceMap != null) { + ArrayMap servicesByName = serviceMap.mServicesByName; + for (int j = servicesByName.size() - 1; j >= 0; j--) { + ServiceRecord serviceRecord = servicesByName.valueAt(j); + if (applicationInfo.packageName.equals(serviceRecord.appInfo.packageName)) { + serviceRecord.appInfo = applicationInfo; + serviceRecord.serviceInfo.applicationInfo = applicationInfo; + } + } + } + } + void serviceForegroundCrash(ProcessRecord app, CharSequence serviceRecord) { mAm.crashApplication(app.uid, app.pid, app.info.packageName, app.userId, "Context.startForegroundService() did not then call Service.startForeground(): " diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f83d9e657e1c6..78c663d543a6b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -21455,6 +21455,7 @@ public class ActivityManagerService extends IActivityManager.Stub return ActivityManager.BROADCAST_SUCCESS; } mStackSupervisor.updateActivityApplicationInfoLocked(aInfo); + mServices.updateServiceApplicationInfoLocked(aInfo); sendPackageBroadcastLocked(ApplicationThreadConstants.PACKAGE_REPLACED, new String[] {ssp}, userId); } diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java index 32887e400903c..4d89d015b6694 100644 --- a/services/core/java/com/android/server/am/ServiceRecord.java +++ b/services/core/java/com/android/server/am/ServiceRecord.java @@ -73,7 +73,7 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN // original intent used to find service. final ServiceInfo serviceInfo; // all information about the service. - final ApplicationInfo appInfo; + ApplicationInfo appInfo; // information about service's app. final int userId; // user that this service is running as final String packageName; // the package implementing intent's component