From bee2ee14f34ff028236b393523d1174a375d2a08 Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Mon, 20 Feb 2023 20:10:09 +0900 Subject: [PATCH] Move ConnectivityResources to service-connectivity The ConnectivityResources class is only usable with QUERY_ALL_PACKAGES permission, so it is not generally usable in framework-connectivity. It is also backed by the ServiceConnectivityResources APK, which is intended as resources for service-connectivity. Move the class to service-connectivity and update callers. CTS needs a way to determine the supported keepalive count as it used the resources from KeepaliveUtils as @hide API, so provide a ConnectivityManager @hide API for testing. Bug: 279108992 Test: atest Change-Id: I3c9a77c580b5ab87c922c32778bce15dc33b4d1d --- .../src/android/net/ConnectivityManager.java | 20 +++++ .../src/android/net/IConnectivityManager.aidl | 2 + .../src/android/net/apf/ApfCapabilities.java | 14 --- .../src/android/net/util/KeepaliveUtils.java | 59 ++---------- .../ethernet/EthernetNetworkFactory.java | 2 +- .../server/ethernet/EthernetTracker.java | 2 +- .../server/net/NetworkStatsService.java | 2 +- .../android/server/ConnectivityService.java | 13 ++- .../connectivity}/ConnectivityResources.java | 2 +- .../connectivity/KeepaliveResourceUtil.java | 90 +++++++++++++++++++ .../server/connectivity/KeepaliveTracker.java | 3 +- .../server/connectivity/LingerMonitor.java | 1 - .../MultinetworkPolicyTracker.java | 1 - .../NetworkNotificationManager.java | 1 - tests/cts/net/AndroidManifest.xml | 3 - .../net/cts/ConnectivityManagerTest.java | 9 +- .../ConnectivityServiceIntegrationTest.kt | 12 +-- .../android/net/util/KeepaliveUtilsTest.kt | 23 ++--- .../server/ConnectivityServiceTest.java | 2 +- .../AutomaticOnOffKeepaliveTrackerTest.java | 6 +- .../connectivity/LingerMonitorTest.java | 1 - .../MultinetworkPolicyTrackerTest.kt | 3 +- ...ltinetworkPolicyTrackerTestDependencies.kt | 1 - .../NetworkNotificationManagerTest.java | 1 - .../server/net/NetworkStatsServiceTest.java | 2 +- 25 files changed, 163 insertions(+), 112 deletions(-) rename {framework/src/android/net => service/src/com/android/server/connectivity}/ConnectivityResources.java (98%) create mode 100644 service/src/com/android/server/connectivity/KeepaliveResourceUtil.java diff --git a/framework/src/android/net/ConnectivityManager.java b/framework/src/android/net/ConnectivityManager.java index 381a18acfc..23155210be 100644 --- a/framework/src/android/net/ConnectivityManager.java +++ b/framework/src/android/net/ConnectivityManager.java @@ -2534,6 +2534,26 @@ public class ConnectivityManager { return new TcpSocketKeepalive(mService, network, dup, executor, callback); } + /** + * Get the supported keepalive count for each transport configured in resource overlays. + * + * @return An array of supported keepalive count for each transport type. + * @hide + */ + @RequiresPermission(anyOf = { android.Manifest.permission.NETWORK_SETTINGS, + // CTS 13 used QUERY_ALL_PACKAGES to get the resource value, which was implemented + // as below in KeepaliveUtils. Also allow that permission so that KeepaliveUtils can + // use this method and avoid breaking released CTS. Apps that have this permission + // can query the resource themselves anyway. + android.Manifest.permission.QUERY_ALL_PACKAGES }) + public int[] getSupportedKeepalives() { + try { + return mService.getSupportedKeepalives(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Ensure that a network route exists to deliver traffic to the specified * host via the specified network interface. An attempt to add a route that diff --git a/framework/src/android/net/IConnectivityManager.aidl b/framework/src/android/net/IConnectivityManager.aidl index 1372e9a92c..ebe8bca77e 100644 --- a/framework/src/android/net/IConnectivityManager.aidl +++ b/framework/src/android/net/IConnectivityManager.aidl @@ -195,6 +195,8 @@ interface IConnectivityManager void stopKeepalive(in ISocketKeepaliveCallback cb); + int[] getSupportedKeepalives(); + String getCaptivePortalServerUrl(); byte[] getNetworkWatchlistConfigHash(); diff --git a/framework/src/android/net/apf/ApfCapabilities.java b/framework/src/android/net/apf/ApfCapabilities.java index 64f14a1605..fae2499917 100644 --- a/framework/src/android/net/apf/ApfCapabilities.java +++ b/framework/src/android/net/apf/ApfCapabilities.java @@ -19,9 +19,6 @@ package android.net.apf; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.content.Context; -import android.content.res.Resources; -import android.net.ConnectivityResources; import android.os.Parcel; import android.os.Parcelable; @@ -36,8 +33,6 @@ import android.os.Parcelable; */ @SystemApi public final class ApfCapabilities implements Parcelable { - private static ConnectivityResources sResources; - /** * Version of APF instruction set supported for packet filtering. 0 indicates no support for * packet filtering using APF programs. @@ -67,15 +62,6 @@ public final class ApfCapabilities implements Parcelable { apfPacketFormat = in.readInt(); } - @NonNull - private static synchronized ConnectivityResources getResources(@NonNull Context ctx) { - if (sResources == null) { - sResources = new ConnectivityResources(ctx); - } - return sResources; - } - - @Override public int describeContents() { return 0; diff --git a/framework/src/android/net/util/KeepaliveUtils.java b/framework/src/android/net/util/KeepaliveUtils.java index 8d7a0b3d02..07b8c4556b 100644 --- a/framework/src/android/net/util/KeepaliveUtils.java +++ b/framework/src/android/net/util/KeepaliveUtils.java @@ -18,11 +18,8 @@ package android.net.util; import android.annotation.NonNull; import android.content.Context; -import android.content.res.Resources; -import android.net.ConnectivityResources; +import android.net.ConnectivityManager; import android.net.NetworkCapabilities; -import android.text.TextUtils; -import android.util.AndroidRuntimeException; /** * Collection of utilities for socket keepalive offload. @@ -33,64 +30,20 @@ public final class KeepaliveUtils { public static final String TAG = "KeepaliveUtils"; - public static class KeepaliveDeviceConfigurationException extends AndroidRuntimeException { - public KeepaliveDeviceConfigurationException(final String msg) { - super(msg); - } - } - /** * Read supported keepalive count for each transport type from overlay resource. This should be * used to create a local variable store of resource customization, and use it as the input for - * {@link getSupportedKeepalivesForNetworkCapabilities}. + * {@link #getSupportedKeepalivesForNetworkCapabilities}. * * @param context The context to read resource from. * @return An array of supported keepalive count for each transport type. + * @deprecated This is used by CTS 13, but can be removed after switching it to + * {@link ConnectivityManager#getSupportedKeepalives()}. */ @NonNull + @Deprecated public static int[] getSupportedKeepalives(@NonNull Context context) { - String[] res = null; - try { - final ConnectivityResources connRes = new ConnectivityResources(context); - // TODO: use R.id.config_networkSupportedKeepaliveCount directly - final int id = connRes.get().getIdentifier("config_networkSupportedKeepaliveCount", - "array", connRes.getResourcesContext().getPackageName()); - res = new ConnectivityResources(context).get().getStringArray(id); - } catch (Resources.NotFoundException unused) { - } - if (res == null) throw new KeepaliveDeviceConfigurationException("invalid resource"); - - final int[] ret = new int[NetworkCapabilities.MAX_TRANSPORT + 1]; - for (final String row : res) { - if (TextUtils.isEmpty(row)) { - throw new KeepaliveDeviceConfigurationException("Empty string"); - } - final String[] arr = row.split(","); - if (arr.length != 2) { - throw new KeepaliveDeviceConfigurationException("Invalid parameter length"); - } - - int transport; - int supported; - try { - transport = Integer.parseInt(arr[0]); - supported = Integer.parseInt(arr[1]); - } catch (NumberFormatException e) { - throw new KeepaliveDeviceConfigurationException("Invalid number format"); - } - - if (!NetworkCapabilities.isValidTransport(transport)) { - throw new KeepaliveDeviceConfigurationException("Invalid transport " + transport); - } - - if (supported < 0) { - throw new KeepaliveDeviceConfigurationException( - "Invalid supported count " + supported + " for " - + NetworkCapabilities.transportNameOf(transport)); - } - ret[transport] = supported; - } - return ret; + return context.getSystemService(ConnectivityManager.class).getSupportedKeepalives(); } /** diff --git a/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java b/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java index eed9aeb70c..6776920c0f 100644 --- a/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java +++ b/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.net.ConnectivityManager; -import android.net.ConnectivityResources; import android.net.EthernetManager; import android.net.EthernetNetworkSpecifier; import android.net.IpConfiguration; @@ -50,6 +49,7 @@ import com.android.connectivity.resources.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IndentingPrintWriter; import com.android.net.module.util.InterfaceParams; +import com.android.server.connectivity.ConnectivityResources; import java.io.FileDescriptor; import java.util.Objects; diff --git a/service-t/src/com/android/server/ethernet/EthernetTracker.java b/service-t/src/com/android/server/ethernet/EthernetTracker.java index d5207571fb..1f22b020ff 100644 --- a/service-t/src/com/android/server/ethernet/EthernetTracker.java +++ b/service-t/src/com/android/server/ethernet/EthernetTracker.java @@ -25,7 +25,6 @@ import static com.android.internal.annotations.VisibleForTesting.Visibility.PACK import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; -import android.net.ConnectivityResources; import android.net.EthernetManager; import android.net.IEthernetServiceListener; import android.net.INetd; @@ -57,6 +56,7 @@ import com.android.net.module.util.netlink.NetlinkConstants; import com.android.net.module.util.netlink.NetlinkMessage; import com.android.net.module.util.netlink.RtNetlinkLinkMessage; import com.android.net.module.util.netlink.StructIfinfoMsg; +import com.android.server.connectivity.ConnectivityResources; import java.io.FileDescriptor; import java.net.InetAddress; diff --git a/service-t/src/com/android/server/net/NetworkStatsService.java b/service-t/src/com/android/server/net/NetworkStatsService.java index c660792f88..f977a2724c 100644 --- a/service-t/src/com/android/server/net/NetworkStatsService.java +++ b/service-t/src/com/android/server/net/NetworkStatsService.java @@ -83,7 +83,6 @@ import android.content.pm.PackageManager; import android.content.res.Resources; import android.database.ContentObserver; import android.net.ConnectivityManager; -import android.net.ConnectivityResources; import android.net.DataUsageRequest; import android.net.INetd; import android.net.INetworkStatsService; @@ -175,6 +174,7 @@ import com.android.networkstack.apishim.BroadcastOptionsShimImpl; import com.android.networkstack.apishim.ConstantsShim; import com.android.networkstack.apishim.common.UnsupportedApiLevelException; import com.android.server.BpfNetMaps; +import com.android.server.connectivity.ConnectivityResources; import java.io.File; import java.io.FileDescriptor; diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index ac1fd55488..c080c5951d 100755 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -134,7 +134,6 @@ import android.net.ConnectivityManager; import android.net.ConnectivityManager.BlockedReason; import android.net.ConnectivityManager.NetworkCallback; import android.net.ConnectivityManager.RestrictBackgroundStatus; -import android.net.ConnectivityResources; import android.net.ConnectivitySettingsManager; import android.net.DataStallReportParcelable; import android.net.DnsResolverServiceManager; @@ -281,11 +280,13 @@ import com.android.server.connectivity.AutomaticOnOffKeepaliveTracker.AutomaticO import com.android.server.connectivity.CarrierPrivilegeAuthenticator; import com.android.server.connectivity.ClatCoordinator; import com.android.server.connectivity.ConnectivityFlags; +import com.android.server.connectivity.ConnectivityResources; import com.android.server.connectivity.DnsManager; import com.android.server.connectivity.DnsManager.PrivateDnsValidationUpdate; import com.android.server.connectivity.DscpPolicyTracker; import com.android.server.connectivity.FullScore; import com.android.server.connectivity.InvalidTagException; +import com.android.server.connectivity.KeepaliveResourceUtil; import com.android.server.connectivity.KeepaliveTracker; import com.android.server.connectivity.LingerMonitor; import com.android.server.connectivity.MockableSystemProperties; @@ -10046,6 +10047,16 @@ public class ConnectivityService extends IConnectivityManager.Stub Objects.requireNonNull(cb).asBinder())); } + @Override + public int[] getSupportedKeepalives() { + enforceAnyPermissionOf(mContext, android.Manifest.permission.NETWORK_SETTINGS, + // Backwards compatibility with CTS 13 + android.Manifest.permission.QUERY_ALL_PACKAGES); + + return BinderUtils.withCleanCallingIdentity(() -> + KeepaliveResourceUtil.getSupportedKeepalives(mContext)); + } + @Override public void factoryReset() { enforceSettingsPermission(); diff --git a/framework/src/android/net/ConnectivityResources.java b/service/src/com/android/server/connectivity/ConnectivityResources.java similarity index 98% rename from framework/src/android/net/ConnectivityResources.java rename to service/src/com/android/server/connectivity/ConnectivityResources.java index 18f0de0cc9..d958ea062e 100644 --- a/framework/src/android/net/ConnectivityResources.java +++ b/service/src/com/android/server/connectivity/ConnectivityResources.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.net; +package com.android.server.connectivity; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; diff --git a/service/src/com/android/server/connectivity/KeepaliveResourceUtil.java b/service/src/com/android/server/connectivity/KeepaliveResourceUtil.java new file mode 100644 index 0000000000..92b080d425 --- /dev/null +++ b/service/src/com/android/server/connectivity/KeepaliveResourceUtil.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2023 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.connectivity; + +import android.annotation.NonNull; +import android.content.Context; +import android.content.res.Resources; +import android.net.NetworkCapabilities; +import android.text.TextUtils; +import android.util.AndroidRuntimeException; + +import com.android.connectivity.resources.R; + +/** + * Utilities to fetch keepalive configuration from resources. + */ +public abstract class KeepaliveResourceUtil { + + /** + * Read supported keepalive count for each transport type from overlay resource. + * + * @param context The context to read resource from. + * @return An array of supported keepalive count for each transport type. + */ + @NonNull + public static int[] getSupportedKeepalives(@NonNull Context context) { + String[] res = null; + try { + final ConnectivityResources connRes = new ConnectivityResources(context); + res = connRes.get().getStringArray(R.array.config_networkSupportedKeepaliveCount); + } catch (Resources.NotFoundException unused) { + } + if (res == null) throw new KeepaliveDeviceConfigurationException("invalid resource"); + + final int[] ret = new int[NetworkCapabilities.MAX_TRANSPORT + 1]; + for (final String row : res) { + if (TextUtils.isEmpty(row)) { + throw new KeepaliveDeviceConfigurationException("Empty string"); + } + final String[] arr = row.split(","); + if (arr.length != 2) { + throw new KeepaliveDeviceConfigurationException("Invalid parameter length"); + } + + int transport; + int supported; + try { + transport = Integer.parseInt(arr[0]); + supported = Integer.parseInt(arr[1]); + } catch (NumberFormatException e) { + throw new KeepaliveDeviceConfigurationException("Invalid number format"); + } + + if (!NetworkCapabilities.isValidTransport(transport)) { + throw new KeepaliveDeviceConfigurationException("Invalid transport " + transport); + } + + if (supported < 0) { + throw new KeepaliveDeviceConfigurationException( + "Invalid supported count " + supported + " for " + + NetworkCapabilities.transportNameOf(transport)); + } + ret[transport] = supported; + } + return ret; + } + + /** + * An exception thrown when the keepalive resource configuration is invalid. + */ + public static class KeepaliveDeviceConfigurationException extends AndroidRuntimeException { + public KeepaliveDeviceConfigurationException(final String msg) { + super(msg); + } + } +} diff --git a/service/src/com/android/server/connectivity/KeepaliveTracker.java b/service/src/com/android/server/connectivity/KeepaliveTracker.java index 60485b34a0..8c170bc85e 100644 --- a/service/src/com/android/server/connectivity/KeepaliveTracker.java +++ b/service/src/com/android/server/connectivity/KeepaliveTracker.java @@ -37,7 +37,6 @@ import static android.net.SocketKeepalive.SUCCESS_PAUSED; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; -import android.net.ConnectivityResources; import android.net.ISocketKeepaliveCallback; import android.net.InetAddresses; import android.net.InvalidPacketException; @@ -111,7 +110,7 @@ public class KeepaliveTracker { mTcpController = new TcpKeepaliveController(handler); mContext = context; - mSupportedKeepalives = KeepaliveUtils.getSupportedKeepalives(mContext); + mSupportedKeepalives = KeepaliveResourceUtil.getSupportedKeepalives(context); final ConnectivityResources res = new ConnectivityResources(mContext); mReservedPrivilegedSlots = res.get().getInteger( diff --git a/service/src/com/android/server/connectivity/LingerMonitor.java b/service/src/com/android/server/connectivity/LingerMonitor.java index df34ce7b32..8503fcc74f 100644 --- a/service/src/com/android/server/connectivity/LingerMonitor.java +++ b/service/src/com/android/server/connectivity/LingerMonitor.java @@ -25,7 +25,6 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.Resources; -import android.net.ConnectivityResources; import android.net.NetworkCapabilities; import android.os.SystemClock; import android.os.UserHandle; diff --git a/service/src/com/android/server/connectivity/MultinetworkPolicyTracker.java b/service/src/com/android/server/connectivity/MultinetworkPolicyTracker.java index 58196f7fad..93018bb61a 100644 --- a/service/src/com/android/server/connectivity/MultinetworkPolicyTracker.java +++ b/service/src/com/android/server/connectivity/MultinetworkPolicyTracker.java @@ -28,7 +28,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; import android.database.ContentObserver; -import android.net.ConnectivityResources; import android.net.Uri; import android.os.Build; import android.os.Handler; diff --git a/service/src/com/android/server/connectivity/NetworkNotificationManager.java b/service/src/com/android/server/connectivity/NetworkNotificationManager.java index cdc0aa9aa3..8b0cb7c65b 100644 --- a/service/src/com/android/server/connectivity/NetworkNotificationManager.java +++ b/service/src/com/android/server/connectivity/NetworkNotificationManager.java @@ -30,7 +30,6 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.drawable.Icon; -import android.net.ConnectivityResources; import android.net.NetworkSpecifier; import android.net.TelephonyNetworkSpecifier; import android.net.wifi.WifiInfo; diff --git a/tests/cts/net/AndroidManifest.xml b/tests/cts/net/AndroidManifest.xml index 999614c53f..68e36fff5f 100644 --- a/tests/cts/net/AndroidManifest.xml +++ b/tests/cts/net/AndroidManifest.xml @@ -37,9 +37,6 @@ - - -