Merge "Add Cronet to the Tethering apex."

This commit is contained in:
Patrick Rohr
2023-01-17 21:02:09 +00:00
committed by Gerrit Code Review
8 changed files with 443 additions and 6 deletions

View File

@@ -59,11 +59,31 @@ cronet_in_tethering_apex_defaults = "CronetInTetheringApexDefaultsEnabled"
// as cronet_apex_defaults may have different values
// depending on the branch
apex_defaults {
name: "CronetInTetheringApexDefaults",
defaults: [cronet_in_tethering_apex_defaults],
}
apex_defaults {
name: "CronetInTetheringApexDefaultsEnabled",
jni_libs: ["cronet_aml_components_cronet_android_cronet"],
arch: {
riscv64: {
// TODO: remove this when there is a riscv64 libcronet
exclude_jni_libs: ["cronet_aml_components_cronet_android_cronet"],
},
},
}
apex_defaults {
name: "CronetInTetheringApexDefaultsDisabled",
}
apex {
name: "com.android.tethering",
defaults: [
"ConnectivityApexDefaults",
"CronetApexDefaults",
"CronetInTetheringApexDefaults",
"r-launched-apex-module",
],
compile_multilib: "both",
@@ -192,6 +212,7 @@ bootclasspath_fragment {
"android.app.usage",
"android.nearby",
"android.net",
"android.net.http",
"android.net.netstats",
"android.net.util",
],
@@ -206,6 +227,8 @@ bootclasspath_fragment {
"android.nearby.aidl",
"android.net.apf",
"android.net.connectivity",
"android.net.http.apihelpers",
"android.net.http.internal",
"android.net.netstats.provider",
"android.net.nsd",
"android.net.wear",

View File

@@ -17,8 +17,6 @@ package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
// TODO: This is currently not used, but is being merged early, so Cronet can be disabled in
// tm-mainline-prod.
// Both cronet_java_defaults and cronet_java_prejarjar_defaults can be used to
// specify a java_defaults target that either enables or disables Cronet. This
// is used to disable Cronet on tm-mainline-prod.
@@ -39,7 +37,10 @@ cronet_java_defaults_enabled_srcs = [":cronet_aml_api_sources"]
java_sdk_library {
name: "framework-tethering",
defaults: ["framework-tethering-defaults"],
defaults: [
"CronetJavaDefaults",
"framework-tethering-defaults",
],
impl_library_visibility: [
"//packages/modules/Connectivity/Tethering:__subpackages__",
"//packages/modules/Connectivity/framework",
@@ -72,12 +73,61 @@ java_sdk_library {
hostdex: true, // for hiddenapi check
permitted_packages: ["android.net"],
lint: { strict_updatability_linting: true },
}
java_defaults {
name: "CronetJavaDefaults",
defaults: [cronet_java_defaults],
}
java_defaults {
name: "CronetJavaDefaultsEnabled",
srcs: cronet_java_defaults_enabled_srcs,
libs: [
"androidx.annotation_annotation",
],
impl_only_static_libs: [
"cronet_aml_java",
],
// STOPSHIP(b/265674359): fix all Cronet lint warnings and re-enable lint
// directly in framework-tethering
lint: {
enabled: false,
},
api_lint: {
enabled: false,
},
api_dir: "cronet_enabled/api",
}
java_defaults {
name: "CronetJavaDefaultsDisabled",
lint: { strict_updatability_linting: true },
}
java_defaults {
name: "CronetJavaPrejarjarDefaults",
defaults: [cronet_java_prejarjar_defaults],
}
java_defaults {
name: "CronetJavaPrejarjarDefaultsDisabled",
}
java_defaults {
name: "CronetJavaPrejarjarDefaultsEnabled",
static_libs: [
"cronet_aml_api_java",
"cronet_aml_java"
],
}
java_library {
name: "framework-tethering-pre-jarjar",
defaults: ["framework-tethering-defaults"],
defaults: [
"framework-tethering-defaults",
"CronetJavaPrejarjarDefaults",
],
}
java_genrule {

View File

@@ -0,0 +1,194 @@
// Signature format: 2.0
package android.net.http {
public abstract class CallbackException extends android.net.http.HttpException {
ctor protected CallbackException(String, Throwable);
}
public class ConnectionMigrationOptions {
method @Nullable public Boolean getEnableDefaultNetworkMigration();
method @Nullable public Boolean getEnablePathDegradationMigration();
}
public static class ConnectionMigrationOptions.Builder {
ctor public ConnectionMigrationOptions.Builder();
method public android.net.http.ConnectionMigrationOptions build();
method public android.net.http.ConnectionMigrationOptions.Builder setEnableDefaultNetworkMigration(boolean);
method public android.net.http.ConnectionMigrationOptions.Builder setEnablePathDegradationMigration(boolean);
}
public final class DnsOptions {
method @Nullable public Boolean getPersistHostCache();
method @Nullable public java.time.Duration getPersistHostCachePeriod();
}
public static final class DnsOptions.Builder {
ctor public DnsOptions.Builder();
method public android.net.http.DnsOptions build();
method public android.net.http.DnsOptions.Builder setPersistHostCache(boolean);
method public android.net.http.DnsOptions.Builder setPersistHostCachePeriod(java.time.Duration);
}
public abstract class HttpEngine {
method public abstract java.net.URLStreamHandlerFactory createURLStreamHandlerFactory();
method public abstract String getVersionString();
method public abstract android.net.http.UrlRequest.Builder newUrlRequestBuilder(String, android.net.http.UrlRequest.Callback, java.util.concurrent.Executor);
method public abstract java.net.URLConnection openConnection(java.net.URL) throws java.io.IOException;
method public abstract void shutdown();
}
public static class HttpEngine.Builder {
ctor public HttpEngine.Builder(android.content.Context);
method public android.net.http.HttpEngine.Builder addPublicKeyPins(String, java.util.Set<byte[]>, boolean, java.time.Instant);
method public android.net.http.HttpEngine.Builder addQuicHint(String, int, int);
method public android.net.http.HttpEngine build();
method public String getDefaultUserAgent();
method public android.net.http.HttpEngine.Builder setConnectionMigrationOptions(android.net.http.ConnectionMigrationOptions);
method public android.net.http.HttpEngine.Builder setDnsOptions(android.net.http.DnsOptions);
method public android.net.http.HttpEngine.Builder setEnableBrotli(boolean);
method public android.net.http.HttpEngine.Builder setEnableHttp2(boolean);
method public android.net.http.HttpEngine.Builder setEnableHttpCache(int, long);
method public android.net.http.HttpEngine.Builder setEnablePublicKeyPinningBypassForLocalTrustAnchors(boolean);
method public android.net.http.HttpEngine.Builder setEnableQuic(boolean);
method public android.net.http.HttpEngine.Builder setQuicOptions(android.net.http.QuicOptions);
method public android.net.http.HttpEngine.Builder setStoragePath(String);
method public android.net.http.HttpEngine.Builder setUserAgent(String);
field public static final int HTTP_CACHE_DISABLED = 0; // 0x0
field public static final int HTTP_CACHE_DISK = 3; // 0x3
field public static final int HTTP_CACHE_DISK_NO_HTTP = 2; // 0x2
field public static final int HTTP_CACHE_IN_MEMORY = 1; // 0x1
}
public class HttpException extends java.io.IOException {
ctor public HttpException(String, Throwable);
}
public final class InlineExecutionProhibitedException extends java.util.concurrent.RejectedExecutionException {
ctor public InlineExecutionProhibitedException();
}
public abstract class NetworkException extends android.net.http.HttpException {
ctor public NetworkException(String, Throwable);
method public abstract int getErrorCode();
method public abstract boolean isImmediatelyRetryable();
field public static final int ERROR_ADDRESS_UNREACHABLE = 9; // 0x9
field public static final int ERROR_CONNECTION_CLOSED = 5; // 0x5
field public static final int ERROR_CONNECTION_REFUSED = 7; // 0x7
field public static final int ERROR_CONNECTION_RESET = 8; // 0x8
field public static final int ERROR_CONNECTION_TIMED_OUT = 6; // 0x6
field public static final int ERROR_HOSTNAME_NOT_RESOLVED = 1; // 0x1
field public static final int ERROR_INTERNET_DISCONNECTED = 2; // 0x2
field public static final int ERROR_NETWORK_CHANGED = 3; // 0x3
field public static final int ERROR_OTHER = 11; // 0xb
field public static final int ERROR_QUIC_PROTOCOL_FAILED = 10; // 0xa
field public static final int ERROR_TIMED_OUT = 4; // 0x4
}
public abstract class QuicException extends android.net.http.NetworkException {
ctor protected QuicException(String, Throwable);
}
public class QuicOptions {
method @Nullable public String getHandshakeUserAgent();
method @Nullable public Integer getInMemoryServerConfigsCacheSize();
method public java.util.Set<java.lang.String> getQuicHostAllowlist();
}
public static class QuicOptions.Builder {
ctor public QuicOptions.Builder();
method public android.net.http.QuicOptions.Builder addAllowedQuicHost(String);
method public android.net.http.QuicOptions build();
method public android.net.http.QuicOptions.Builder setHandshakeUserAgent(String);
method public android.net.http.QuicOptions.Builder setInMemoryServerConfigsCacheSize(int);
}
public abstract class UploadDataProvider implements java.io.Closeable {
ctor public UploadDataProvider();
method public void close() throws java.io.IOException;
method public abstract long getLength() throws java.io.IOException;
method public abstract void read(android.net.http.UploadDataSink, java.nio.ByteBuffer) throws java.io.IOException;
method public abstract void rewind(android.net.http.UploadDataSink) throws java.io.IOException;
}
public abstract class UploadDataSink {
ctor public UploadDataSink();
method public abstract void onReadError(Exception);
method public abstract void onReadSucceeded(boolean);
method public abstract void onRewindError(Exception);
method public abstract void onRewindSucceeded();
}
public abstract class UrlRequest {
method public abstract void cancel();
method public abstract void followRedirect();
method public abstract void getStatus(android.net.http.UrlRequest.StatusListener);
method public abstract boolean isDone();
method public abstract void read(java.nio.ByteBuffer);
method public abstract void start();
}
public abstract static class UrlRequest.Builder {
method public abstract android.net.http.UrlRequest.Builder addHeader(String, String);
method public abstract android.net.http.UrlRequest.Builder allowDirectExecutor();
method public abstract android.net.http.UrlRequest build();
method public abstract android.net.http.UrlRequest.Builder disableCache();
method public abstract android.net.http.UrlRequest.Builder setHttpMethod(String);
method public abstract android.net.http.UrlRequest.Builder setPriority(int);
method public abstract android.net.http.UrlRequest.Builder setUploadDataProvider(android.net.http.UploadDataProvider, java.util.concurrent.Executor);
field public static final int REQUEST_PRIORITY_HIGHEST = 4; // 0x4
field public static final int REQUEST_PRIORITY_IDLE = 0; // 0x0
field public static final int REQUEST_PRIORITY_LOW = 2; // 0x2
field public static final int REQUEST_PRIORITY_LOWEST = 1; // 0x1
field public static final int REQUEST_PRIORITY_MEDIUM = 3; // 0x3
}
public abstract static class UrlRequest.Callback {
ctor public UrlRequest.Callback();
method public void onCanceled(android.net.http.UrlRequest, android.net.http.UrlResponseInfo);
method public abstract void onFailed(android.net.http.UrlRequest, android.net.http.UrlResponseInfo, android.net.http.HttpException);
method public abstract void onReadCompleted(android.net.http.UrlRequest, android.net.http.UrlResponseInfo, java.nio.ByteBuffer) throws java.lang.Exception;
method public abstract void onRedirectReceived(android.net.http.UrlRequest, android.net.http.UrlResponseInfo, String) throws java.lang.Exception;
method public abstract void onResponseStarted(android.net.http.UrlRequest, android.net.http.UrlResponseInfo) throws java.lang.Exception;
method public abstract void onSucceeded(android.net.http.UrlRequest, android.net.http.UrlResponseInfo);
}
public static class UrlRequest.Status {
field public static final int CONNECTING = 10; // 0xa
field public static final int DOWNLOADING_PAC_FILE = 5; // 0x5
field public static final int ESTABLISHING_PROXY_TUNNEL = 8; // 0x8
field public static final int IDLE = 0; // 0x0
field public static final int INVALID = -1; // 0xffffffff
field public static final int READING_RESPONSE = 14; // 0xe
field public static final int RESOLVING_HOST = 9; // 0x9
field public static final int RESOLVING_HOST_IN_PAC_FILE = 7; // 0x7
field public static final int RESOLVING_PROXY_FOR_URL = 6; // 0x6
field public static final int SENDING_REQUEST = 12; // 0xc
field public static final int SSL_HANDSHAKE = 11; // 0xb
field public static final int WAITING_FOR_AVAILABLE_SOCKET = 2; // 0x2
field public static final int WAITING_FOR_CACHE = 4; // 0x4
field public static final int WAITING_FOR_DELEGATE = 3; // 0x3
field public static final int WAITING_FOR_RESPONSE = 13; // 0xd
field public static final int WAITING_FOR_STALLED_SOCKET_POOL = 1; // 0x1
}
public abstract static class UrlRequest.StatusListener {
ctor public UrlRequest.StatusListener();
method public abstract void onStatus(int);
}
public abstract class UrlResponseInfo {
ctor public UrlResponseInfo();
method public abstract java.util.Map<java.lang.String,java.util.List<java.lang.String>> getAllHeaders();
method public abstract java.util.List<java.util.Map.Entry<java.lang.String,java.lang.String>> getAllHeadersAsList();
method public abstract int getHttpStatusCode();
method public abstract String getHttpStatusText();
method public abstract String getNegotiatedProtocol();
method public abstract String getProxyServer();
method public abstract long getReceivedByteCount();
method public abstract String getUrl();
method public abstract java.util.List<java.lang.String> getUrlChain();
method public abstract boolean wasCached();
}
}

View File

@@ -0,0 +1,50 @@
// Signature format: 2.0
package android.net {
public final class TetheringConstants {
field public static final String EXTRA_ADD_TETHER_TYPE = "extraAddTetherType";
field public static final String EXTRA_PROVISION_CALLBACK = "extraProvisionCallback";
field public static final String EXTRA_REM_TETHER_TYPE = "extraRemTetherType";
field public static final String EXTRA_RUN_PROVISION = "extraRunProvision";
field public static final String EXTRA_SET_ALARM = "extraSetAlarm";
}
public class TetheringManager {
ctor public TetheringManager(@NonNull android.content.Context, @NonNull java.util.function.Supplier<android.os.IBinder>);
method public int getLastTetherError(@NonNull String);
method @NonNull public String[] getTetherableBluetoothRegexs();
method @NonNull public String[] getTetherableIfaces();
method @NonNull public String[] getTetherableUsbRegexs();
method @NonNull public String[] getTetherableWifiRegexs();
method @NonNull public String[] getTetheredIfaces();
method @NonNull public String[] getTetheringErroredIfaces();
method public boolean isTetheringSupported();
method public boolean isTetheringSupported(@NonNull String);
method public void requestLatestTetheringEntitlementResult(int, @NonNull android.os.ResultReceiver, boolean);
method @Deprecated public int setUsbTethering(boolean);
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(int, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback);
method @Deprecated public int tether(@NonNull String);
method @Deprecated public int untether(@NonNull String);
}
public static interface TetheringManager.TetheredInterfaceCallback {
method public void onAvailable(@NonNull String);
method public void onUnavailable();
}
public static interface TetheringManager.TetheredInterfaceRequest {
method public void release();
}
public static interface TetheringManager.TetheringEventCallback {
method @Deprecated public default void onTetherableInterfaceRegexpsChanged(@NonNull android.net.TetheringManager.TetheringInterfaceRegexps);
}
@Deprecated public static class TetheringManager.TetheringInterfaceRegexps {
method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableBluetoothRegexs();
method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableUsbRegexs();
method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableWifiRegexs();
}
}

View File

@@ -0,0 +1 @@
// Signature format: 2.0

View File

@@ -0,0 +1 @@
// Signature format: 2.0

View File

@@ -0,0 +1,117 @@
// Signature format: 2.0
package android.net {
public final class TetheredClient implements android.os.Parcelable {
ctor public TetheredClient(@NonNull android.net.MacAddress, @NonNull java.util.Collection<android.net.TetheredClient.AddressInfo>, int);
method public int describeContents();
method @NonNull public java.util.List<android.net.TetheredClient.AddressInfo> getAddresses();
method @NonNull public android.net.MacAddress getMacAddress();
method public int getTetheringType();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient> CREATOR;
}
public static final class TetheredClient.AddressInfo implements android.os.Parcelable {
method public int describeContents();
method @NonNull public android.net.LinkAddress getAddress();
method @Nullable public String getHostname();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient.AddressInfo> CREATOR;
}
public final class TetheringInterface implements android.os.Parcelable {
ctor public TetheringInterface(int, @NonNull String);
method public int describeContents();
method @NonNull public String getInterface();
method public int getType();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheringInterface> CREATOR;
}
public class TetheringManager {
method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.TetheringEventCallback);
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void requestLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.OnTetheringEntitlementResultListener);
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(@NonNull android.net.TetheringManager.TetheringRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback);
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopAllTethering();
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopTethering(int);
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.ACCESS_NETWORK_STATE}) public void unregisterTetheringEventCallback(@NonNull android.net.TetheringManager.TetheringEventCallback);
field @Deprecated public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED";
field public static final int CONNECTIVITY_SCOPE_GLOBAL = 1; // 0x1
field public static final int CONNECTIVITY_SCOPE_LOCAL = 2; // 0x2
field public static final String EXTRA_ACTIVE_LOCAL_ONLY = "android.net.extra.ACTIVE_LOCAL_ONLY";
field public static final String EXTRA_ACTIVE_TETHER = "tetherArray";
field public static final String EXTRA_AVAILABLE_TETHER = "availableArray";
field public static final String EXTRA_ERRORED_TETHER = "erroredArray";
field public static final int TETHERING_BLUETOOTH = 2; // 0x2
field public static final int TETHERING_ETHERNET = 5; // 0x5
field public static final int TETHERING_INVALID = -1; // 0xffffffff
field public static final int TETHERING_NCM = 4; // 0x4
field public static final int TETHERING_USB = 1; // 0x1
field public static final int TETHERING_WIFI = 0; // 0x0
field public static final int TETHERING_WIFI_P2P = 3; // 0x3
field public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12; // 0xc
field public static final int TETHER_ERROR_DISABLE_FORWARDING_ERROR = 9; // 0x9
field public static final int TETHER_ERROR_ENABLE_FORWARDING_ERROR = 8; // 0x8
field public static final int TETHER_ERROR_ENTITLEMENT_UNKNOWN = 13; // 0xd
field public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; // 0xa
field public static final int TETHER_ERROR_INTERNAL_ERROR = 5; // 0x5
field public static final int TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION = 15; // 0xf
field public static final int TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION = 14; // 0xe
field public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0
field public static final int TETHER_ERROR_PROVISIONING_FAILED = 11; // 0xb
field public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; // 0x2
field public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; // 0x6
field public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; // 0x4
field public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; // 0x1
field public static final int TETHER_ERROR_UNKNOWN_TYPE = 16; // 0x10
field public static final int TETHER_ERROR_UNSUPPORTED = 3; // 0x3
field public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; // 0x7
field public static final int TETHER_HARDWARE_OFFLOAD_FAILED = 2; // 0x2
field public static final int TETHER_HARDWARE_OFFLOAD_STARTED = 1; // 0x1
field public static final int TETHER_HARDWARE_OFFLOAD_STOPPED = 0; // 0x0
}
public static interface TetheringManager.OnTetheringEntitlementResultListener {
method public void onTetheringEntitlementResult(int);
}
public static interface TetheringManager.StartTetheringCallback {
method public default void onTetheringFailed(int);
method public default void onTetheringStarted();
}
public static interface TetheringManager.TetheringEventCallback {
method public default void onClientsChanged(@NonNull java.util.Collection<android.net.TetheredClient>);
method public default void onError(@NonNull String, int);
method public default void onError(@NonNull android.net.TetheringInterface, int);
method public default void onLocalOnlyInterfacesChanged(@NonNull java.util.List<java.lang.String>);
method public default void onLocalOnlyInterfacesChanged(@NonNull java.util.Set<android.net.TetheringInterface>);
method public default void onOffloadStatusChanged(int);
method public default void onTetherableInterfacesChanged(@NonNull java.util.List<java.lang.String>);
method public default void onTetherableInterfacesChanged(@NonNull java.util.Set<android.net.TetheringInterface>);
method public default void onTetheredInterfacesChanged(@NonNull java.util.List<java.lang.String>);
method public default void onTetheredInterfacesChanged(@NonNull java.util.Set<android.net.TetheringInterface>);
method public default void onTetheringSupported(boolean);
method public default void onUpstreamChanged(@Nullable android.net.Network);
}
public static class TetheringManager.TetheringRequest {
method @Nullable public android.net.LinkAddress getClientStaticIpv4Address();
method public int getConnectivityScope();
method @Nullable public android.net.LinkAddress getLocalIpv4Address();
method public boolean getShouldShowEntitlementUi();
method public int getTetheringType();
method public boolean isExemptFromEntitlementCheck();
}
public static class TetheringManager.TetheringRequest.Builder {
ctor public TetheringManager.TetheringRequest.Builder(int);
method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setConnectivityScope(int);
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean);
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean);
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress);
}
}

View File

@@ -0,0 +1 @@
// Signature format: 2.0