Merge "Add component types which a process is hosting into the proc memstats" into tm-dev
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index a2106f9..e639b29 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -128,6 +128,10 @@
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.am.MemoryStatUtil.hasMemcg;
import static com.android.server.am.ProcessList.ProcStartHandler;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_BACKUP;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_INSTRUMENTATION;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_PERSISTENT;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_SYSTEM;
import static com.android.server.net.NetworkPolicyManagerInternal.updateBlockedReasonsWithProcState;
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP;
@@ -1877,6 +1881,7 @@
app.setPid(MY_PID);
app.mState.setMaxAdj(ProcessList.SYSTEM_ADJ);
app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
+ app.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_SYSTEM);
addPidLocked(app);
updateLruProcessLocked(app, false, null);
updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
@@ -4179,7 +4184,9 @@
mi.getTotalRss(),
ProcessStats.ADD_PSS_EXTERNAL_SLOW,
duration,
- holder.appVersion);
+ holder.appVersion,
+ profile.getCurrentHostingComponentTypes(),
+ profile.getHistoricalHostingComponentTypes());
});
}
}
@@ -4237,7 +4244,9 @@
tmpUss[2],
ProcessStats.ADD_PSS_EXTERNAL,
duration,
- holder.appVersion);
+ holder.appVersion,
+ profile.getCurrentHostingComponentTypes(),
+ profile.getHistoricalHostingComponentTypes());
});
}
}
@@ -6416,8 +6425,13 @@
.getPersistentApplications(STOCK_PM_FLAGS | matchFlags).getList();
for (ApplicationInfo app : apps) {
if (!"android".equals(app.packageName)) {
- addAppLocked(app, null, false, null /* ABI override */,
+ final ProcessRecord proc = addAppLocked(
+ app, null, false, null /* ABI override */,
ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+ if (proc != null) {
+ proc.mProfile.addHostingComponentType(
+ HOSTING_COMPONENT_TYPE_PERSISTENT);
+ }
}
}
} catch (RemoteException ex) {
@@ -11295,7 +11309,9 @@
holder.state.getPackage(),
myTotalPss, myTotalUss, myTotalRss, reportType,
endTime-startTime,
- holder.appVersion);
+ holder.appVersion,
+ r.mProfile.getCurrentHostingComponentTypes(),
+ r.mProfile.getHistoricalHostingComponentTypes());
});
}
}
@@ -11938,7 +11954,9 @@
holder.state.getName(),
holder.state.getPackage(),
myTotalPss, myTotalUss, myTotalRss, reportType, endTime-startTime,
- holder.appVersion);
+ holder.appVersion,
+ r.mProfile.getCurrentHostingComponentTypes(),
+ r.mProfile.getHistoricalHostingComponentTypes());
});
}
}
@@ -12772,6 +12790,8 @@
newBackupUid = proc.isInFullBackup() ? r.appInfo.uid : -1;
mBackupTargets.put(targetUserId, r);
+ proc.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP);
+
// Try not to kill the process during backup
updateOomAdjLocked(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
@@ -12814,7 +12834,15 @@
}
synchronized (this) {
- mBackupTargets.delete(userId);
+ final int indexOfKey = mBackupTargets.indexOfKey(userId);
+ if (indexOfKey >= 0) {
+ final BackupRecord backupTarget = mBackupTargets.valueAt(indexOfKey);
+ if (backupTarget != null && backupTarget.app != null) {
+ backupTarget.app.mProfile.clearHostingComponentType(
+ HOSTING_COMPONENT_TYPE_BACKUP);
+ }
+ mBackupTargets.removeAt(indexOfKey);
+ }
}
JobSchedulerInternal js = LocalServices.getService(JobSchedulerInternal.class);
@@ -12892,6 +12920,7 @@
final ProcessRecord proc = backupTarget.app;
updateOomAdjLocked(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
proc.setInFullBackup(false);
+ proc.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP);
oldBackupUid = backupTarget != null ? backupTarget.appInfo.uid : -1;
@@ -14620,6 +14649,7 @@
}
app = addAppLocked(ai, defProcess, false, disableHiddenApiChecks,
disableTestApiChecks, abiOverride, ZYGOTE_POLICY_FLAG_EMPTY);
+ app.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_INSTRUMENTATION);
}
app.setActiveInstrumentation(activeInstr);
@@ -14744,6 +14774,7 @@
if (!mActiveInstrumentation.contains(activeInstr)) {
mActiveInstrumentation.add(activeInstr);
}
+ app.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_INSTRUMENTATION);
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -14873,6 +14904,7 @@
instr.removeProcess(app);
app.setActiveInstrumentation(null);
}
+ app.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_INSTRUMENTATION);
if (app.isSdkSandbox) {
// For sharedUid apps this will kill all sdk sandbox processes, which is not ideal.
@@ -15753,6 +15785,7 @@
if (app.isPersistent()) {
addAppLocked(app.info, null, false, null /* ABI override */,
ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+ app.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_PERSISTENT);
}
}
}
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java
index 16a7283..61d8568 100644
--- a/services/core/java/com/android/server/am/AppProfiler.java
+++ b/services/core/java/com/android/server/am/AppProfiler.java
@@ -573,7 +573,9 @@
holder.state.getPackage(),
pss, uss, rss,
statType, pssDuration,
- holder.appVersion);
+ holder.appVersion,
+ profile.getCurrentHostingComponentTypes(),
+ profile.getHistoricalHostingComponentTypes());
});
if (DEBUG_PSS) {
Slog.d(TAG_PSS,
diff --git a/services/core/java/com/android/server/am/ContentProviderHelper.java b/services/core/java/com/android/server/am/ContentProviderHelper.java
index 24e815e..7289331 100644
--- a/services/core/java/com/android/server/am/ContentProviderHelper.java
+++ b/services/core/java/com/android/server/am/ContentProviderHelper.java
@@ -24,6 +24,7 @@
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
import static com.android.server.am.ActivityManagerService.TAG_MU;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_PROVIDER;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
@@ -701,6 +702,9 @@
dst.onProviderPublishStatusLocked(true);
}
dst.mRestartCount = 0;
+ if (hasProviderConnectionLocked(r)) {
+ r.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_PROVIDER);
+ }
}
// update the app's oom adj value and each provider's usage stats
@@ -1375,6 +1379,9 @@
conn.startAssociationIfNeeded();
conn.initializeCount(stable);
cpr.connections.add(conn);
+ if (cpr.proc != null) {
+ cpr.proc.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_PROVIDER);
+ }
pr.addProviderConnection(conn);
mService.startAssociationLocked(r.uid, r.processName, r.mState.getCurProcState(),
cpr.uid, cpr.appInfo.longVersionCode, cpr.name, cpr.info.processName);
@@ -1418,6 +1425,16 @@
return true;
}
+ @GuardedBy("mService")
+ private boolean hasProviderConnectionLocked(ProcessRecord proc) {
+ for (int i = proc.mProviders.numberOfProviders() - 1; i >= 0; i--) {
+ if (!proc.mProviders.getProviderAt(i).connections.isEmpty()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private void handleProviderRemoval(ContentProviderConnection conn, boolean stable,
boolean updateOomAdj) {
synchronized (mService) {
@@ -1429,6 +1446,9 @@
final ContentProviderRecord cpr = conn.provider;
conn.stopAssociation();
cpr.connections.remove(conn);
+ if (cpr.proc != null && !hasProviderConnectionLocked(cpr.proc)) {
+ cpr.proc.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_PROVIDER);
+ }
conn.client.mProviders.removeProviderConnection(conn);
if (conn.client.mState.getSetProcState()
< ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
@@ -1737,6 +1757,9 @@
// In the protocol here, we don't expect the client to correctly
// clean up this connection, we'll just remove it.
cpr.connections.remove(i);
+ if (cpr.proc != null && !hasProviderConnectionLocked(cpr.proc)) {
+ cpr.proc.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_PROVIDER);
+ }
if (conn.client.mProviders.removeProviderConnection(conn)) {
mService.stopAssociationLocked(capp.uid, capp.processName,
cpr.uid, cpr.appInfo.longVersionCode, cpr.name, cpr.info.processName);
diff --git a/services/core/java/com/android/server/am/ProcessProfileRecord.java b/services/core/java/com/android/server/am/ProcessProfileRecord.java
index 50970b5..cee34d5 100644
--- a/services/core/java/com/android/server/am/ProcessProfileRecord.java
+++ b/services/core/java/com/android/server/am/ProcessProfileRecord.java
@@ -19,6 +19,7 @@
import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static android.app.ActivityManager.processStateAmToProto;
+import android.annotation.IntDef;
import android.app.IApplicationThread;
import android.content.pm.ApplicationInfo;
import android.os.Debug;
@@ -35,12 +36,95 @@
import com.android.server.am.ProcessList.ProcStateMemTracker;
import java.io.PrintWriter;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
/**
* Profiling info of the process, such as PSS, cpu, etc.
*/
final class ProcessProfileRecord {
+ // Keep below types in sync with the HostingComponentType in the atoms.proto.
+ /**
+ * The type of the component this process is hosting;
+ * this means not hosting any components (cached).
+ */
+ static final int HOSTING_COMPONENT_TYPE_EMPTY = 0x0;
+
+ /**
+ * The type of the component this process is hosting;
+ * this means it's a system process.
+ */
+ static final int HOSTING_COMPONENT_TYPE_SYSTEM = 0x00000001;
+
+ /**
+ * The type of the component this process is hosting;
+ * this means it's a persistent process.
+ */
+ static final int HOSTING_COMPONENT_TYPE_PERSISTENT = 0x00000002;
+
+ /**
+ * The type of the component this process is hosting;
+ * this means it's hosting a backup/restore agent.
+ */
+ static final int HOSTING_COMPONENT_TYPE_BACKUP = 0x00000004;
+
+ /**
+ * The type of the component this process is hosting;
+ * this means it's hosting an instrumentation.
+ */
+ static final int HOSTING_COMPONENT_TYPE_INSTRUMENTATION = 0x00000008;
+
+ /**
+ * The type of the component this process is hosting;
+ * this means it's hosting an activity.
+ */
+ static final int HOSTING_COMPONENT_TYPE_ACTIVITY = 0x00000010;
+
+ /**
+ * The type of the component this process is hosting;
+ * this means it's hosting a broadcast receiver.
+ */
+ static final int HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER = 0x00000020;
+
+ /**
+ * The type of the component this process is hosting;
+ * this means it's hosting a content provider.
+ */
+ static final int HOSTING_COMPONENT_TYPE_PROVIDER = 0x00000040;
+
+ /**
+ * The type of the component this process is hosting;
+ * this means it's hosting a started service.
+ */
+ static final int HOSTING_COMPONENT_TYPE_STARTED_SERVICE = 0x00000080;
+
+ /**
+ * The type of the component this process is hosting;
+ * this means it's hosting a foreground service.
+ */
+ static final int HOSTING_COMPONENT_TYPE_FOREGROUND_SERVICE = 0x00000100;
+
+ /**
+ * The type of the component this process is hosting;
+ * this means it's being bound via a service binding.
+ */
+ static final int HOSTING_COMPONENT_TYPE_BOUND_SERVICE = 0x00000200;
+
+ @IntDef(flag = true, prefix = { "HOSTING_COMPONENT_TYPE_" }, value = {
+ HOSTING_COMPONENT_TYPE_EMPTY,
+ HOSTING_COMPONENT_TYPE_SYSTEM,
+ HOSTING_COMPONENT_TYPE_PERSISTENT,
+ HOSTING_COMPONENT_TYPE_BACKUP,
+ HOSTING_COMPONENT_TYPE_INSTRUMENTATION,
+ HOSTING_COMPONENT_TYPE_ACTIVITY,
+ HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER,
+ HOSTING_COMPONENT_TYPE_PROVIDER,
+ HOSTING_COMPONENT_TYPE_STARTED_SERVICE,
+ HOSTING_COMPONENT_TYPE_FOREGROUND_SERVICE,
+ HOSTING_COMPONENT_TYPE_BOUND_SERVICE,
+ })
+ @interface HostingComponentType {}
+
final ProcessRecord mApp;
private final ActivityManagerService mService;
@@ -194,6 +278,12 @@
@GuardedBy("mProfilerLock")
private long mLastStateTime;
+ private AtomicInteger mCurrentHostingComponentTypes =
+ new AtomicInteger(HOSTING_COMPONENT_TYPE_EMPTY);
+
+ private AtomicInteger mHistoricalHostingComponentTypes =
+ new AtomicInteger(HOSTING_COMPONENT_TYPE_EMPTY);
+
private final ActivityManagerGlobalLock mProcLock;
ProcessProfileRecord(final ProcessRecord app) {
@@ -292,6 +382,8 @@
mThread = null;
}
}
+ mCurrentHostingComponentTypes.set(HOSTING_COMPONENT_TYPE_EMPTY);
+ mHistoricalHostingComponentTypes.set(HOSTING_COMPONENT_TYPE_EMPTY);
}
@GuardedBy("mProfilerLock")
@@ -605,6 +697,23 @@
mLastStateTime = state.getLastStateTime();
}
+ void addHostingComponentType(@HostingComponentType int type) {
+ mCurrentHostingComponentTypes.set(mCurrentHostingComponentTypes.get() | type);
+ mHistoricalHostingComponentTypes.set(mHistoricalHostingComponentTypes.get() | type);
+ }
+
+ void clearHostingComponentType(@HostingComponentType int type) {
+ mCurrentHostingComponentTypes.set(mCurrentHostingComponentTypes.get() & ~type);
+ }
+
+ @HostingComponentType int getCurrentHostingComponentTypes() {
+ return mCurrentHostingComponentTypes.get();
+ }
+
+ @HostingComponentType int getHistoricalHostingComponentTypes() {
+ return mHistoricalHostingComponentTypes.get();
+ }
+
@GuardedBy("mService")
void dumpPss(PrintWriter pw, String prefix, long nowUptime) {
synchronized (mProfilerLock) {
@@ -643,6 +752,11 @@
pw.print(" reportLowMemory=");
pw.println(mReportLowMemory);
}
+ pw.print(prefix);
+ pw.print("currentHostingComponentTypes=0x");
+ pw.print(Integer.toHexString(getCurrentHostingComponentTypes()));
+ pw.print(" historicalHostingComponentTypes=0x");
+ pw.println(Integer.toHexString(getHistoricalHostingComponentTypes()));
}
void dumpCputime(PrintWriter pw, String prefix) {
diff --git a/services/core/java/com/android/server/am/ProcessServiceRecord.java b/services/core/java/com/android/server/am/ProcessServiceRecord.java
index 6b748193..486c8ed 100644
--- a/services/core/java/com/android/server/am/ProcessServiceRecord.java
+++ b/services/core/java/com/android/server/am/ProcessServiceRecord.java
@@ -16,6 +16,9 @@
package com.android.server.am;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_BOUND_SERVICE;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_FOREGROUND_SERVICE;
+
import android.app.ActivityManager;
import android.content.Context;
import android.os.IBinder;
@@ -141,6 +144,11 @@
mHasForegroundServices = hasForegroundServices;
mFgServiceTypes = fgServiceTypes;
mApp.getWindowProcessController().setHasForegroundServices(hasForegroundServices);
+ if (hasForegroundServices) {
+ mApp.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_FOREGROUND_SERVICE);
+ } else {
+ mApp.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_FOREGROUND_SERVICE);
+ }
}
boolean hasForegroundServices() {
@@ -295,6 +303,7 @@
boolean added = mServices.add(record);
if (added && record.serviceInfo != null) {
mApp.getWindowProcessController().onServiceStarted(record.serviceInfo);
+ updateHostingComonentTypeForBindingsLocked();
}
if (record.lastTopAlmostPerceptibleBindRequestUptimeMs > 0) {
mLastTopStartedAlmostPerceptibleBindRequestUptimeMs = Math.max(
@@ -318,6 +327,9 @@
if (record.lastTopAlmostPerceptibleBindRequestUptimeMs > 0) {
updateHasTopStartedAlmostPerceptibleServices();
}
+ if (removed) {
+ updateHostingComonentTypeForBindingsLocked();
+ }
return removed;
}
@@ -437,6 +449,23 @@
}
@GuardedBy("mService")
+ void updateHostingComonentTypeForBindingsLocked() {
+ boolean hasBoundClient = false;
+ for (int i = numberOfRunningServices() - 1; i >= 0; i--) {
+ final ServiceRecord sr = getRunningServiceAt(i);
+ if (sr != null && !sr.getConnections().isEmpty()) {
+ hasBoundClient = true;
+ break;
+ }
+ }
+ if (hasBoundClient) {
+ mApp.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_BOUND_SERVICE);
+ } else {
+ mApp.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_BOUND_SERVICE);
+ }
+ }
+
+ @GuardedBy("mService")
boolean incServiceCrashCountLocked(long now) {
final boolean procIsBoundForeground = mApp.mState.getCurProcState()
== ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
diff --git a/services/core/java/com/android/server/am/ProcessStateRecord.java b/services/core/java/com/android/server/am/ProcessStateRecord.java
index e0660b4..262436d 100644
--- a/services/core/java/com/android/server/am/ProcessStateRecord.java
+++ b/services/core/java/com/android/server/am/ProcessStateRecord.java
@@ -21,6 +21,9 @@
import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_ACTIVITY;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_STARTED_SERVICE;
import static com.android.server.am.ProcessRecord.TAG;
import android.annotation.ElapsedRealtimeLong;
@@ -694,6 +697,11 @@
@GuardedBy("mProcLock")
void setHasStartedServices(boolean hasStartedServices) {
mHasStartedServices = hasStartedServices;
+ if (hasStartedServices) {
+ mApp.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_STARTED_SERVICE);
+ } else {
+ mApp.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_STARTED_SERVICE);
+ }
}
@GuardedBy("mProcLock")
@@ -999,6 +1007,11 @@
if (mCachedHasActivities == VALUE_INVALID) {
mCachedHasActivities = mApp.getWindowProcessController().hasActivities() ? VALUE_TRUE
: VALUE_FALSE;
+ if (mCachedHasActivities == VALUE_TRUE) {
+ mApp.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_ACTIVITY);
+ } else {
+ mApp.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_ACTIVITY);
+ }
}
return mCachedHasActivities == VALUE_TRUE;
}
@@ -1065,6 +1078,9 @@
if (mCachedIsReceivingBroadcast == VALUE_TRUE) {
mCachedSchedGroup = tmpQueue.contains(mService.mFgBroadcastQueue)
? ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND;
+ mApp.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER);
+ } else {
+ mApp.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER);
}
}
return mCachedIsReceivingBroadcast == VALUE_TRUE;
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index 480e69b..4b82ad8 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -23,6 +23,7 @@
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOREGROUND_SERVICE;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_BOUND_SERVICE;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -693,6 +694,7 @@
app.removeAllowBackgroundActivityStartsToken(this);
}
app.mServices.updateBoundClientUids();
+ app.mServices.updateHostingComonentTypeForBindingsLocked();
}
app = proc;
if (pendingConnectionGroup > 0 && proc != null) {
@@ -717,6 +719,7 @@
}
if (proc != null) {
proc.mServices.updateBoundClientUids();
+ proc.mServices.updateHostingComonentTypeForBindingsLocked();
}
}
@@ -736,6 +739,7 @@
// if we have a process attached, add bound client uid of this connection to it
if (app != null) {
app.mServices.addBoundClientUid(c.clientUid);
+ app.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_BOUND_SERVICE);
}
}
@@ -744,6 +748,7 @@
// if we have a process attached, tell it to update the state of bound clients
if (app != null) {
app.mServices.updateBoundClientUids();
+ app.mServices.updateHostingComonentTypeForBindingsLocked();
}
}