diff options
| author | 2021-01-13 00:34:09 +0000 | |
|---|---|---|
| committer | 2021-01-13 00:34:09 +0000 | |
| commit | c27bf45cb62d6d51d9db613b3639fb1868e5186f (patch) | |
| tree | 13ade63ecd0205113d86dcd60c06d4db2df1898c | |
| parent | 55e40879e8be93f6eee36a8dca7d0551d25e88f0 (diff) | |
| parent | bbd9fb5c27045558af4368eae7edad2e83152307 (diff) | |
Merge changes I3eb82680,I9d6147d9 am: bbd9fb5c27
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1547644
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: I8d65a0465729426fb038004cd80a15ca9e438b0e
10 files changed, 170 insertions, 51 deletions
diff --git a/core/java/android/net/IIpConnectivityMetrics.aidl b/core/java/android/net/IIpConnectivityMetrics.aidl index aeaf09d8fafe..aa3682d92105 100644 --- a/core/java/android/net/IIpConnectivityMetrics.aidl +++ b/core/java/android/net/IIpConnectivityMetrics.aidl @@ -19,6 +19,9 @@ package android.net; import android.os.Parcelable; import android.net.ConnectivityMetricsEvent; import android.net.INetdEventCallback; +import android.net.LinkProperties; +import android.net.Network; +import android.net.NetworkCapabilities; /** {@hide} */ interface IIpConnectivityMetrics { @@ -29,6 +32,11 @@ interface IIpConnectivityMetrics { */ int logEvent(in ConnectivityMetricsEvent event); + void logDefaultNetworkValidity(boolean valid); + void logDefaultNetworkEvent(in Network defaultNetwork, int score, boolean validated, + in LinkProperties lp, in NetworkCapabilities nc, in Network previousDefaultNetwork, + int previousScore, in LinkProperties previousLp, in NetworkCapabilities previousNc); + /** * Callback can be registered by DevicePolicyManager or NetworkWatchlistService only. * @return status {@code true} if registering/unregistering of the callback was successful, diff --git a/core/java/android/net/metrics/IpConnectivityLog.java b/core/java/android/net/metrics/IpConnectivityLog.java index a008d855025a..58ea91573775 100644 --- a/core/java/android/net/metrics/IpConnectivityLog.java +++ b/core/java/android/net/metrics/IpConnectivityLog.java @@ -17,10 +17,13 @@ package android.net.metrics; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.net.ConnectivityMetricsEvent; import android.net.IIpConnectivityMetrics; +import android.net.LinkProperties; import android.net.Network; +import android.net.NetworkCapabilities; import android.os.Parcelable; import android.os.RemoteException; import android.os.ServiceManager; @@ -66,6 +69,9 @@ public class IpConnectivityLog { final IIpConnectivityMetrics service = IIpConnectivityMetrics.Stub.asInterface(ServiceManager.getService(SERVICE_NAME)); if (service == null) { + if (DBG) { + Log.d(TAG, SERVICE_NAME + " service was not ready"); + } return false; } // Two threads racing here will write the same pointer because getService @@ -83,9 +89,6 @@ public class IpConnectivityLog { */ public boolean log(@NonNull ConnectivityMetricsEvent ev) { if (!checkLoggerService()) { - if (DBG) { - Log.d(TAG, SERVICE_NAME + " service was not ready"); - } return false; } if (ev.timestamp == 0) { @@ -161,6 +164,56 @@ public class IpConnectivityLog { return log(makeEv(data)); } + /** + * Logs the validation status of the default network. + * @param valid whether the current default network was validated (i.e., whether it had + * {@link NetworkCapabilities.NET_CAPABILITY_VALIDATED} + * @return true if the event was successfully logged. + * @hide + */ + public boolean logDefaultNetworkValidity(boolean valid) { + if (!checkLoggerService()) { + return false; + } + try { + mService.logDefaultNetworkValidity(valid); + } catch (RemoteException ignored) { + // Only called within the system server. + } + return true; + } + + /** + * Logs a change in the default network. + * + * @param defaultNetwork the current default network + * @param score the current score of {@code defaultNetwork} + * @param lp the {@link LinkProperties} of {@code defaultNetwork} + * @param nc the {@link NetworkCapabilities} of the {@code defaultNetwork} + * @param validated whether {@code defaultNetwork} network is validated + * @param previousDefaultNetwork the previous default network + * @param previousScore the score of {@code previousDefaultNetwork} + * @param previousLp the {@link LinkProperties} of {@code previousDefaultNetwork} + * @param previousNc the {@link NetworkCapabilities} of {@code previousDefaultNetwork} + * @return true if the event was successfully logged. + * @hide + */ + public boolean logDefaultNetworkEvent(@Nullable Network defaultNetwork, int score, + boolean validated, @Nullable LinkProperties lp, @Nullable NetworkCapabilities nc, + @Nullable Network previousDefaultNetwork, int previousScore, + @Nullable LinkProperties previousLp, @Nullable NetworkCapabilities previousNc) { + if (!checkLoggerService()) { + return false; + } + try { + mService.logDefaultNetworkEvent(defaultNetwork, score, validated, lp, nc, + previousDefaultNetwork, previousScore, previousLp, previousNc); + } catch (RemoteException ignored) { + // Only called within the system server. + } + return true; + } + private static ConnectivityMetricsEvent makeEv(Event data) { ConnectivityMetricsEvent ev = new ConnectivityMetricsEvent(); ev.data = data; diff --git a/services/core/Android.bp b/services/core/Android.bp index 01060ca94066..307d344bffa7 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -189,15 +189,11 @@ filegroup { "java/com/android/server/connectivity/AutodestructReference.java", "java/com/android/server/connectivity/ConnectivityConstants.java", "java/com/android/server/connectivity/DataConnectionStats.java", - "java/com/android/server/connectivity/DefaultNetworkMetrics.java", "java/com/android/server/connectivity/DnsManager.java", - "java/com/android/server/connectivity/IpConnectivityEventBuilder.java", - "java/com/android/server/connectivity/IpConnectivityMetrics.java", "java/com/android/server/connectivity/KeepaliveTracker.java", "java/com/android/server/connectivity/LingerMonitor.java", "java/com/android/server/connectivity/MockableSystemProperties.java", "java/com/android/server/connectivity/Nat464Xlat.java", - "java/com/android/server/connectivity/NetdEventListenerService.java", "java/com/android/server/connectivity/NetworkAgentInfo.java", "java/com/android/server/connectivity/NetworkDiagnostics.java", "java/com/android/server/connectivity/NetworkNotificationManager.java", diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index f1f1c8ed0a4f..69f2457ed5de 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -89,7 +89,6 @@ import android.net.ICaptivePortal; import android.net.IConnectivityDiagnosticsCallback; import android.net.IConnectivityManager; import android.net.IDnsResolver; -import android.net.IIpConnectivityMetrics; import android.net.INetd; import android.net.INetworkManagementEventObserver; import android.net.INetworkMonitor; @@ -156,7 +155,6 @@ import android.os.PersistableBundle; import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.ServiceSpecificException; import android.os.SystemClock; import android.os.SystemProperties; @@ -929,14 +927,6 @@ public class ConnectivityService extends IConnectivityManager.Stub "no IpConnectivityMetrics service"); } - /** - * @see IpConnectivityMetrics - */ - public IIpConnectivityMetrics getIpConnectivityMetrics() { - return IIpConnectivityMetrics.Stub.asInterface( - ServiceManager.getService(IpConnectivityLog.SERVICE_NAME)); - } - public IBatteryStats getBatteryStatsService() { return BatteryStatsService.getService(); } @@ -3009,9 +2999,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } if (valid != nai.lastValidated) { if (wasDefault) { - mDeps.getMetricsLogger() - .defaultNetworkMetrics().logDefaultNetworkValidity( - SystemClock.elapsedRealtime(), valid); + mMetricsLog.logDefaultNetworkValidity(valid); } final int oldScore = nai.getCurrentScore(); nai.lastValidated = valid; @@ -3439,7 +3427,9 @@ public class ConnectivityService extends IConnectivityManager.Stub // if there is a fallback. Taken together, the two form a X -> 0, 0 -> Y sequence // whose timestamps tell how long it takes to recover a default network. long now = SystemClock.elapsedRealtime(); - mDeps.getMetricsLogger().defaultNetworkMetrics().logDefaultNetworkEvent(now, null, nai); + mMetricsLog.logDefaultNetworkEvent(null, 0, false, + null /* lp */, null /* nc */, nai.network, nai.getCurrentScore(), + nai.linkProperties, nai.networkCapabilities); } notifyIfacesChangedForNetworkStats(); // TODO - we shouldn't send CALLBACK_LOST to requests that can be satisfied @@ -7238,9 +7228,28 @@ public class ConnectivityService extends IConnectivityManager.Stub updateDataActivityTracking(newDefaultNetwork, oldDefaultNetwork); // Notify system services of the new default. makeDefault(newDefaultNetwork); + // Log 0 -> X and Y -> X default network transitions, where X is the new default. - mDeps.getMetricsLogger().defaultNetworkMetrics().logDefaultNetworkEvent( - now, newDefaultNetwork, oldDefaultNetwork); + final Network network = (newDefaultNetwork != null) ? newDefaultNetwork.network : null; + final int score = (newDefaultNetwork != null) ? newDefaultNetwork.getCurrentScore() : 0; + final boolean validated = newDefaultNetwork != null && newDefaultNetwork.lastValidated; + final LinkProperties lp = (newDefaultNetwork != null) + ? newDefaultNetwork.linkProperties : null; + final NetworkCapabilities nc = (newDefaultNetwork != null) + ? newDefaultNetwork.networkCapabilities : null; + + final Network prevNetwork = (oldDefaultNetwork != null) + ? oldDefaultNetwork.network : null; + final int prevScore = (oldDefaultNetwork != null) + ? oldDefaultNetwork.getCurrentScore() : 0; + final LinkProperties prevLp = (oldDefaultNetwork != null) + ? oldDefaultNetwork.linkProperties : null; + final NetworkCapabilities prevNc = (oldDefaultNetwork != null) + ? oldDefaultNetwork.networkCapabilities : null; + + mMetricsLog.logDefaultNetworkEvent(network, score, validated, lp, nc, + prevNetwork, prevScore, prevLp, prevNc); + // Have a new default network, release the transition wakelock in scheduleReleaseNetworkTransitionWakelock(); } diff --git a/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java b/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java index 995bb2422de2..8cd1fd6f2b64 100644 --- a/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java +++ b/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java @@ -17,6 +17,8 @@ package com.android.server.connectivity; import android.net.LinkProperties; +import android.net.Network; +import android.net.NetworkCapabilities; import android.net.metrics.DefaultNetworkEvent; import android.os.SystemClock; @@ -61,7 +63,7 @@ public class DefaultNetworkMetrics { private int mLastTransports; public DefaultNetworkMetrics() { - newDefaultNetwork(creationTimeMs, null); + newDefaultNetwork(creationTimeMs, null, 0, false, null, null); } public synchronized void listEvents(PrintWriter pw) { @@ -117,13 +119,21 @@ public class DefaultNetworkMetrics { mCurrentDefaultNetwork.validatedMs += timeMs - mLastValidationTimeMs; } - public synchronized void logDefaultNetworkEvent( - long timeMs, NetworkAgentInfo newNai, NetworkAgentInfo oldNai) { - logCurrentDefaultNetwork(timeMs, oldNai); - newDefaultNetwork(timeMs, newNai); + /** + * Logs a default network event. + * @see {IpConnectivityLog#logDefaultNetworkEvent}. + */ + public synchronized void logDefaultNetworkEvent(long timeMs, Network defaultNetwork, int score, + boolean validated, LinkProperties lp, NetworkCapabilities nc, + Network previousDefaultNetwork, int previousScore, LinkProperties previousLp, + NetworkCapabilities previousNc) { + logCurrentDefaultNetwork(timeMs, previousDefaultNetwork, previousScore, previousLp, + previousNc); + newDefaultNetwork(timeMs, defaultNetwork, score, validated, lp, nc); } - private void logCurrentDefaultNetwork(long timeMs, NetworkAgentInfo oldNai) { + private void logCurrentDefaultNetwork(long timeMs, Network network, int score, + LinkProperties lp, NetworkCapabilities nc) { if (mIsCurrentlyValid) { updateValidationTime(timeMs); } @@ -131,10 +141,10 @@ public class DefaultNetworkMetrics { ev.updateDuration(timeMs); ev.previousTransports = mLastTransports; // oldNai is null if the system had no default network before the transition. - if (oldNai != null) { + if (network != null) { // The system acquired a new default network. - fillLinkInfo(ev, oldNai); - ev.finalScore = oldNai.getCurrentScore(); + fillLinkInfo(ev, network, lp, nc); + ev.finalScore = score; } // Only change transport of the previous default network if the event currently logged // corresponds to an existing default network, and not to the absence of a default network. @@ -147,14 +157,15 @@ public class DefaultNetworkMetrics { mEventsLog.append(ev); } - private void newDefaultNetwork(long timeMs, NetworkAgentInfo newNai) { + private void newDefaultNetwork(long timeMs, Network network, int score, boolean validated, + LinkProperties lp, NetworkCapabilities nc) { DefaultNetworkEvent ev = new DefaultNetworkEvent(timeMs); ev.durationMs = timeMs; // newNai is null if the system has no default network after the transition. - if (newNai != null) { - fillLinkInfo(ev, newNai); - ev.initialScore = newNai.getCurrentScore(); - if (newNai.lastValidated) { + if (network != null) { + fillLinkInfo(ev, network, lp, nc); + ev.initialScore = score; + if (validated) { mIsCurrentlyValid = true; mLastValidationTimeMs = timeMs; } @@ -164,10 +175,10 @@ public class DefaultNetworkMetrics { mCurrentDefaultNetwork = ev; } - private static void fillLinkInfo(DefaultNetworkEvent ev, NetworkAgentInfo nai) { - LinkProperties lp = nai.linkProperties; - ev.netId = nai.network().getNetId(); - ev.transports |= BitUtils.packBits(nai.networkCapabilities.getTransportTypes()); + private static void fillLinkInfo(DefaultNetworkEvent ev, Network network, LinkProperties lp, + NetworkCapabilities nc) { + ev.netId = network.getNetId(); + ev.transports |= BitUtils.packBits(nc.getTransportTypes()); ev.ipv4 |= lp.hasIpv4Address() && lp.hasIpv4DefaultRoute(); ev.ipv6 |= lp.hasGlobalIpv6Address() && lp.hasIpv6DefaultRoute(); } diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java index b5d875d5c162..1024556c17eb 100644 --- a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java +++ b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java @@ -20,11 +20,15 @@ import android.content.Context; import android.net.ConnectivityMetricsEvent; import android.net.IIpConnectivityMetrics; import android.net.INetdEventCallback; +import android.net.LinkProperties; +import android.net.Network; +import android.net.NetworkCapabilities; import android.net.NetworkStack; import android.net.metrics.ApfProgramEvent; import android.net.metrics.IpConnectivityLog; import android.os.Binder; import android.os.Process; +import android.os.SystemClock; import android.provider.Settings; import android.text.TextUtils; import android.text.format.DateUtils; @@ -122,8 +126,6 @@ final public class IpConnectivityMetrics extends SystemService { public IpConnectivityMetrics(Context ctx, ToIntFunction<Context> capacityGetter) { super(ctx); - // Load JNI libraries used by the IpConnectivityMetrics service and its dependencies - System.loadLibrary("service-connectivity"); mCapacityGetter = capacityGetter; initBuffer(); } @@ -363,6 +365,21 @@ final public class IpConnectivityMetrics extends SystemService { } return mNetdListener.removeNetdEventCallback(callerType); } + + @Override + public void logDefaultNetworkValidity(boolean valid) { + mDefaultNetworkMetrics.logDefaultNetworkValidity(SystemClock.elapsedRealtime(), valid); + } + + @Override + public void logDefaultNetworkEvent(Network defaultNetwork, int score, boolean validated, + LinkProperties lp, NetworkCapabilities nc, Network previousDefaultNetwork, + int previousScore, LinkProperties previousLp, NetworkCapabilities previousNc) { + final long timeMs = SystemClock.elapsedRealtime(); + mDefaultNetworkMetrics.logDefaultNetworkEvent(timeMs, defaultNetwork, score, validated, + lp, nc, previousDefaultNetwork, previousScore, previousLp, previousNc); + } + }; private static final ToIntFunction<Context> READ_BUFFER_SIZE = (ctx) -> { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index d533848c6f75..4cd1348a0f7a 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1222,8 +1222,7 @@ public final class SystemServer { } t.traceBegin("IpConnectivityMetrics"); - mSystemServiceManager.startServiceFromJar(IP_CONNECTIVITY_METRICS_CLASS, - CONNECTIVITY_SERVICE_APEX_PATH); + mSystemServiceManager.startService(IP_CONNECTIVITY_METRICS_CLASS); t.traceEnd(); t.traceBegin("NetworkWatchlistService"); diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java index 9c8a38219a9c..ac9316e7d908 100644 --- a/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java +++ b/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java @@ -24,6 +24,9 @@ import static org.junit.Assert.fail; import android.net.ConnectivityMetricsEvent; import android.net.IIpConnectivityMetrics; import android.net.INetdEventCallback; +import android.net.LinkProperties; +import android.net.Network; +import android.net.NetworkCapabilities; import android.os.Handler; import android.os.IBinder; import android.os.Message; @@ -106,6 +109,16 @@ public class NetworkWatchlistServiceTests { counter--; return true; } + + // TODO: mark @Override when aosp/1541935 automerges to master. + public void logDefaultNetworkValidity(boolean valid) { + } + + // TODO: mark @Override when aosp/1541935 automerges to master. + public void logDefaultNetworkEvent(Network defaultNetwork, int score, boolean validated, + LinkProperties lp, NetworkCapabilities nc, Network previousDefaultNetwork, + int previousScore, LinkProperties previousLp, NetworkCapabilities previousNc) { + } }; ServiceThread mHandlerThread; diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 1df78558c6a0..bfa9c77a55bc 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -161,7 +161,6 @@ import android.net.DataStallReportParcelable; import android.net.EthernetManager; import android.net.IConnectivityDiagnosticsCallback; import android.net.IDnsResolver; -import android.net.IIpConnectivityMetrics; import android.net.INetd; import android.net.INetworkMonitor; import android.net.INetworkMonitorCallbacks; @@ -359,7 +358,6 @@ public class ConnectivityServiceTest { private HandlerThread mAlarmManagerThread; private TestNetIdManager mNetIdManager; - @Mock IIpConnectivityMetrics mIpConnectivityMetrics; @Mock IpConnectivityMetrics.Logger mMetricsService; @Mock DefaultNetworkMetrics mDefaultNetworkMetrics; @Mock DeviceIdleInternal mDeviceIdleInternal; @@ -1373,7 +1371,6 @@ public class ConnectivityServiceTest { doReturn(mock(ProxyTracker.class)).when(deps).makeProxyTracker(any(), any()); doReturn(mMetricsService).when(deps).getMetricsLogger(); doReturn(true).when(deps).queryUserAccess(anyInt(), anyInt()); - doReturn(mIpConnectivityMetrics).when(deps).getIpConnectivityMetrics(); doReturn(mBatteryStatsService).when(deps).getBatteryStatsService(); doAnswer(inv -> { mPolicyTracker = new WrappedMultinetworkPolicyTracker( diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java index 3a071667a542..8c5d1d6d05e5 100644 --- a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java +++ b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java @@ -124,6 +124,22 @@ public class IpConnectivityMetricsTest { assertEquals("", output2); } + private void logDefaultNetworkEvent(long timeMs, NetworkAgentInfo nai, + NetworkAgentInfo oldNai) { + final Network network = (nai != null) ? nai.network() : null; + final int score = (nai != null) ? nai.getCurrentScore() : 0; + final boolean validated = (nai != null) ? nai.lastValidated : false; + final LinkProperties lp = (nai != null) ? nai.linkProperties : null; + final NetworkCapabilities nc = (nai != null) ? nai.networkCapabilities : null; + + final Network prevNetwork = (oldNai != null) ? oldNai.network() : null; + final int prevScore = (oldNai != null) ? oldNai.getCurrentScore() : 0; + final LinkProperties prevLp = (oldNai != null) ? oldNai.linkProperties : null; + final NetworkCapabilities prevNc = (oldNai != null) ? oldNai.networkCapabilities : null; + + mService.mDefaultNetworkMetrics.logDefaultNetworkEvent(timeMs, network, score, validated, + lp, nc, prevNetwork, prevScore, prevLp, prevNc); + } @Test public void testDefaultNetworkEvents() throws Exception { final long cell = BitUtils.packBits(new int[]{NetworkCapabilities.TRANSPORT_CELLULAR}); @@ -147,7 +163,7 @@ public class IpConnectivityMetricsTest { for (NetworkAgentInfo[] pair : defaultNetworks) { timeMs += durationMs; durationMs += durationMs; - mService.mDefaultNetworkMetrics.logDefaultNetworkEvent(timeMs, pair[1], pair[0]); + logDefaultNetworkEvent(timeMs, pair[1], pair[0]); } String want = String.join("\n", @@ -331,8 +347,8 @@ public class IpConnectivityMetricsTest { final long wifi = BitUtils.packBits(new int[]{NetworkCapabilities.TRANSPORT_WIFI}); NetworkAgentInfo cellNai = makeNai(100, 50, false, true, cell); NetworkAgentInfo wifiNai = makeNai(101, 60, true, false, wifi); - mService.mDefaultNetworkMetrics.logDefaultNetworkEvent(timeMs + 200, cellNai, null); - mService.mDefaultNetworkMetrics.logDefaultNetworkEvent(timeMs + 300, wifiNai, cellNai); + logDefaultNetworkEvent(timeMs + 200L, cellNai, null); + logDefaultNetworkEvent(timeMs + 300L, wifiNai, cellNai); String want = String.join("\n", "dropped_events: 0", |