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

Commit e736185e authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

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

Bug: 27803922
Test: runtest -c com.android.server.am.ActivityManagerInternalTest frameworks-services
      runtest -c com.android.server.NetworkPolicyManagerServiceTest frameworks-services

Change-Id: I357fd5c80b7e6d3e63df95397e328c52f233958b
parent dd1997bc
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;
@@ -421,6 +423,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;
@@ -22901,7 +22904,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) {
@@ -23151,6 +23155,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();
            }
        }
    }
@@ -3609,4 +3638,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