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

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

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
parent cce9df2a
Loading
Loading
Loading
Loading
+60 −17
Original line number Diff line number Diff line
@@ -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,
            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();
+4 −1
Original line number Diff line number Diff line
@@ -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) {
+21 −0
Original line number Diff line number Diff line
@@ -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);