diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java
index d0f54b4..341e3dd 100644
--- a/core/java/android/net/NetworkUtils.java
+++ b/core/java/android/net/NetworkUtils.java
@@ -29,7 +29,6 @@
 import android.util.Pair;
 
 import java.io.FileDescriptor;
-import java.math.BigInteger;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
@@ -37,7 +36,6 @@
 import java.net.UnknownHostException;
 import java.util.Collection;
 import java.util.Locale;
-import java.util.TreeSet;
 
 /**
  * Native methods for managing network interfaces.
@@ -392,74 +390,6 @@
         return result;
     }
 
-    /**
-     * Returns a prefix set without overlaps.
-     *
-     * This expects the src set to be sorted from shorter to longer. Results are undefined
-     * failing this condition. The returned prefix set is sorted in the same order as the
-     * passed set, with the same comparator.
-     */
-    private static TreeSet<IpPrefix> deduplicatePrefixSet(final TreeSet<IpPrefix> src) {
-        final TreeSet<IpPrefix> dst = new TreeSet<>(src.comparator());
-        // Prefixes match addresses that share their upper part up to their length, therefore
-        // the only kind of possible overlap in two prefixes is strict inclusion of the longer
-        // (more restrictive) in the shorter (including equivalence if they have the same
-        // length).
-        // Because prefixes in the src set are sorted from shorter to longer, deduplicating
-        // is done by simply iterating in order, and not adding any longer prefix that is
-        // already covered by a shorter one.
-        newPrefixes:
-        for (IpPrefix newPrefix : src) {
-            for (IpPrefix existingPrefix : dst) {
-                if (existingPrefix.containsPrefix(newPrefix)) {
-                    continue newPrefixes;
-                }
-            }
-            dst.add(newPrefix);
-        }
-        return dst;
-    }
-
-    /**
-     * Returns how many IPv4 addresses match any of the prefixes in the passed ordered set.
-     *
-     * Obviously this returns an integral value between 0 and 2**32.
-     * The behavior is undefined if any of the prefixes is not an IPv4 prefix or if the
-     * set is not ordered smallest prefix to longer prefix.
-     *
-     * @param prefixes the set of prefixes, ordered by length
-     */
-    public static long routedIPv4AddressCount(final TreeSet<IpPrefix> prefixes) {
-        long routedIPCount = 0;
-        for (final IpPrefix prefix : deduplicatePrefixSet(prefixes)) {
-            if (!prefix.isIPv4()) {
-                Log.wtf(TAG, "Non-IPv4 prefix in routedIPv4AddressCount");
-            }
-            int rank = 32 - prefix.getPrefixLength();
-            routedIPCount += 1L << rank;
-        }
-        return routedIPCount;
-    }
-
-    /**
-     * Returns how many IPv6 addresses match any of the prefixes in the passed ordered set.
-     *
-     * This returns a BigInteger between 0 and 2**128.
-     * The behavior is undefined if any of the prefixes is not an IPv6 prefix or if the
-     * set is not ordered smallest prefix to longer prefix.
-     */
-    public static BigInteger routedIPv6AddressCount(final TreeSet<IpPrefix> prefixes) {
-        BigInteger routedIPCount = BigInteger.ZERO;
-        for (final IpPrefix prefix : deduplicatePrefixSet(prefixes)) {
-            if (!prefix.isIPv6()) {
-                Log.wtf(TAG, "Non-IPv6 prefix in routedIPv6AddressCount");
-            }
-            int rank = 128 - prefix.getPrefixLength();
-            routedIPCount = routedIPCount.add(BigInteger.ONE.shiftLeft(rank));
-        }
-        return routedIPCount;
-    }
-
     private static final int[] ADDRESS_FAMILIES = new int[] {AF_INET, AF_INET6};
 
     /**
diff --git a/tests/net/java/android/net/NetworkUtilsTest.java b/tests/net/java/android/net/NetworkUtilsTest.java
deleted file mode 100644
index 7748288..0000000
--- a/tests/net/java/android/net/NetworkUtilsTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.net;
-
-import static junit.framework.Assert.assertEquals;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.math.BigInteger;
-import java.util.TreeSet;
-
-@RunWith(AndroidJUnit4.class)
-@androidx.test.filters.SmallTest
-public class NetworkUtilsTest {
-    @Test
-    public void testRoutedIPv4AddressCount() {
-        final TreeSet<IpPrefix> set = new TreeSet<>(IpPrefix.lengthComparator());
-        // No routes routes to no addresses.
-        assertEquals(0, NetworkUtils.routedIPv4AddressCount(set));
-
-        set.add(new IpPrefix("0.0.0.0/0"));
-        assertEquals(1l << 32, NetworkUtils.routedIPv4AddressCount(set));
-
-        set.add(new IpPrefix("20.18.0.0/16"));
-        set.add(new IpPrefix("20.18.0.0/24"));
-        set.add(new IpPrefix("20.18.0.0/8"));
-        // There is a default route, still covers everything
-        assertEquals(1l << 32, NetworkUtils.routedIPv4AddressCount(set));
-
-        set.clear();
-        set.add(new IpPrefix("20.18.0.0/24"));
-        set.add(new IpPrefix("20.18.0.0/8"));
-        // The 8-length includes the 24-length prefix
-        assertEquals(1l << 24, NetworkUtils.routedIPv4AddressCount(set));
-
-        set.add(new IpPrefix("10.10.10.126/25"));
-        // The 8-length does not include this 25-length prefix
-        assertEquals((1l << 24) + (1 << 7), NetworkUtils.routedIPv4AddressCount(set));
-
-        set.clear();
-        set.add(new IpPrefix("1.2.3.4/32"));
-        set.add(new IpPrefix("1.2.3.4/32"));
-        set.add(new IpPrefix("1.2.3.4/32"));
-        set.add(new IpPrefix("1.2.3.4/32"));
-        assertEquals(1l, NetworkUtils.routedIPv4AddressCount(set));
-
-        set.add(new IpPrefix("1.2.3.5/32"));
-        set.add(new IpPrefix("1.2.3.6/32"));
-
-        set.add(new IpPrefix("1.2.3.7/32"));
-        set.add(new IpPrefix("1.2.3.8/32"));
-        set.add(new IpPrefix("1.2.3.9/32"));
-        set.add(new IpPrefix("1.2.3.0/32"));
-        assertEquals(7l, NetworkUtils.routedIPv4AddressCount(set));
-
-        // 1.2.3.4/30 eats 1.2.3.{4-7}/32
-        set.add(new IpPrefix("1.2.3.4/30"));
-        set.add(new IpPrefix("6.2.3.4/28"));
-        set.add(new IpPrefix("120.2.3.4/16"));
-        assertEquals(7l - 4 + 4 + 16 + 65536, NetworkUtils.routedIPv4AddressCount(set));
-    }
-
-    @Test
-    public void testRoutedIPv6AddressCount() {
-        final TreeSet<IpPrefix> set = new TreeSet<>(IpPrefix.lengthComparator());
-        // No routes routes to no addresses.
-        assertEquals(BigInteger.ZERO, NetworkUtils.routedIPv6AddressCount(set));
-
-        set.add(new IpPrefix("::/0"));
-        assertEquals(BigInteger.ONE.shiftLeft(128), NetworkUtils.routedIPv6AddressCount(set));
-
-        set.add(new IpPrefix("1234:622a::18/64"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/96"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/8"));
-        // There is a default route, still covers everything
-        assertEquals(BigInteger.ONE.shiftLeft(128), NetworkUtils.routedIPv6AddressCount(set));
-
-        set.clear();
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/96"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/8"));
-        // The 8-length includes the 96-length prefix
-        assertEquals(BigInteger.ONE.shiftLeft(120), NetworkUtils.routedIPv6AddressCount(set));
-
-        set.add(new IpPrefix("10::26/64"));
-        // The 8-length does not include this 64-length prefix
-        assertEquals(BigInteger.ONE.shiftLeft(120).add(BigInteger.ONE.shiftLeft(64)),
-                NetworkUtils.routedIPv6AddressCount(set));
-
-        set.clear();
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128"));
-        assertEquals(BigInteger.ONE, NetworkUtils.routedIPv6AddressCount(set));
-
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad5/128"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad6/128"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad7/128"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad8/128"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad9/128"));
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad0/128"));
-        assertEquals(BigInteger.valueOf(7), NetworkUtils.routedIPv6AddressCount(set));
-
-        // add4:f00:80:f7:1111::6ad4/126 eats add4:f00:8[:f7:1111::6ad{4-7}/128
-        set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/126"));
-        set.add(new IpPrefix("d00d:f00:80:f7:1111::6ade/124"));
-        set.add(new IpPrefix("f00b:a33::/112"));
-        assertEquals(BigInteger.valueOf(7l - 4 + 4 + 16 + 65536),
-                NetworkUtils.routedIPv6AddressCount(set));
-    }
-}
