Add newApi linter check for mDNS library

The mDNS library need to be backported to some internal library which
support minSdk 21. Therefore, updated the build rules to add the linter
check.

Bug: 296175311
Test: TH
Change-Id: Iae0bffa315dc6de2339a05f595b13480fa7385ae
This commit is contained in:
Yuyang Huang
2023-08-21 17:48:48 +09:00
parent a669de72d3
commit fc83170c70
22 changed files with 89 additions and 34 deletions

View File

@@ -19,7 +19,9 @@ package android.net.nsd;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.annotation.SystemApi;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
@@ -38,6 +40,7 @@ import java.util.Objects;
* @hide
*/
@SystemApi
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public final class OffloadServiceInfo implements Parcelable {
@NonNull
private final Key mKey;

View File

@@ -91,6 +91,10 @@ java_library {
java_library {
name: "service-connectivity-mdns-standalone-build-test",
sdk_version: "core_platform",
min_sdk_version: "21",
lint: {
error_checks: ["NewApi"],
},
srcs: [
"src/com/android/server/connectivity/mdns/**/*.java",
":framework-connectivity-t-mdns-standalone-build-sources",

View File

@@ -35,6 +35,7 @@ import static com.android.server.connectivity.mdns.util.MdnsUtils.Clock;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
@@ -59,6 +60,7 @@ import android.net.nsd.OffloadEngine;
import android.net.nsd.OffloadServiceInfo;
import android.net.wifi.WifiManager;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
@@ -120,6 +122,7 @@ import java.util.regex.Pattern;
*
* @hide
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class NsdService extends INsdManager.Stub {
private static final String TAG = "NsdService";
private static final String MDNS_TAG = "mDnsConnector";

View File

@@ -19,6 +19,7 @@ package com.android.server.connectivity.mdns;
import static com.android.server.connectivity.mdns.MdnsServiceTypeClient.INVALID_TRANSACTION_ID;
import android.annotation.NonNull;
import android.os.Build;
import android.text.TextUtils;
import android.util.Pair;
@@ -220,7 +221,9 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
throws IOException {
DatagramPacket packet = packetWriter.getPacket(address);
if (expectUnicastResponse) {
if (requestSender instanceof MdnsMultinetworkSocketClient) {
// MdnsMultinetworkSocketClient is only available on T+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
&& requestSender instanceof MdnsMultinetworkSocketClient) {
((MdnsMultinetworkSocketClient) requestSender).sendPacketRequestingUnicastResponse(
packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);
} else {
@@ -228,7 +231,8 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
packet, onlyUseIpv6OnIpv6OnlyNetworks);
}
} else {
if (requestSender instanceof MdnsMultinetworkSocketClient) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
&& requestSender instanceof MdnsMultinetworkSocketClient) {
((MdnsMultinetworkSocketClient) requestSender)
.sendPacketRequestingMulticastResponse(
packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);

View File

@@ -17,7 +17,8 @@
package com.android.server.connectivity.mdns;
import android.annotation.NonNull;
import android.util.ArraySet;
import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.util.Set;
import java.util.concurrent.ScheduledExecutorService;
@@ -30,7 +31,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor;
public class ExecutorProvider {
private final Set<ScheduledExecutorService> serviceTypeClientSchedulerExecutors =
new ArraySet<>();
MdnsUtils.newSet();
/** Returns a new {@link ScheduledExecutorService} instance. */
public ScheduledExecutorService newServiceTypeClientSchedulerExecutor() {

View File

@@ -21,12 +21,14 @@ import static com.android.server.connectivity.mdns.MdnsRecord.MAX_LABEL_LENGTH;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.net.LinkAddress;
import android.net.Network;
import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo;
import android.net.nsd.OffloadEngine;
import android.net.nsd.OffloadServiceInfo;
import android.os.Build;
import android.os.Looper;
import android.util.ArrayMap;
import android.util.Log;
@@ -50,6 +52,7 @@ import java.util.function.Consumer;
*
* All methods except the constructor must be called on the looper thread.
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsAdvertiser {
private static final String TAG = MdnsAdvertiser.class.getSimpleName();
static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);

View File

@@ -18,6 +18,8 @@ package com.android.server.connectivity.mdns;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.os.Build;
import android.os.Looper;
import com.android.internal.annotations.VisibleForTesting;
@@ -31,6 +33,7 @@ import java.util.List;
*
* This allows maintaining other hosts' caches up-to-date. See RFC6762 8.3.
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsAnnouncer extends MdnsPacketRepeater<MdnsAnnouncer.BaseAnnouncementInfo> {
private static final long ANNOUNCEMENT_INITIAL_DELAY_MS = 1000L;
@VisibleForTesting

View File

@@ -35,6 +35,7 @@ import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* This class keeps tracking the set of registered {@link MdnsServiceBrowserListener} instances, and
@@ -102,8 +103,12 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
}
public void remove(@NonNull MdnsServiceTypeClient client) {
final int index = clients.indexOfValue(client);
clients.removeAt(index);
for (int i = 0; i < clients.size(); ++i) {
if (Objects.equals(client, clients.valueAt(i))) {
clients.removeAt(i);
break;
}
}
}
public boolean isEmpty() {

View File

@@ -20,8 +20,10 @@ import static com.android.server.connectivity.mdns.MdnsConstants.NO_PACKET;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.net.LinkAddress;
import android.net.nsd.NsdServiceInfo;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
@@ -39,6 +41,7 @@ import java.util.List;
/**
* A class that handles advertising services on a {@link MdnsInterfaceSocket} tied to an interface.
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHandler {
private static final boolean DBG = MdnsAdvertiser.DBG;
@VisibleForTesting

View File

@@ -20,8 +20,10 @@ import static com.android.server.connectivity.mdns.MdnsSocket.MULTICAST_IPV4_ADD
import static com.android.server.connectivity.mdns.MdnsSocket.MULTICAST_IPV6_ADDRESS;
import android.annotation.NonNull;
import android.annotation.RequiresApi;
import android.net.LinkAddress;
import android.net.util.SocketUtils;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.ParcelFileDescriptor;
@@ -49,6 +51,7 @@ import java.util.List;
* @see MulticastSocket for javadoc of each public method.
* @see MulticastSocket for javadoc of each public method.
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsInterfaceSocket {
private static final String TAG = MdnsInterfaceSocket.class.getSimpleName();
@NonNull private final MulticastSocket mMulticastSocket;

View File

@@ -20,8 +20,10 @@ import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningO
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.net.LinkAddress;
import android.net.Network;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.util.ArrayMap;
@@ -40,6 +42,7 @@ import java.util.List;
*
* * <p>This class is not thread safe.
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase {
private static final String TAG = MdnsMultinetworkSocketClient.class.getSimpleName();
private static final boolean DBG = MdnsDiscoveryManager.DBG;

View File

@@ -18,7 +18,6 @@ package com.android.server.connectivity.mdns;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.Log;
import java.io.EOFException;
import java.io.IOException;
@@ -206,9 +205,6 @@ public class MdnsPacket {
default: {
try {
if (MdnsAdvertiser.DBG) {
Log.i(TAG, "Skipping parsing of record of unhandled type " + type);
}
skipMdnsRecord(reader, isQuestion);
return null;
} catch (IOException e) {

View File

@@ -21,6 +21,8 @@ import static com.android.server.connectivity.mdns.MdnsRecordRepository.IPV6_ADD
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -34,6 +36,7 @@ import java.net.InetSocketAddress;
* A class used to send several packets at given time intervals.
* @param <T> The type of the request providing packet repeating parameters.
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public abstract class MdnsPacketRepeater<T extends MdnsPacketRepeater.Request> {
private static final boolean DBG = MdnsAdvertiser.DBG;
private static final InetSocketAddress[] ALL_ADDRS = new InetSocketAddress[] {

View File

@@ -17,6 +17,8 @@
package com.android.server.connectivity.mdns;
import android.annotation.NonNull;
import android.annotation.RequiresApi;
import android.os.Build;
import android.os.Looper;
import com.android.internal.annotations.VisibleForTesting;
@@ -33,6 +35,7 @@ import java.util.List;
*
* TODO: implement receiving replies and handling conflicts.
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsProber extends MdnsPacketRepeater<MdnsProber.ProbingInfo> {
private static final long CONFLICT_RETRY_DELAY_MS = 5_000L;

View File

@@ -19,6 +19,8 @@ package com.android.server.connectivity.mdns;
import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
import android.annotation.NonNull;
import android.annotation.RequiresApi;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -41,6 +43,7 @@ import java.util.Collections;
*
* TODO: implement sending after a delay, combining queued replies and duplicate answer suppression
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsReplySender {
private static final boolean DBG = MdnsAdvertiser.DBG;
private static final int MSG_SEND = 1;

View File

@@ -20,7 +20,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.Network;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Pair;
import com.android.server.connectivity.mdns.util.MdnsUtils;
@@ -29,6 +28,7 @@ import java.io.EOFException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
/** A class that decodes mDNS responses from UDP packets. */
public class MdnsResponseDecoder {
@@ -125,7 +125,7 @@ public class MdnsResponseDecoder {
* 2) A copy of the original responses with some of them have records
* update or only contains receive time updated.
*/
public Pair<ArraySet<MdnsResponse>, ArrayList<MdnsResponse>> augmentResponses(
public Pair<Set<MdnsResponse>, ArrayList<MdnsResponse>> augmentResponses(
@NonNull MdnsPacket mdnsPacket,
@NonNull Collection<MdnsResponse> existingResponses, int interfaceIndex,
@Nullable Network network) {
@@ -136,7 +136,7 @@ public class MdnsResponseDecoder {
records.addAll(mdnsPacket.authorityRecords);
records.addAll(mdnsPacket.additionalRecords);
final ArraySet<MdnsResponse> modified = new ArraySet<>();
final Set<MdnsResponse> modified = MdnsUtils.newSet();
final ArrayList<MdnsResponse> responses = new ArrayList<>(existingResponses.size());
final ArrayMap<MdnsResponse, MdnsResponse> augmentedToOriginal = new ArrayMap<>();
for (MdnsResponse existing : existingResponses) {

View File

@@ -22,7 +22,8 @@ import android.net.Network;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.ArraySet;
import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.util.ArrayList;
import java.util.Collection;
@@ -46,11 +47,11 @@ public class MdnsSearchOptions implements Parcelable {
public MdnsSearchOptions createFromParcel(Parcel source) {
return new MdnsSearchOptions(
source.createStringArrayList(),
source.readBoolean(),
source.readBoolean(),
source.readInt() == 1,
source.readInt() == 1,
source.readParcelable(null),
source.readString(),
source.readBoolean(),
source.readInt() == 1,
source.readInt());
}
@@ -165,11 +166,11 @@ public class MdnsSearchOptions implements Parcelable {
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeStringList(subtypes);
out.writeBoolean(isPassiveMode);
out.writeBoolean(removeExpiredService);
out.writeInt(isPassiveMode ? 1 : 0);
out.writeInt(removeExpiredService ? 1 : 0);
out.writeParcelable(mNetwork, 0);
out.writeString(resolveInstanceName);
out.writeBoolean(onlyUseIpv6OnIpv6OnlyNetworks);
out.writeInt(onlyUseIpv6OnIpv6OnlyNetworks ? 1 : 0);
out.writeInt(numOfQueriesBeforeBackoff);
}
@@ -184,7 +185,7 @@ public class MdnsSearchOptions implements Parcelable {
private String resolveInstanceName;
private Builder() {
subtypes = new ArraySet<>();
subtypes = MdnsUtils.newSet();
}
/**

View File

@@ -27,7 +27,6 @@ import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
@@ -42,6 +41,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ScheduledExecutorService;
/**
@@ -414,11 +414,11 @@ public class MdnsServiceTypeClient {
currentList.add(additionalResponse);
}
}
final Pair<ArraySet<MdnsResponse>, ArrayList<MdnsResponse>> augmentedResult =
final Pair<Set<MdnsResponse>, ArrayList<MdnsResponse>> augmentedResult =
responseDecoder.augmentResponses(packet, currentList,
socketKey.getInterfaceIndex(), socketKey.getNetwork());
final ArraySet<MdnsResponse> modifiedResponse = augmentedResult.first;
final Set<MdnsResponse> modifiedResponse = augmentedResult.first;
final ArrayList<MdnsResponse> allResponses = augmentedResult.second;
for (MdnsResponse response : allResponses) {

View File

@@ -19,12 +19,12 @@ package com.android.server.connectivity.mdns;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
import static com.android.server.connectivity.mdns.util.MdnsUtils.isNetworkMatched;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -41,6 +41,7 @@ import android.net.TetheringManager.TetheringEventCallback;
import android.net.wifi.p2p.WifiP2pGroup;
import android.net.wifi.p2p.WifiP2pInfo;
import android.net.wifi.p2p.WifiP2pManager;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.util.ArrayMap;
@@ -67,6 +68,7 @@ import java.util.Objects;
* to their default value (0, false or null).
*
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsSocketProvider {
private static final String TAG = MdnsSocketProvider.class.getSimpleName();
private static final boolean DBG = MdnsDiscoveryManager.DBG;

View File

@@ -22,9 +22,9 @@ import android.annotation.NonNull;
import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.system.Os;
import android.util.ArraySet;
import com.android.net.module.util.FdEventsReader;
import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.FileDescriptor;
import java.net.InetSocketAddress;
@@ -39,7 +39,7 @@ public class MulticastPacketReader extends FdEventsReader<MulticastPacketReader.
@NonNull
private final Handler mHandler;
@NonNull
private final Set<PacketHandler> mPacketHandlers = new ArraySet<>();
private final Set<PacketHandler> mPacketHandlers = MdnsUtils.newSet();
interface PacketHandler {
void handlePacket(byte[] recvbuf, int length, InetSocketAddress src);

View File

@@ -19,6 +19,7 @@ package com.android.server.connectivity.mdns.util;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.Network;
import android.os.Build;
import android.os.Handler;
import android.os.SystemClock;
import android.util.ArraySet;
@@ -34,6 +35,8 @@ import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.Set;
/**
* Mdns utility functions.
@@ -57,6 +60,17 @@ public class MdnsUtils {
return new String(outChars);
}
/**
* Create a ArraySet or HashSet based on the sdk version.
*/
public static <Type> Set<Type> newSet() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return new ArraySet<>();
} else {
return new HashSet<>();
}
}
/**
* Convert the array of labels to DNS case-insensitive lowercase.
*/
@@ -142,7 +156,7 @@ public class MdnsUtils {
/*** Check whether the target network matches any of the current networks */
public static boolean isAnyNetworkMatched(@Nullable Network targetNetwork,
ArraySet<Network> currentNetworks) {
Set<Network> currentNetworks) {
if (targetNetwork == null) {
return !currentNetworks.isEmpty();
}

View File

@@ -17,10 +17,8 @@
package com.android.server.connectivity.mdns;
import static android.net.InetAddresses.parseNumericAddress;
import static com.android.server.connectivity.mdns.util.MdnsUtils.Clock;
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -343,9 +341,9 @@ public class MdnsResponseDecoderTests {
assertNotNull(parsedPacket);
final Network network = mock(Network.class);
responses = decoder.augmentResponses(parsedPacket,
responses = new ArraySet<>(decoder.augmentResponses(parsedPacket,
/* existingResponses= */ Collections.emptyList(),
/* interfaceIndex= */ 10, network /* expireOnExit= */).first;
/* interfaceIndex= */ 10, network /* expireOnExit= */).first);
assertEquals(responses.size(), 1);
assertEquals(responses.valueAt(0).getInterfaceIndex(), 10);
@@ -641,8 +639,8 @@ public class MdnsResponseDecoderTests {
final MdnsPacket parsedPacket = MdnsResponseDecoder.parseResponse(data, data.length);
assertNotNull(parsedPacket);
return decoder.augmentResponses(parsedPacket,
return new ArraySet<>(decoder.augmentResponses(parsedPacket,
existingResponses,
MdnsSocket.INTERFACE_INDEX_UNSPECIFIED, mock(Network.class)).first;
MdnsSocket.INTERFACE_INDEX_UNSPECIFIED, mock(Network.class)).first);
}
}