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

Commit 4c66f8b2 authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Android (Google) Code Review
Browse files

Merge "Update NPMS to notify AMS when network policy rules are updated."

parents d5da694f e736185e
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -234,4 +234,11 @@ public abstract class ActivityManagerInternal {
     * @see android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY
     */
    public abstract void setHasOverlayUi(int pid, boolean hasOverlayUi);

    /**
     * Called after the network policy rules are updated by
     * {@link com.android.server.net.NetworkPolicyManagerService} for a specific {@param uid} and
     * {@param procStateSeq}.
     */
    public abstract void notifyNetworkPolicyRulesUpdated(int uid, long procStateSeq);
}
+2 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ class ActivityManagerDebugConfig {
    static final boolean DEBUG_LOCKTASK = DEBUG_ALL || false;
    static final boolean DEBUG_LRU = DEBUG_ALL || false;
    static final boolean DEBUG_MU = DEBUG_ALL || false;
    static final boolean DEBUG_NETWORK = DEBUG_ALL || false;
    static final boolean DEBUG_OOM_ADJ = DEBUG_ALL || false;
    static final boolean DEBUG_PAUSE = DEBUG_ALL || false;
    static final boolean DEBUG_POWER = DEBUG_ALL || false;
@@ -107,6 +108,7 @@ class ActivityManagerDebugConfig {
    static final String POSTFIX_LOCKTASK = (APPEND_CATEGORY_NAME) ? "_LockTask" : "";
    static final String POSTFIX_LRU = (APPEND_CATEGORY_NAME) ? "_LRU" : "";
    static final String POSTFIX_MU = "_MU";
    static final String POSTFIX_NETWORK = "_Network";
    static final String POSTFIX_OOM_ADJ = (APPEND_CATEGORY_NAME) ? "_OomAdj" : "";
    static final String POSTFIX_PAUSE = (APPEND_CATEGORY_NAME) ? "_Pause" : "";
    static final String POSTFIX_POWER = (APPEND_CATEGORY_NAME) ? "_Power" : "";
+29 −1
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IMMERSIVE;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LRU;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_NETWORK;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER;
@@ -107,6 +108,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKSCREE
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LRU;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_NETWORK;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_OOM_ADJ;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_POWER;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PROCESSES;
@@ -422,6 +424,7 @@ public class ActivityManagerService extends IActivityManager.Stub
    private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
    private static final String TAG_LRU = TAG + POSTFIX_LRU;
    private static final String TAG_MU = TAG + POSTFIX_MU;
    private static final String TAG_NETWORK = TAG + POSTFIX_NETWORK;
    private static final String TAG_OOM_ADJ = TAG + POSTFIX_OOM_ADJ;
    private static final String TAG_POWER = TAG + POSTFIX_POWER;
    private static final String TAG_PROCESS_OBSERVERS = TAG + POSTFIX_PROCESS_OBSERVERS;
@@ -23029,7 +23032,8 @@ public class ActivityManagerService extends IActivityManager.Stub
        }
    }
    private final class LocalService extends ActivityManagerInternal {
    @VisibleForTesting
    final class LocalService extends ActivityManagerInternal {
        @Override
        public void grantUriPermissionFromIntent(int callingUid, String targetPkg, Intent intent,
                int targetUserId) {
@@ -23279,6 +23283,30 @@ public class ActivityManagerService extends IActivityManager.Stub
                updateOomAdjLocked(pr);
            }
        }
        /**
         * Called after the network policy rules are updated by
         * {@link com.android.server.net.NetworkPolicyManagerService} for a specific {@param uid} and
         * {@param procStateSeq}.
         */
        @Override
        public void notifyNetworkPolicyRulesUpdated(int uid, long procStateSeq) {
            if (DEBUG_NETWORK) {
                Slog.d(TAG_NETWORK, "Got update from NPMS for uid: "
                        + uid + " seq: " + procStateSeq);
            }
            synchronized (ActivityManagerService.this) {
                final UidRecord record = mActiveUids.get(uid);
                if (record == null) {
                    if (DEBUG_NETWORK) {
                        Slog.d(TAG_NETWORK, "No active uidRecord for uid: " + uid
                                + " procStateSeq: " + procStateSeq);
                    }
                    return;
                }
                record.lastNetworkUpdatedProcStateSeq = procStateSeq;
            }
        }
    }
    private final class SleepTokenImpl extends SleepToken {
+7 −0
Original line number Diff line number Diff line
@@ -40,6 +40,11 @@ public final class UidRecord {
     * when {@link #curProcState} changes from background to foreground or vice versa.
     */
    long curProcStateSeq;
    /**
     * Last seq number for which NetworkPolicyManagerService notified ActivityManagerService that
     * network policies rules were updated.
     */
    long lastNetworkUpdatedProcStateSeq;

    static final int CHANGE_PROCSTATE = 0;
    static final int CHANGE_GONE = 1;
@@ -92,6 +97,8 @@ public final class UidRecord {
        sb.append(numProcs);
        sb.append(" curProcStateSeq:");
        sb.append(curProcStateSeq);
        sb.append(" lastNetworkUpdatedProcStateSeq:");
        sb.append(lastNetworkUpdatedProcStateSeq);
        sb.append("}");
        return sb.toString();
    }
+99 −0
Original line number Diff line number Diff line
@@ -96,6 +96,7 @@ import android.Manifest;
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.IActivityManager;
@@ -251,6 +252,13 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
    private static final int VERSION_SWITCH_UID = 10;
    private static final int VERSION_LATEST = VERSION_SWITCH_UID;

    /**
     * Max items written to {@link #ProcStateSeqHistory}.
     */
    @VisibleForTesting
    public static final int MAX_PROC_STATE_SEQ_HISTORY =
            ActivityManager.isLowRamDeviceStatic() ? 50 : 200;

    @VisibleForTesting
    public static final int TYPE_WARNING = 0x1;
    @VisibleForTesting
@@ -412,6 +420,15 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {

    private final IPackageManager mIPm;

    private ActivityManagerInternal mActivityManagerInternal;

    /**
     * This is used for debugging purposes. Whenever the IUidObserver.onUidStateChanged is called,
     * the uid and procStateSeq will be written to this and will be printed as part of dump.
     */
    @VisibleForTesting
    public ProcStateSeqHistory mObservedHistory
            = new ProcStateSeqHistory(MAX_PROC_STATE_SEQ_HISTORY);

    // TODO: keep whitelist of system-critical services that should never have
    // rules enforced, such as system, phone, and radio UIDs.
@@ -628,6 +645,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                }
            }

            mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
            try {
                mActivityManager.registerUidObserver(mUidObserver,
                        ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE,
@@ -724,7 +742,13 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
            Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "onUidStateChanged");
            try {
                synchronized (mUidRulesFirstLock) {
                    // We received a uid state change callback, add it to the history so that it
                    // will be useful for debugging.
                    mObservedHistory.addProcStateSeqUL(uid, procStateSeq);
                    // Now update the network policy rules as per the updated uid state.
                    updateUidStateUL(uid, procState);
                    // Updating the network rules is done, so notify AMS about this.
                    mActivityManagerInternal.notifyNetworkPolicyRulesUpdated(uid, procStateSeq);
                }
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
@@ -2429,6 +2453,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                    fout.println();
                }
                fout.decreaseIndent();

                fout.println("Observed uid state changes:");
                fout.increaseIndent();
                mObservedHistory.dumpUL(fout);
                fout.decreaseIndent();
            }
        }
    }
@@ -3669,4 +3698,74 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
            }
        }
    }

    /**
     * This class is used for storing and dumping the last {@link #MAX_PROC_STATE_SEQ_HISTORY}
     * (uid, procStateSeq) pairs.
     */
    @VisibleForTesting
    public static final class ProcStateSeqHistory {
        private static final int INVALID_UID = -1;

        /**
         * Denotes maximum number of items this history can hold.
         */
        private final int mMaxCapacity;
        /**
         * Used for storing the uid information.
         */
        private final int[] mUids;
        /**
         * Used for storing the sequence numbers associated with {@link #mUids}.
         */
        private final long[] mProcStateSeqs;
        /**
         * Points to the next available slot for writing (uid, procStateSeq) pair.
         */
        private int mHistoryNext;

        public ProcStateSeqHistory(int maxCapacity) {
            mMaxCapacity = maxCapacity;
            mUids = new int[mMaxCapacity];
            Arrays.fill(mUids, INVALID_UID);
            mProcStateSeqs = new long[mMaxCapacity];
        }

        @GuardedBy("mUidRulesFirstLock")
        public void addProcStateSeqUL(int uid, long procStateSeq) {
            mUids[mHistoryNext] = uid;
            mProcStateSeqs[mHistoryNext] = procStateSeq;
            mHistoryNext = increaseNext(mHistoryNext, 1);
        }

        @GuardedBy("mUidRulesFirstLock")
        public void dumpUL(IndentingPrintWriter fout) {
            if (mUids[0] == INVALID_UID) {
                fout.println("NONE");
                return;
            }
            int index = mHistoryNext;
            do {
                index = increaseNext(index, -1);
                if (mUids[index] == INVALID_UID) {
                    break;
                }
                fout.println(getString(mUids[index], mProcStateSeqs[index]));
            } while (index != mHistoryNext);
        }

        public static String getString(int uid, long procStateSeq) {
            return "UID=" + uid + " procStateSeq=" + procStateSeq;
        }

        private int increaseNext(int next, int increment) {
            next += increment;
            if (next >= mMaxCapacity) {
                next = 0;
            } else if (next < 0) {
                next = mMaxCapacity - 1;
            }
            return next;
        }
    }
}
Loading