diff options
-rw-r--r-- | core/java/android/net/ConnectivityManager.java | 12 | ||||
-rw-r--r-- | core/java/android/net/IConnectivityManager.aidl | 2 | ||||
-rw-r--r-- | services/Android.bp | 1 | ||||
-rw-r--r-- | services/core/Android.bp | 48 | ||||
-rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 15 | ||||
-rw-r--r-- | services/core/java/com/android/server/ConnectivityServiceInitializer.java | 66 | ||||
-rw-r--r-- | services/java/com/android/server/SystemServer.java | 33 | ||||
-rw-r--r-- | tests/net/Android.bp | 1 | ||||
-rw-r--r-- | tests/net/integration/Android.bp | 2 | ||||
-rw-r--r-- | tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt | 2 | ||||
-rw-r--r-- | tests/net/java/com/android/server/ConnectivityServiceTest.java | 2 |
11 files changed, 166 insertions, 18 deletions
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index dcf3b5cae705..f13c5867fe6e 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -899,6 +899,18 @@ public class ConnectivityManager { } /** + * @hide + * TODO: Expose for SystemServer when becomes a module. + */ + public void systemReady() { + try { + mService.systemReady(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Checks if a given type uses the cellular data connection. * This should be replaced in the future by a network property. * @param networkType the type to check diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index d7f178cd0a9b..059ec28298f9 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -233,4 +233,6 @@ interface IConnectivityManager void simulateDataStall(int detectionMethod, long timestampMillis, in Network network, in PersistableBundle extras); + + void systemReady(); } diff --git a/services/Android.bp b/services/Android.bp index ef52c2aff002..f40f7cfa7321 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -83,6 +83,7 @@ java_library { "services.voiceinteraction", "services.wifi", "service-blobstore", + "service-connectivity", "service-jobscheduler", "android.hidl.base-V1.0-java", ], diff --git a/services/core/Android.bp b/services/core/Android.bp index 431555bb57d5..4b9d0f1266f5 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -1,6 +1,7 @@ filegroup { name: "services.core-sources", srcs: ["java/**/*.java"], + exclude_srcs: [":connectivity-service-srcs"], path: "java", visibility: ["//frameworks/base/services"], } @@ -177,3 +178,50 @@ prebuilt_etc { name: "protolog.conf.json.gz", src: ":services.core.json.gz", } + +// TODO: Move connectivity service sources to independent directory. +filegroup { + name: "connectivity-service-srcs", + srcs: [ + "java/com/android/server/ConnectivityService.java", + "java/com/android/server/ConnectivityServiceInitializer.java", + "java/com/android/server/TestNetworkService.java", + "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/MultipathPolicyTracker.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", + "java/com/android/server/connectivity/NetworkRanker.java", + "java/com/android/server/connectivity/PermissionMonitor.java", + "java/com/android/server/connectivity/ProxyTracker.java", + "java/com/android/server/connectivity/TcpKeepaliveController.java", + "java/com/android/server/connectivity/Vpn.java", + "java/com/android/server/connectivity/VpnIkev2Utils.java", + "java/com/android/server/net/LockdownVpnTracker.java", + ], +} + +java_library { + name: "service-connectivity", + srcs: [ + ":connectivity-service-srcs", + ], + installable: true, + libs: [ + "android.net.ipsec.ike", + "services.core", + "services.net", + "unsupportedappusage", + ], +} diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index d07a22ded6dd..35f119428dc7 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2300,10 +2300,21 @@ public class ConnectivityService extends IConnectivityManager.Stub } /** - * Called when the system is ready and ConnectivityService can initialize remaining components. + * Called by SystemServer through ConnectivityManager when the system is ready. */ - @VisibleForTesting + @Override public void systemReady() { + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + throw new SecurityException("Calling Uid is not system uid."); + } + systemReadyInternal(); + } + + /** + * Called when ConnectivityService can initialize remaining components. + */ + @VisibleForTesting + public void systemReadyInternal() { // Let PermissionMonitor#startMonitoring() running in the beginning of the systemReady // before MultipathPolicyTracker.start(). Since mApps in PermissionMonitor needs to be // populated first to ensure that listening network request which is sent by diff --git a/services/core/java/com/android/server/ConnectivityServiceInitializer.java b/services/core/java/com/android/server/ConnectivityServiceInitializer.java new file mode 100644 index 000000000000..2bc8925be019 --- /dev/null +++ b/services/core/java/com/android/server/ConnectivityServiceInitializer.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server; + +import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_HIGH; +import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_NORMAL; + +import android.content.Context; +import android.net.INetworkPolicyManager; +import android.net.INetworkStatsService; +import android.os.INetworkManagementService; +import android.os.ServiceManager; +import android.util.Log; + +/** + * Connectivity service initializer for core networking. This is called by system server to create + * a new instance of ConnectivityService. + */ +public final class ConnectivityServiceInitializer extends SystemService { + private static final String TAG = ConnectivityServiceInitializer.class.getSimpleName(); + private final ConnectivityService mConnectivity; + + public ConnectivityServiceInitializer(Context context) { + super(context); + // TODO: Define formal APIs to get the needed services. + mConnectivity = new ConnectivityService(context, getNetworkManagementService(), + getNetworkStatsService(), getNetworkPolicyManager()); + } + + @Override + public void onStart() { + Log.i(TAG, "Registering " + Context.CONNECTIVITY_SERVICE); + publishBinderService(Context.CONNECTIVITY_SERVICE, mConnectivity, + /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL); + } + + private INetworkManagementService getNetworkManagementService() { + return INetworkManagementService.Stub.asInterface( + ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)); + } + + private INetworkStatsService getNetworkStatsService() { + return INetworkStatsService.Stub.asInterface( + ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); + } + + private INetworkPolicyManager getNetworkPolicyManager() { + return INetworkPolicyManager.Stub.asInterface( + ServiceManager.getService(Context.NETWORK_POLICY_SERVICE)); + } + +} diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 4552bc678802..cc8c75194031 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -47,7 +47,9 @@ import android.database.sqlite.SQLiteCompatibilityWalFlags; import android.database.sqlite.SQLiteGlobal; import android.graphics.GraphicsStatsService; import android.hardware.display.DisplayManagerInternal; +import android.net.ConnectivityManager; import android.net.ConnectivityModuleConnector; +import android.net.IConnectivityManager; import android.net.NetworkStackClient; import android.os.BaseBundle; import android.os.Binder; @@ -103,7 +105,6 @@ import com.android.server.camera.CameraServiceProxy; import com.android.server.clipboard.ClipboardService; import com.android.server.compat.PlatformCompat; import com.android.server.compat.PlatformCompatNative; -import com.android.server.connectivity.IpConnectivityMetrics; import com.android.server.contentcapture.ContentCaptureManagerInternal; import com.android.server.coverage.CoverageService; import com.android.server.devicepolicy.DevicePolicyManagerService; @@ -302,6 +303,10 @@ public final class SystemServer { "com.android.server.blob.BlobStoreManagerService"; private static final String ROLLBACK_MANAGER_SERVICE_CLASS = "com.android.server.rollback.RollbackManagerService"; + private static final String CONNECTIVITY_SERVICE_INITIALIZER_CLASS = + "com.android.server.ConnectivityServiceInitializer"; + private static final String IP_CONNECTIVITY_METRICS_CLASS = + "com.android.server.connectivity.IpConnectivityMetrics"; private static final String TETHERING_CONNECTOR_CLASS = "android.net.ITetheringConnector"; @@ -1015,7 +1020,7 @@ public final class SystemServer { IpSecService ipSecService = null; NetworkStatsService networkStats = null; NetworkPolicyManagerService networkPolicy = null; - ConnectivityService connectivity = null; + IConnectivityManager connectivity = null; NsdService serviceDiscovery = null; WindowManagerService wm = null; SerialService serial = null; @@ -1205,7 +1210,7 @@ public final class SystemServer { } t.traceBegin("IpConnectivityMetrics"); - mSystemServiceManager.startService(IpConnectivityMetrics.class); + mSystemServiceManager.startService(IP_CONNECTIVITY_METRICS_CLASS); t.traceEnd(); t.traceBegin("NetworkWatchlistService"); @@ -1531,16 +1536,15 @@ public final class SystemServer { } t.traceBegin("StartConnectivityService"); - try { - connectivity = new ConnectivityService( - context, networkManagement, networkStats, networkPolicy); - ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity, - /* allowIsolated= */ false, - DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL); - networkPolicy.bindConnectivityManager(connectivity); - } catch (Throwable e) { - reportWtf("starting Connectivity Service", e); - } + // This has to be called after NetworkManagementService, NetworkStatsService + // and NetworkPolicyManager because ConnectivityService needs to take these + // services to initialize. + // TODO: Dynamically load service-connectivity.jar by using startServiceFromJar. + mSystemServiceManager.startService(CONNECTIVITY_SERVICE_INITIALIZER_CLASS); + connectivity = IConnectivityManager.Stub.asInterface( + ServiceManager.getService(Context.CONNECTIVITY_SERVICE)); + // TODO: Use ConnectivityManager instead of ConnectivityService. + networkPolicy.bindConnectivityManager(connectivity); t.traceEnd(); t.traceBegin("StartNsdService"); @@ -2217,7 +2221,6 @@ public final class SystemServer { final NetworkManagementService networkManagementF = networkManagement; final NetworkStatsService networkStatsF = networkStats; final NetworkPolicyManagerService networkPolicyF = networkPolicy; - final ConnectivityService connectivityF = connectivity; final CountryDetectorService countryDetectorF = countryDetector; final NetworkTimeUpdateService networkTimeUpdaterF = networkTimeUpdater; final InputManagerService inputManagerF = inputManager; @@ -2226,6 +2229,8 @@ public final class SystemServer { final MmsServiceBroker mmsServiceF = mmsService; final IpSecService ipSecServiceF = ipSecService; final WindowManagerService windowManagerF = wm; + final ConnectivityManager connectivityF = (ConnectivityManager) + context.getSystemService(Context.CONNECTIVITY_SERVICE); // We now tell the activity manager it is okay to run third party // code. It will call back into us once it has gotten to the state diff --git a/tests/net/Android.bp b/tests/net/Android.bp index 0fe84abcbc7b..cd2dc0403bd6 100644 --- a/tests/net/Android.bp +++ b/tests/net/Android.bp @@ -59,6 +59,7 @@ android_test { "mockito-target-minus-junit4", "net-tests-utils", "platform-test-annotations", + "service-connectivity", "services.core", "services.net", ], diff --git a/tests/net/integration/Android.bp b/tests/net/integration/Android.bp index 874bd4b97df1..69742b9bf7b2 100644 --- a/tests/net/integration/Android.bp +++ b/tests/net/integration/Android.bp @@ -32,6 +32,7 @@ android_test { "kotlin-reflect", "mockito-target-extended-minus-junit4", "net-tests-utils", + "service-connectivity", "services.core", "services.net", "testables", @@ -59,6 +60,7 @@ java_library { "net-tests-utils", ], libs: [ + "service-connectivity", "services.core", "services.net", ], diff --git a/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt b/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt index bc069e148b99..dba1856ea6d0 100644 --- a/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt +++ b/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt @@ -167,7 +167,7 @@ class ConnectivityServiceIntegrationTest { cm = ConnectivityManager(context, service) context.addMockSystemService(Context.CONNECTIVITY_SERVICE, cm) - service.systemReady() + service.systemReadyInternal() } private inner class TestConnectivityService(deps: Dependencies) : ConnectivityService( diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 862e552811f0..998aee43f856 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -1246,7 +1246,7 @@ public class ConnectivityServiceTest { // Create local CM before sending system ready so that we can answer // getSystemService() correctly. mCm = new WrappedConnectivityManager(InstrumentationRegistry.getContext(), mService); - mService.systemReady(); + mService.systemReadyInternal(); mockVpn(Process.myUid()); mCm.bindProcessToNetwork(null); |