Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a17a5171 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "psc: Allow ServiceRecordInternal to access ConnectionRecordInternal" into main

parents ec81db81 46093248
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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)
+6 −8
Original line number Diff line number Diff line
@@ -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;

@@ -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;
+11 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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) {
+8 −0
Original line number Diff line number Diff line
@@ -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
@@ -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);
}
+6 −4
Original line number Diff line number Diff line
@@ -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);
@@ -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;