Loading services/core/java/com/android/server/am/OomAdjuster.java +7 −8 Original line number Diff line number Diff line Loading @@ -132,13 +132,11 @@ import android.content.pm.ApplicationInfo; import android.content.pm.ServiceInfo; import android.net.NetworkPolicyManager; import android.os.Handler; import android.os.IBinder; import android.os.PowerManagerInternal; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.Trace; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; import android.util.proto.ProtoOutputStream; Loading @@ -153,6 +151,7 @@ import com.android.server.am.psc.ContentProviderConnectionInternal; import com.android.server.am.psc.PlatformCompatCache; import com.android.server.am.psc.PlatformCompatCache.CachedCompatChangeId; import com.android.server.am.psc.ProcessRecordInternal; import com.android.server.am.psc.ServiceRecordInternal; import com.android.server.am.psc.UidRecordInternal; import com.android.server.wm.WindowProcessController; Loading Loading @@ -829,13 +828,13 @@ public abstract class OomAdjuster { // If this process is a sandbox itself, also scan the app on whose behalf its running if (pr.isSdkSandbox) { for (int is = psr.numberOfRunningServices() - 1; is >= 0; is--) { ServiceRecord s = psr.getRunningServiceAt(is); ArrayMap<IBinder, ArrayList<ConnectionRecord>> serviceConnections = s.getConnections(); for (int conni = serviceConnections.size() - 1; conni >= 0; conni--) { ArrayList<ConnectionRecord> clist = serviceConnections.valueAt(conni); ServiceRecordInternal s = psr.getRunningServiceAt(is); for (int conni = s.getConnectionsSize() - 1; conni >= 0; conni--) { ArrayList<? extends ConnectionRecordInternal> clist = s.getConnectionAt(conni); for (int i = clist.size() - 1; i >= 0; i--) { ConnectionRecord cr = clist.get(i); // TODO(b/425766486): Switch to use ConnectionRecordInternal. ConnectionRecord cr = (ConnectionRecord) clist.get(i); ProcessRecord attributedApp = cr.binding.attributedClient; if (attributedApp == null || attributedApp == pr || ((attributedApp.getMaxAdj() >= ProcessList.SYSTEM_ADJ) Loading services/core/java/com/android/server/am/OomAdjusterImpl.java +6 −8 Original line number Diff line number Diff line Loading @@ -95,9 +95,7 @@ import android.app.ActivityManager; import android.app.ActivityManagerInternal.OomAdjReason; import android.content.Context; import android.content.pm.ServiceInfo; import android.os.IBinder; import android.os.Trace; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; Loading Loading @@ -1090,13 +1088,13 @@ public class OomAdjusterImpl extends OomAdjuster { final ProcessServiceRecord psr = app.mServices; for (int i = psr.numberOfRunningServices() - 1; i >= 0; i--) { final ServiceRecord s = psr.getRunningServiceAt(i); final ArrayMap<IBinder, ArrayList<ConnectionRecord>> serviceConnections = s.getConnections(); for (int j = serviceConnections.size() - 1; j >= 0; j--) { final ArrayList<ConnectionRecord> clist = serviceConnections.valueAt(j); final ServiceRecordInternal s = psr.getRunningServiceAt(i); for (int j = s.getConnectionsSize() - 1; j >= 0; j--) { final ArrayList<? extends ConnectionRecordInternal> clist = s.getConnectionAt(j); for (int k = clist.size() - 1; k >= 0; k--) { final ConnectionRecord cr = clist.get(k); // TODO(b/425766486): Switch to use ConnectionRecordInternal. final ConnectionRecord cr = (ConnectionRecord) clist.get(k); final ProcessRecord client; if (app.isSdkSandbox && cr.binding.attributedClient != null) { client = cr.binding.attributedClient; Loading services/core/java/com/android/server/am/ServiceRecord.java +11 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ import android.util.proto.ProtoUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.procstats.ServiceState; import com.android.server.LocalServices; import com.android.server.am.psc.ConnectionRecordInternal; import com.android.server.am.psc.ServiceRecordInternal; import com.android.server.notification.NotificationManagerInternal; import com.android.server.uri.NeededUriGrants; Loading Loading @@ -1280,6 +1281,16 @@ final class ServiceRecord extends ServiceRecordInternal implements ComponentName return connections; } @Override public int getConnectionsSize() { return connections.size(); } @Override public ArrayList<? extends ConnectionRecordInternal> getConnectionAt(int index) { return connections.valueAt(index); } void addConnection(IBinder binder, ConnectionRecord c) { ArrayList<ConnectionRecord> clist = connections.get(binder); if (clist == null) { Loading services/core/java/com/android/server/am/psc/ServiceRecordInternal.java +8 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.am.psc; import android.content.ComponentName; import android.os.Binder; import java.util.ArrayList; /** * Abstract base class for service records in the Activity Manager. * This class centralizes common service state fields that are essential for Loading Loading @@ -92,4 +94,10 @@ public abstract class ServiceRecordInternal extends Binder { * (e.g., location, camera, microphone) for capability determination. */ public abstract boolean isFgsAllowedWiu_forCapabilities(); /** Returns the number of connections to this service. */ public abstract int getConnectionsSize(); /** Returns the list of connections for a given index. */ public abstract ArrayList<? extends ConnectionRecordInternal> getConnectionAt(int index); } services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +6 −4 Original line number Diff line number Diff line Loading @@ -1666,7 +1666,6 @@ public class MockingOomAdjusterTests { ProcessRecord app = makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false); ServiceRecord s = makeServiceRecord(); doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections(); mProcessStateController.setStartRequested(s, true); mProcessStateController.setServiceLastActivityTime(s, SystemClock.uptimeMillis()); mProcessStateController.startService(app.mServices, s); Loading Loading @@ -4486,15 +4485,18 @@ public class MockingOomAdjusterTests { doCallRealMethod().when(record).setLastActivity(any(long.class)); doCallRealMethod().when(record).getForegroundServiceType(); doCallRealMethod().when(record).setForegroundServiceType(any(int.class)); setFieldValue(ServiceRecord.class, record, "connections", new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()); doCallRealMethod().when(record).getConnectionsSize(); doCallRealMethod().when(record).getConnectionAt(any(int.class)); doCallRealMethod().when(record).getConnections(); return record; } private ServiceRecord makeServiceRecord(ProcessRecord app) { final ServiceRecord record = makeServiceRecord(); mProcessStateController.setHostProcess(record, app); setFieldValue(ServiceRecord.class, record, "connections", new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()); doCallRealMethod().when(record).getConnections(); setFieldValue(ServiceRecord.class, record, "packageName", app.info.packageName); mProcessStateController.startService(app.mServices, record); record.appInfo = app.info; Loading Loading
services/core/java/com/android/server/am/OomAdjuster.java +7 −8 Original line number Diff line number Diff line Loading @@ -132,13 +132,11 @@ import android.content.pm.ApplicationInfo; import android.content.pm.ServiceInfo; import android.net.NetworkPolicyManager; import android.os.Handler; import android.os.IBinder; import android.os.PowerManagerInternal; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.Trace; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; import android.util.proto.ProtoOutputStream; Loading @@ -153,6 +151,7 @@ import com.android.server.am.psc.ContentProviderConnectionInternal; import com.android.server.am.psc.PlatformCompatCache; import com.android.server.am.psc.PlatformCompatCache.CachedCompatChangeId; import com.android.server.am.psc.ProcessRecordInternal; import com.android.server.am.psc.ServiceRecordInternal; import com.android.server.am.psc.UidRecordInternal; import com.android.server.wm.WindowProcessController; Loading Loading @@ -829,13 +828,13 @@ public abstract class OomAdjuster { // If this process is a sandbox itself, also scan the app on whose behalf its running if (pr.isSdkSandbox) { for (int is = psr.numberOfRunningServices() - 1; is >= 0; is--) { ServiceRecord s = psr.getRunningServiceAt(is); ArrayMap<IBinder, ArrayList<ConnectionRecord>> serviceConnections = s.getConnections(); for (int conni = serviceConnections.size() - 1; conni >= 0; conni--) { ArrayList<ConnectionRecord> clist = serviceConnections.valueAt(conni); ServiceRecordInternal s = psr.getRunningServiceAt(is); for (int conni = s.getConnectionsSize() - 1; conni >= 0; conni--) { ArrayList<? extends ConnectionRecordInternal> clist = s.getConnectionAt(conni); for (int i = clist.size() - 1; i >= 0; i--) { ConnectionRecord cr = clist.get(i); // TODO(b/425766486): Switch to use ConnectionRecordInternal. ConnectionRecord cr = (ConnectionRecord) clist.get(i); ProcessRecord attributedApp = cr.binding.attributedClient; if (attributedApp == null || attributedApp == pr || ((attributedApp.getMaxAdj() >= ProcessList.SYSTEM_ADJ) Loading
services/core/java/com/android/server/am/OomAdjusterImpl.java +6 −8 Original line number Diff line number Diff line Loading @@ -95,9 +95,7 @@ import android.app.ActivityManager; import android.app.ActivityManagerInternal.OomAdjReason; import android.content.Context; import android.content.pm.ServiceInfo; import android.os.IBinder; import android.os.Trace; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; Loading Loading @@ -1090,13 +1088,13 @@ public class OomAdjusterImpl extends OomAdjuster { final ProcessServiceRecord psr = app.mServices; for (int i = psr.numberOfRunningServices() - 1; i >= 0; i--) { final ServiceRecord s = psr.getRunningServiceAt(i); final ArrayMap<IBinder, ArrayList<ConnectionRecord>> serviceConnections = s.getConnections(); for (int j = serviceConnections.size() - 1; j >= 0; j--) { final ArrayList<ConnectionRecord> clist = serviceConnections.valueAt(j); final ServiceRecordInternal s = psr.getRunningServiceAt(i); for (int j = s.getConnectionsSize() - 1; j >= 0; j--) { final ArrayList<? extends ConnectionRecordInternal> clist = s.getConnectionAt(j); for (int k = clist.size() - 1; k >= 0; k--) { final ConnectionRecord cr = clist.get(k); // TODO(b/425766486): Switch to use ConnectionRecordInternal. final ConnectionRecord cr = (ConnectionRecord) clist.get(k); final ProcessRecord client; if (app.isSdkSandbox && cr.binding.attributedClient != null) { client = cr.binding.attributedClient; Loading
services/core/java/com/android/server/am/ServiceRecord.java +11 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ import android.util.proto.ProtoUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.procstats.ServiceState; import com.android.server.LocalServices; import com.android.server.am.psc.ConnectionRecordInternal; import com.android.server.am.psc.ServiceRecordInternal; import com.android.server.notification.NotificationManagerInternal; import com.android.server.uri.NeededUriGrants; Loading Loading @@ -1280,6 +1281,16 @@ final class ServiceRecord extends ServiceRecordInternal implements ComponentName return connections; } @Override public int getConnectionsSize() { return connections.size(); } @Override public ArrayList<? extends ConnectionRecordInternal> getConnectionAt(int index) { return connections.valueAt(index); } void addConnection(IBinder binder, ConnectionRecord c) { ArrayList<ConnectionRecord> clist = connections.get(binder); if (clist == null) { Loading
services/core/java/com/android/server/am/psc/ServiceRecordInternal.java +8 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.am.psc; import android.content.ComponentName; import android.os.Binder; import java.util.ArrayList; /** * Abstract base class for service records in the Activity Manager. * This class centralizes common service state fields that are essential for Loading Loading @@ -92,4 +94,10 @@ public abstract class ServiceRecordInternal extends Binder { * (e.g., location, camera, microphone) for capability determination. */ public abstract boolean isFgsAllowedWiu_forCapabilities(); /** Returns the number of connections to this service. */ public abstract int getConnectionsSize(); /** Returns the list of connections for a given index. */ public abstract ArrayList<? extends ConnectionRecordInternal> getConnectionAt(int index); }
services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +6 −4 Original line number Diff line number Diff line Loading @@ -1666,7 +1666,6 @@ public class MockingOomAdjusterTests { ProcessRecord app = makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false); ServiceRecord s = makeServiceRecord(); doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections(); mProcessStateController.setStartRequested(s, true); mProcessStateController.setServiceLastActivityTime(s, SystemClock.uptimeMillis()); mProcessStateController.startService(app.mServices, s); Loading Loading @@ -4486,15 +4485,18 @@ public class MockingOomAdjusterTests { doCallRealMethod().when(record).setLastActivity(any(long.class)); doCallRealMethod().when(record).getForegroundServiceType(); doCallRealMethod().when(record).setForegroundServiceType(any(int.class)); setFieldValue(ServiceRecord.class, record, "connections", new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()); doCallRealMethod().when(record).getConnectionsSize(); doCallRealMethod().when(record).getConnectionAt(any(int.class)); doCallRealMethod().when(record).getConnections(); return record; } private ServiceRecord makeServiceRecord(ProcessRecord app) { final ServiceRecord record = makeServiceRecord(); mProcessStateController.setHostProcess(record, app); setFieldValue(ServiceRecord.class, record, "connections", new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()); doCallRealMethod().when(record).getConnections(); setFieldValue(ServiceRecord.class, record, "packageName", app.info.packageName); mProcessStateController.startService(app.mServices, record); record.appInfo = app.info; Loading