Loading services/core/java/com/android/server/ConnectivityService.java +52 −67 Original line number Original line Diff line number Diff line Loading @@ -396,6 +396,10 @@ public class ConnectivityService extends IConnectivityManager.Stub */ */ private static final int EVENT_REGISTER_NETWORK_LISTENER_WITH_INTENT = 31; 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. */ /** Handler thread used for both of the handlers below. */ @VisibleForTesting @VisibleForTesting protected final HandlerThread mHandlerThread; protected final HandlerThread mHandlerThread; Loading @@ -408,15 +412,10 @@ public class ConnectivityService extends IConnectivityManager.Stub private Intent mInitialBroadcast; private Intent mInitialBroadcast; private PowerManager.WakeLock mNetTransitionWakeLock; private PowerManager.WakeLock mNetTransitionWakeLock; private String mNetTransitionWakeLockCausedBy = ""; private int mNetTransitionWakeLockSerialNumber; private int mNetTransitionWakeLockSerialNumber; private int mNetTransitionWakeLockTimeout; private int mNetTransitionWakeLockTimeout; private final PowerManager.WakeLock mPendingIntentWakeLock; 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) // track the current default http proxy - tell the world if we get a new one (real change) private volatile ProxyInfo mDefaultProxy = null; private volatile ProxyInfo mDefaultProxy = null; private Object mProxyLock = new Object(); private Object mProxyLock = new Object(); Loading Loading @@ -458,10 +457,12 @@ public class ConnectivityService extends IConnectivityManager.Stub private final LocalLog mNetworkRequestInfoLogs = new LocalLog(MAX_NETWORK_REQUEST_LOGS); private final LocalLog mNetworkRequestInfoLogs = new LocalLog(MAX_NETWORK_REQUEST_LOGS); // NetworkInfo blocked and unblocked String log entries // 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 = 40; private static final int MAX_NETWORK_INFO_LOGS = 100; private final LocalLog mNetworkInfoBlockingLogs = new LocalLog(MAX_NETWORK_INFO_LOGS); 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 // Array of <Network,ReadOnlyLocalLogs> tracking network validation and results private static final int MAX_VALIDATION_LOGS = 10; private static final int MAX_VALIDATION_LOGS = 10; private static class ValidationLog { private static class ValidationLog { Loading Loading @@ -818,10 +819,6 @@ public class ConnectivityService extends IConnectivityManager.Stub loge("Error registering observer :" + e); loge("Error registering observer :" + e); } } if (DBG) { mInetLog = new ArrayList(); } mSettingsObserver = new SettingsObserver(mContext, mHandler); mSettingsObserver = new SettingsObserver(mContext, mHandler); registerSettingsCallbacks(); registerSettingsCallbacks(); Loading Loading @@ -1044,22 +1041,19 @@ public class ConnectivityService extends IConnectivityManager.Stub if (ni == null || !LOGD_BLOCKED_NETWORKINFO) { if (ni == null || !LOGD_BLOCKED_NETWORKINFO) { return; return; } } boolean removed = false; final boolean blocked; boolean added = false; synchronized (mBlockedAppUids) { synchronized (mBlockedAppUids) { if (ni.getDetailedState() == DetailedState.BLOCKED && mBlockedAppUids.add(uid)) { if (ni.getDetailedState() == DetailedState.BLOCKED && mBlockedAppUids.add(uid)) { added = true; blocked = true; } else if (ni.isConnected() && mBlockedAppUids.remove(uid)) { } 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); } } /** /** Loading Loading @@ -2023,16 +2017,6 @@ public class ConnectivityService extends IConnectivityManager.Stub mLegacyTypeTracker.dump(pw); 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(); pw.println(); mTethering.dump(fd, pw, args); mTethering.dump(fd, pw, args); Loading @@ -2042,17 +2026,6 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.println(); pw.println(); dumpAvoidBadWifiSettings(pw); 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) { if (argsContain(args, "--short") == false) { pw.println(); pw.println(); synchronized (mValidationLogs) { synchronized (mValidationLogs) { Loading @@ -2076,6 +2049,12 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.increaseIndent(); pw.increaseIndent(); mNetworkInfoBlockingLogs.reverseDump(fd, pw, args); mNetworkInfoBlockingLogs.reverseDump(fd, pw, args); pw.decreaseIndent(); pw.decreaseIndent(); pw.println(); pw.println("NetTransition WakeLock activity (most recent first):"); pw.increaseIndent(); mWakelockLogs.reverseDump(fd, pw, args); pw.decreaseIndent(); } } } } Loading @@ -2084,8 +2063,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkAgentInfo officialNai = getNetworkAgentInfoForNetwork(nai.network); final NetworkAgentInfo officialNai = getNetworkAgentInfoForNetwork(nai.network); if (officialNai != null && officialNai.equals(nai)) return true; if (officialNai != null && officialNai.equals(nai)) return true; if (officialNai != null || VDBG) { if (officialNai != null || VDBG) { final String msg = sMagicDecoderRing.get(what, Integer.toString(what)); loge(eventName(what) + " - isLiveNetworkAgent found mismatched netId: " + officialNai + loge(msg + " - isLiveNetworkAgent found mismatched netId: " + officialNai + " - " + nai); " - " + nai); } } return false; return false; Loading Loading @@ -2122,8 +2100,7 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); if (nai == null) { if (nai == null) { if (VDBG) { if (VDBG) { final String what = sMagicDecoderRing.get(msg.what, Integer.toString(msg.what)); log(String.format("%s from unknown NetworkAgent", eventName(msg.what))); log(String.format("%s from unknown NetworkAgent", what)); } } return; return; } } Loading Loading @@ -2872,25 +2849,7 @@ public class ConnectivityService extends IConnectivityManager.Stub switch (msg.what) { switch (msg.what) { case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK: case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK: case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: { case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: { String causedBy = null; handleNetworkTransitionWakelockRelease(msg.what, msg.arg1); 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"); } } break; break; } } case EVENT_APPLY_GLOBAL_HTTP_PROXY: { case EVENT_APPLY_GLOBAL_HTTP_PROXY: { Loading Loading @@ -3129,7 +3088,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (mNetTransitionWakeLock.isHeld()) return; if (mNetTransitionWakeLock.isHeld()) return; serialNum = ++mNetTransitionWakeLockSerialNumber; serialNum = ++mNetTransitionWakeLockSerialNumber; mNetTransitionWakeLock.acquire(); mNetTransitionWakeLock.acquire(); mNetTransitionWakeLockCausedBy = forWhom; mWakelockLogs.log(String.format("ACQUIRE %d for %s", serialNum, forWhom)); } } mHandler.sendMessageDelayed(mHandler.obtainMessage( mHandler.sendMessageDelayed(mHandler.obtainMessage( EVENT_EXPIRE_NET_TRANSITION_WAKELOCK, serialNum, 0), EVENT_EXPIRE_NET_TRANSITION_WAKELOCK, serialNum, 0), Loading @@ -3137,6 +3096,32 @@ public class ConnectivityService extends IConnectivityManager.Stub return; 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. // 100 percent is full good, 0 is full bad. @Override @Override public void reportInetCondition(int networkType, int percentage) { public void reportInetCondition(int networkType, int percentage) { Loading Loading
services/core/java/com/android/server/ConnectivityService.java +52 −67 Original line number Original line Diff line number Diff line Loading @@ -396,6 +396,10 @@ public class ConnectivityService extends IConnectivityManager.Stub */ */ private static final int EVENT_REGISTER_NETWORK_LISTENER_WITH_INTENT = 31; 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. */ /** Handler thread used for both of the handlers below. */ @VisibleForTesting @VisibleForTesting protected final HandlerThread mHandlerThread; protected final HandlerThread mHandlerThread; Loading @@ -408,15 +412,10 @@ public class ConnectivityService extends IConnectivityManager.Stub private Intent mInitialBroadcast; private Intent mInitialBroadcast; private PowerManager.WakeLock mNetTransitionWakeLock; private PowerManager.WakeLock mNetTransitionWakeLock; private String mNetTransitionWakeLockCausedBy = ""; private int mNetTransitionWakeLockSerialNumber; private int mNetTransitionWakeLockSerialNumber; private int mNetTransitionWakeLockTimeout; private int mNetTransitionWakeLockTimeout; private final PowerManager.WakeLock mPendingIntentWakeLock; 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) // track the current default http proxy - tell the world if we get a new one (real change) private volatile ProxyInfo mDefaultProxy = null; private volatile ProxyInfo mDefaultProxy = null; private Object mProxyLock = new Object(); private Object mProxyLock = new Object(); Loading Loading @@ -458,10 +457,12 @@ public class ConnectivityService extends IConnectivityManager.Stub private final LocalLog mNetworkRequestInfoLogs = new LocalLog(MAX_NETWORK_REQUEST_LOGS); private final LocalLog mNetworkRequestInfoLogs = new LocalLog(MAX_NETWORK_REQUEST_LOGS); // NetworkInfo blocked and unblocked String log entries // 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 = 40; private static final int MAX_NETWORK_INFO_LOGS = 100; private final LocalLog mNetworkInfoBlockingLogs = new LocalLog(MAX_NETWORK_INFO_LOGS); 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 // Array of <Network,ReadOnlyLocalLogs> tracking network validation and results private static final int MAX_VALIDATION_LOGS = 10; private static final int MAX_VALIDATION_LOGS = 10; private static class ValidationLog { private static class ValidationLog { Loading Loading @@ -818,10 +819,6 @@ public class ConnectivityService extends IConnectivityManager.Stub loge("Error registering observer :" + e); loge("Error registering observer :" + e); } } if (DBG) { mInetLog = new ArrayList(); } mSettingsObserver = new SettingsObserver(mContext, mHandler); mSettingsObserver = new SettingsObserver(mContext, mHandler); registerSettingsCallbacks(); registerSettingsCallbacks(); Loading Loading @@ -1044,22 +1041,19 @@ public class ConnectivityService extends IConnectivityManager.Stub if (ni == null || !LOGD_BLOCKED_NETWORKINFO) { if (ni == null || !LOGD_BLOCKED_NETWORKINFO) { return; return; } } boolean removed = false; final boolean blocked; boolean added = false; synchronized (mBlockedAppUids) { synchronized (mBlockedAppUids) { if (ni.getDetailedState() == DetailedState.BLOCKED && mBlockedAppUids.add(uid)) { if (ni.getDetailedState() == DetailedState.BLOCKED && mBlockedAppUids.add(uid)) { added = true; blocked = true; } else if (ni.isConnected() && mBlockedAppUids.remove(uid)) { } 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); } } /** /** Loading Loading @@ -2023,16 +2017,6 @@ public class ConnectivityService extends IConnectivityManager.Stub mLegacyTypeTracker.dump(pw); 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(); pw.println(); mTethering.dump(fd, pw, args); mTethering.dump(fd, pw, args); Loading @@ -2042,17 +2026,6 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.println(); pw.println(); dumpAvoidBadWifiSettings(pw); 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) { if (argsContain(args, "--short") == false) { pw.println(); pw.println(); synchronized (mValidationLogs) { synchronized (mValidationLogs) { Loading @@ -2076,6 +2049,12 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.increaseIndent(); pw.increaseIndent(); mNetworkInfoBlockingLogs.reverseDump(fd, pw, args); mNetworkInfoBlockingLogs.reverseDump(fd, pw, args); pw.decreaseIndent(); pw.decreaseIndent(); pw.println(); pw.println("NetTransition WakeLock activity (most recent first):"); pw.increaseIndent(); mWakelockLogs.reverseDump(fd, pw, args); pw.decreaseIndent(); } } } } Loading @@ -2084,8 +2063,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkAgentInfo officialNai = getNetworkAgentInfoForNetwork(nai.network); final NetworkAgentInfo officialNai = getNetworkAgentInfoForNetwork(nai.network); if (officialNai != null && officialNai.equals(nai)) return true; if (officialNai != null && officialNai.equals(nai)) return true; if (officialNai != null || VDBG) { if (officialNai != null || VDBG) { final String msg = sMagicDecoderRing.get(what, Integer.toString(what)); loge(eventName(what) + " - isLiveNetworkAgent found mismatched netId: " + officialNai + loge(msg + " - isLiveNetworkAgent found mismatched netId: " + officialNai + " - " + nai); " - " + nai); } } return false; return false; Loading Loading @@ -2122,8 +2100,7 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); if (nai == null) { if (nai == null) { if (VDBG) { if (VDBG) { final String what = sMagicDecoderRing.get(msg.what, Integer.toString(msg.what)); log(String.format("%s from unknown NetworkAgent", eventName(msg.what))); log(String.format("%s from unknown NetworkAgent", what)); } } return; return; } } Loading Loading @@ -2872,25 +2849,7 @@ public class ConnectivityService extends IConnectivityManager.Stub switch (msg.what) { switch (msg.what) { case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK: case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK: case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: { case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: { String causedBy = null; handleNetworkTransitionWakelockRelease(msg.what, msg.arg1); 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"); } } break; break; } } case EVENT_APPLY_GLOBAL_HTTP_PROXY: { case EVENT_APPLY_GLOBAL_HTTP_PROXY: { Loading Loading @@ -3129,7 +3088,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (mNetTransitionWakeLock.isHeld()) return; if (mNetTransitionWakeLock.isHeld()) return; serialNum = ++mNetTransitionWakeLockSerialNumber; serialNum = ++mNetTransitionWakeLockSerialNumber; mNetTransitionWakeLock.acquire(); mNetTransitionWakeLock.acquire(); mNetTransitionWakeLockCausedBy = forWhom; mWakelockLogs.log(String.format("ACQUIRE %d for %s", serialNum, forWhom)); } } mHandler.sendMessageDelayed(mHandler.obtainMessage( mHandler.sendMessageDelayed(mHandler.obtainMessage( EVENT_EXPIRE_NET_TRANSITION_WAKELOCK, serialNum, 0), EVENT_EXPIRE_NET_TRANSITION_WAKELOCK, serialNum, 0), Loading @@ -3137,6 +3096,32 @@ public class ConnectivityService extends IConnectivityManager.Stub return; 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. // 100 percent is full good, 0 is full bad. @Override @Override public void reportInetCondition(int networkType, int percentage) { public void reportInetCondition(int networkType, int percentage) { Loading