From d939311ba4c8aaaf3317ac7441417ed342aa5e5a Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Mon, 17 Feb 2020 13:25:28 -0800 Subject: [PATCH] Allow verbose logging to be enabled for an app. Structured similar to "cmd activity watch-uids --oom ". Bug: 145420790 Test: manual Change-Id: I99c8427368234d5763e355a4f483eca764e29de3 --- .../server/net/NetworkPolicyLogger.java | 77 +++++++++++++++---- .../net/NetworkPolicyManagerService.java | 5 +- .../net/NetworkPolicyManagerShellCommand.java | 21 +++++ 3 files changed, 85 insertions(+), 18 deletions(-) diff --git a/services/core/java/com/android/server/net/NetworkPolicyLogger.java b/services/core/java/com/android/server/net/NetworkPolicyLogger.java index 6d82c1c257abb..3bd18f9a360ff 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyLogger.java +++ b/services/core/java/com/android/server/net/NetworkPolicyLogger.java @@ -24,9 +24,11 @@ import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_POWERSAVE; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_STANDBY; import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT; +import static android.os.Process.INVALID_UID; import android.app.ActivityManager; import android.net.NetworkPolicyManager; +import android.os.UserHandle; import android.util.Log; import android.util.Slog; @@ -79,19 +81,25 @@ public class NetworkPolicyLogger { private final LogBuffer mUidStateChangeBuffer = new LogBuffer(MAX_LOG_SIZE); private final LogBuffer mEventsBuffer = new LogBuffer(MAX_LOG_SIZE); + private int mDebugUid = INVALID_UID; + private final Object mLock = new Object(); void networkBlocked(int uid, int reason) { synchronized (mLock) { - if (LOGD) Slog.d(TAG, uid + " is " + getBlockedReason(reason)); + if (LOGD || uid == mDebugUid) { + Slog.d(TAG, uid + " is " + getBlockedReason(reason)); + } mNetworkBlockedBuffer.networkBlocked(uid, reason); } } void uidStateChanged(int uid, int procState, long procStateSeq) { synchronized (mLock) { - if (LOGV) Slog.v(TAG, - uid + " state changed to " + procState + " with seq=" + procStateSeq); + if (LOGV || uid == mDebugUid) { + Slog.v(TAG, uid + " state changed to " + + ProcessList.makeProcStateString(procState) + " with seq=" + procStateSeq); + } mUidStateChangeBuffer.uidStateChanged(uid, procState, procStateSeq); } } @@ -105,78 +113,105 @@ public class NetworkPolicyLogger { void uidPolicyChanged(int uid, int oldPolicy, int newPolicy) { synchronized (mLock) { - if (LOGV) Slog.v(TAG, getPolicyChangedLog(uid, oldPolicy, newPolicy)); + if (LOGV || uid == mDebugUid) { + Slog.v(TAG, + getPolicyChangedLog(uid, oldPolicy, newPolicy)); + } mEventsBuffer.uidPolicyChanged(uid, oldPolicy, newPolicy); } } void meterednessChanged(int netId, boolean newMetered) { synchronized (mLock) { - if (LOGD) Slog.d(TAG, getMeterednessChangedLog(netId, newMetered)); + if (LOGD || mDebugUid != INVALID_UID) { + Slog.d(TAG, + getMeterednessChangedLog(netId, newMetered)); + } mEventsBuffer.meterednessChanged(netId, newMetered); } } void removingUserState(int userId) { synchronized (mLock) { - if (LOGD) Slog.d(TAG, getUserRemovedLog(userId)); + if (LOGD || mDebugUid != INVALID_UID) { + Slog.d(TAG, getUserRemovedLog(userId)); + } mEventsBuffer.userRemoved(userId); } } void restrictBackgroundChanged(boolean oldValue, boolean newValue) { synchronized (mLock) { - if (LOGD) Slog.d(TAG, - getRestrictBackgroundChangedLog(oldValue, newValue)); + if (LOGD || mDebugUid != INVALID_UID) { + Slog.d(TAG, + getRestrictBackgroundChangedLog(oldValue, newValue)); + } mEventsBuffer.restrictBackgroundChanged(oldValue, newValue); } } void deviceIdleModeEnabled(boolean enabled) { synchronized (mLock) { - if (LOGD) Slog.d(TAG, getDeviceIdleModeEnabled(enabled)); + if (LOGD || mDebugUid != INVALID_UID) { + Slog.d(TAG, getDeviceIdleModeEnabled(enabled)); + } mEventsBuffer.deviceIdleModeEnabled(enabled); } } void appIdleStateChanged(int uid, boolean idle) { synchronized (mLock) { - if (LOGD) Slog.d(TAG, getAppIdleChangedLog(uid, idle)); + if (LOGD || uid == mDebugUid) { + Slog.d(TAG, getAppIdleChangedLog(uid, idle)); + } mEventsBuffer.appIdleStateChanged(uid, idle); } } void appIdleWlChanged(int uid, boolean isWhitelisted) { synchronized (mLock) { - if (LOGD) Slog.d(TAG, getAppIdleWlChangedLog(uid, isWhitelisted)); + if (LOGD || uid == mDebugUid) { + Slog.d(TAG, getAppIdleWlChangedLog(uid, isWhitelisted)); + } mEventsBuffer.appIdleWlChanged(uid, isWhitelisted); } } void paroleStateChanged(boolean paroleOn) { synchronized (mLock) { - if (LOGD) Slog.d(TAG, getParoleStateChanged(paroleOn)); + if (LOGD || mDebugUid != INVALID_UID) { + Slog.d(TAG, getParoleStateChanged(paroleOn)); + } mEventsBuffer.paroleStateChanged(paroleOn); } } void tempPowerSaveWlChanged(int appId, boolean added) { synchronized (mLock) { - if (LOGV) Slog.v(TAG, getTempPowerSaveWlChangedLog(appId, added)); + if (LOGV || appId == UserHandle.getAppId(mDebugUid)) { + Slog.v(TAG, + getTempPowerSaveWlChangedLog(appId, added)); + } mEventsBuffer.tempPowerSaveWlChanged(appId, added); } } void uidFirewallRuleChanged(int chain, int uid, int rule) { synchronized (mLock) { - if (LOGV) Slog.v(TAG, getUidFirewallRuleChangedLog(chain, uid, rule)); + if (LOGV || uid == mDebugUid) { + Slog.v(TAG, + getUidFirewallRuleChangedLog(chain, uid, rule)); + } mEventsBuffer.uidFirewallRuleChanged(chain, uid, rule); } } void firewallChainEnabled(int chain, boolean enabled) { synchronized (mLock) { - if (LOGD) Slog.d(TAG, getFirewallChainEnabledLog(chain, enabled)); + if (LOGD || mDebugUid != INVALID_UID) { + Slog.d(TAG, + getFirewallChainEnabledLog(chain, enabled)); + } mEventsBuffer.firewallChainEnabled(chain, enabled); } } @@ -185,7 +220,9 @@ public class NetworkPolicyLogger { synchronized (mLock) { final String log = "Firewall rules changed for " + getFirewallChainName(chain) + "; uids=" + Arrays.toString(uids) + "; rules=" + Arrays.toString(rules); - if (LOGD) Slog.d(TAG, log); + if (LOGD || mDebugUid != INVALID_UID) { + Slog.d(TAG, log); + } mEventsBuffer.event(log); } } @@ -193,11 +230,17 @@ public class NetworkPolicyLogger { void meteredRestrictedPkgsChanged(Set restrictedUids) { synchronized (mLock) { final String log = "Metered restricted uids: " + restrictedUids; - if (LOGD) Slog.d(TAG, log); + if (LOGD || mDebugUid != INVALID_UID) { + Slog.d(TAG, log); + } mEventsBuffer.event(log); } } + void setDebugUid(int uid) { + mDebugUid = uid; + } + void dumpLogs(IndentingPrintWriter pw) { synchronized (mLock) { pw.println(); diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index bb954ab2b5e69..6aa91a3bf139c 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -229,7 +229,6 @@ import com.android.internal.util.ConcurrentUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; -import com.android.internal.util.Preconditions; import com.android.internal.util.StatLogger; import com.android.server.EventLogTags; import com.android.server.LocalServices; @@ -3601,6 +3600,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { this, in, out, err, args, callback, resultReceiver); } + void setDebugUid(int uid) { + mLogger.setDebugUid(uid); + } + @VisibleForTesting boolean isUidForeground(int uid) { synchronized (mUidRulesFirstLock) { diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java index 156c01dbcbb38..7bcf3183bf697 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java @@ -24,6 +24,7 @@ import android.content.Context; import android.net.NetworkPolicyManager; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; +import android.os.Process; import android.os.RemoteException; import android.os.ShellCommand; @@ -58,6 +59,10 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return runAdd(); case "remove": return runRemove(); + case "start-watching": + return runStartWatching(); + case "stop-watching": + return runStopWatching(); default: return handleDefaultCommands(cmd); } @@ -197,6 +202,22 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return -1; } + private int runStartWatching() { + final int uid = Integer.parseInt(getNextArgRequired()); + if (uid < 0) { + final PrintWriter pw = getOutPrintWriter(); + pw.print("Invalid UID: "); pw.println(uid); + return -1; + } + mInterface.setDebugUid(uid); + return 0; + } + + private int runStopWatching() { + mInterface.setDebugUid(Process.INVALID_UID); + return 0; + } + private int listUidPolicies(String msg, int policy) throws RemoteException { final int[] uids = mInterface.getUidsWithPolicy(policy); return listUidList(msg, uids);