Allow verbose logging to be enabled for an app.

Structured similar to "cmd activity watch-uids --oom <uid>".

Bug: 145420790
Test: manual
Change-Id: I99c8427368234d5763e355a4f483eca764e29de3
This commit is contained in:
Sudheer Shanka
2020-02-17 13:25:28 -08:00
parent cce9df2afc
commit d939311ba4
3 changed files with 85 additions and 18 deletions

View File

@@ -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<Integer> 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();

View File

@@ -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) {

View File

@@ -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);