Loading core/java/android/app/ActivityManagerInternal.java +7 −0 Original line number Diff line number Diff line Loading @@ -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); } services/core/java/com/android/server/am/ActivityManagerDebugConfig.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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" : ""; Loading services/core/java/com/android/server/am/ActivityManagerService.java +29 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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 { services/core/java/com/android/server/am/UidRecord.java +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading services/core/java/com/android/server/net/NetworkPolicyManagerService.java +99 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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. Loading Loading @@ -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, Loading Loading @@ -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); Loading Loading @@ -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(); } } } Loading Loading @@ -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
core/java/android/app/ActivityManagerInternal.java +7 −0 Original line number Diff line number Diff line Loading @@ -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); }
services/core/java/com/android/server/am/ActivityManagerDebugConfig.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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" : ""; Loading
services/core/java/com/android/server/am/ActivityManagerService.java +29 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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 {
services/core/java/com/android/server/am/UidRecord.java +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading
services/core/java/com/android/server/net/NetworkPolicyManagerService.java +99 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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. Loading Loading @@ -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, Loading Loading @@ -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); Loading Loading @@ -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(); } } } Loading Loading @@ -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; } } }