diff options
| author | 2017-04-03 00:00:19 +0000 | |
|---|---|---|
| committer | 2017-04-03 00:00:19 +0000 | |
| commit | 7346613f27a6c52aa19cf8169ccd63b7075a2b1c (patch) | |
| tree | 9761e54ac21c6c6399e8ab1a7617f002c1346255 | |
| parent | 6003b7dff28e77206c6940b1cc2b67a6c5e9411c (diff) | |
| parent | bf1b181c6392f8b96e3cc6241453764cf0aa3661 (diff) | |
Merge "ConnectivityService: log wakelock activity in dumps" am: db104b2367 am: 146914c0d5
am: bf1b181c63
Change-Id: Id4c980a2a1ef7f51b6a06c7c8636160437e99b84
| -rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 119 |
1 files changed, 52 insertions, 67 deletions
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 003530e43173..2998c9f0743c 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -396,6 +396,10 @@ public class ConnectivityService extends IConnectivityManager.Stub */ private static final int EVENT_REGISTER_NETWORK_LISTENER_WITH_INTENT = 31; + private static String eventName(int what) { + return sMagicDecoderRing.get(what, Integer.toString(what)); + } + /** Handler thread used for both of the handlers below. */ @VisibleForTesting protected final HandlerThread mHandlerThread; @@ -408,15 +412,10 @@ public class ConnectivityService extends IConnectivityManager.Stub private Intent mInitialBroadcast; private PowerManager.WakeLock mNetTransitionWakeLock; - private String mNetTransitionWakeLockCausedBy = ""; private int mNetTransitionWakeLockSerialNumber; private int mNetTransitionWakeLockTimeout; private final PowerManager.WakeLock mPendingIntentWakeLock; - // used in DBG mode to track inet condition reports - private static final int INET_CONDITION_LOG_MAX_SIZE = 15; - private ArrayList mInetLog; - // track the current default http proxy - tell the world if we get a new one (real change) private volatile ProxyInfo mDefaultProxy = null; private Object mProxyLock = new Object(); @@ -458,10 +457,12 @@ public class ConnectivityService extends IConnectivityManager.Stub private final LocalLog mNetworkRequestInfoLogs = new LocalLog(MAX_NETWORK_REQUEST_LOGS); // NetworkInfo blocked and unblocked String log entries - // TODO: consider reducing memory usage. Each log line is ~40 2B chars, for a total of ~8kB. - private static final int MAX_NETWORK_INFO_LOGS = 100; + private static final int MAX_NETWORK_INFO_LOGS = 40; private final LocalLog mNetworkInfoBlockingLogs = new LocalLog(MAX_NETWORK_INFO_LOGS); + private static final int MAX_WAKELOCK_LOGS = 20; + private final LocalLog mWakelockLogs = new LocalLog(MAX_WAKELOCK_LOGS); + // Array of <Network,ReadOnlyLocalLogs> tracking network validation and results private static final int MAX_VALIDATION_LOGS = 10; private static class ValidationLog { @@ -818,10 +819,6 @@ public class ConnectivityService extends IConnectivityManager.Stub loge("Error registering observer :" + e); } - if (DBG) { - mInetLog = new ArrayList(); - } - mSettingsObserver = new SettingsObserver(mContext, mHandler); registerSettingsCallbacks(); @@ -1044,22 +1041,19 @@ public class ConnectivityService extends IConnectivityManager.Stub if (ni == null || !LOGD_BLOCKED_NETWORKINFO) { return; } - boolean removed = false; - boolean added = false; + final boolean blocked; synchronized (mBlockedAppUids) { if (ni.getDetailedState() == DetailedState.BLOCKED && mBlockedAppUids.add(uid)) { - added = true; + blocked = true; } else if (ni.isConnected() && mBlockedAppUids.remove(uid)) { - removed = true; + blocked = false; + } else { + return; } } - if (added) { - log("Returning blocked NetworkInfo to uid=" + uid); - mNetworkInfoBlockingLogs.log("BLOCKED " + uid); - } else if (removed) { - log("Returning unblocked NetworkInfo to uid=" + uid); - mNetworkInfoBlockingLogs.log("UNBLOCKED " + uid); - } + String action = blocked ? "BLOCKED" : "UNBLOCKED"; + log(String.format("Returning %s NetworkInfo to uid=%d", action, uid)); + mNetworkInfoBlockingLogs.log(action + " " + uid); } /** @@ -2023,16 +2017,6 @@ public class ConnectivityService extends IConnectivityManager.Stub mLegacyTypeTracker.dump(pw); - synchronized (this) { - pw.print("mNetTransitionWakeLock: currently " + - (mNetTransitionWakeLock.isHeld() ? "" : "not ") + "held"); - if (!TextUtils.isEmpty(mNetTransitionWakeLockCausedBy)) { - pw.println(", last requested for " + mNetTransitionWakeLockCausedBy); - } else { - pw.println(", last requested never"); - } - } - pw.println(); mTethering.dump(fd, pw, args); @@ -2042,17 +2026,6 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.println(); dumpAvoidBadWifiSettings(pw); - pw.println(); - if (mInetLog != null && mInetLog.size() > 0) { - pw.println(); - pw.println("Inet condition reports:"); - pw.increaseIndent(); - for(int i = 0; i < mInetLog.size(); i++) { - pw.println(mInetLog.get(i)); - } - pw.decreaseIndent(); - } - if (argsContain(args, "--short") == false) { pw.println(); synchronized (mValidationLogs) { @@ -2076,6 +2049,12 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.increaseIndent(); mNetworkInfoBlockingLogs.reverseDump(fd, pw, args); pw.decreaseIndent(); + + pw.println(); + pw.println("NetTransition WakeLock activity (most recent first):"); + pw.increaseIndent(); + mWakelockLogs.reverseDump(fd, pw, args); + pw.decreaseIndent(); } } @@ -2084,8 +2063,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkAgentInfo officialNai = getNetworkAgentInfoForNetwork(nai.network); if (officialNai != null && officialNai.equals(nai)) return true; if (officialNai != null || VDBG) { - final String msg = sMagicDecoderRing.get(what, Integer.toString(what)); - loge(msg + " - isLiveNetworkAgent found mismatched netId: " + officialNai + + loge(eventName(what) + " - isLiveNetworkAgent found mismatched netId: " + officialNai + " - " + nai); } return false; @@ -2122,8 +2100,7 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); if (nai == null) { if (VDBG) { - final String what = sMagicDecoderRing.get(msg.what, Integer.toString(msg.what)); - log(String.format("%s from unknown NetworkAgent", what)); + log(String.format("%s from unknown NetworkAgent", eventName(msg.what))); } return; } @@ -2872,25 +2849,7 @@ public class ConnectivityService extends IConnectivityManager.Stub switch (msg.what) { case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK: case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: { - String causedBy = null; - synchronized (ConnectivityService.this) { - if (msg.arg1 == mNetTransitionWakeLockSerialNumber && - mNetTransitionWakeLock.isHeld()) { - mNetTransitionWakeLock.release(); - causedBy = mNetTransitionWakeLockCausedBy; - } else { - break; - } - } - if (VDBG) { - if (msg.what == EVENT_EXPIRE_NET_TRANSITION_WAKELOCK) { - log("Failed to find a new network - expiring NetTransition Wakelock"); - } else { - log("NetTransition Wakelock (" + - (causedBy == null ? "unknown" : causedBy) + - " cleared because we found a replacement network"); - } - } + handleNetworkTransitionWakelockRelease(msg.what, msg.arg1); break; } case EVENT_APPLY_GLOBAL_HTTP_PROXY: { @@ -3129,7 +3088,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (mNetTransitionWakeLock.isHeld()) return; serialNum = ++mNetTransitionWakeLockSerialNumber; mNetTransitionWakeLock.acquire(); - mNetTransitionWakeLockCausedBy = forWhom; + mWakelockLogs.log(String.format("ACQUIRE %d for %s", serialNum, forWhom)); } mHandler.sendMessageDelayed(mHandler.obtainMessage( EVENT_EXPIRE_NET_TRANSITION_WAKELOCK, serialNum, 0), @@ -3137,6 +3096,32 @@ public class ConnectivityService extends IConnectivityManager.Stub return; } + private void handleNetworkTransitionWakelockRelease(int eventId, int wantSerialNumber) { + final int serialNumber; + final boolean isHeld; + final boolean release; + synchronized (this) { + serialNumber = mNetTransitionWakeLockSerialNumber; + isHeld = mNetTransitionWakeLock.isHeld(); + release = (wantSerialNumber == serialNumber) && isHeld; + if (release) { + mNetTransitionWakeLock.release(); + } + } + final String result; + if (release) { + result = "released"; + } else if (!isHeld) { + result = "already released"; + } else { + result = String.format("not released (serial number was %d)", serialNumber); + } + String msg = String.format( + "RELEASE %d by %s: %s", wantSerialNumber, eventName(eventId), result); + mWakelockLogs.log(msg); + if (DBG) log(msg); + } + // 100 percent is full good, 0 is full bad. @Override public void reportInetCondition(int networkType, int percentage) { |