// Signature format: 2.0
package android.compat {

  @libcore.api.IntraCoreApi public final class Compatibility {
    method @libcore.api.IntraCoreApi public static boolean isChangeEnabled(long);
    method @libcore.api.IntraCoreApi public static void reportUnconditionalChange(long);
  }

  @libcore.api.IntraCoreApi public static final class Compatibility.ChangeConfig {
    ctor @libcore.api.IntraCoreApi public Compatibility.ChangeConfig(@NonNull java.util.Set<java.lang.Long>, @NonNull java.util.Set<java.lang.Long>);
    method @NonNull @libcore.api.IntraCoreApi public long[] getDisabledChangesArray();
    method @NonNull @libcore.api.IntraCoreApi public java.util.Set<java.lang.Long> getDisabledSet();
    method @NonNull @libcore.api.IntraCoreApi public long[] getEnabledChangesArray();
    method @NonNull @libcore.api.IntraCoreApi public java.util.Set<java.lang.Long> getEnabledSet();
    method @libcore.api.IntraCoreApi public boolean isEmpty();
    method @libcore.api.IntraCoreApi public boolean isForceDisabled(long);
    method @libcore.api.IntraCoreApi public boolean isForceEnabled(long);
  }

}

package android.system {

  public final class Os {
    method @Nullable @libcore.api.IntraCoreApi public static String realpath(@Nullable String) throws android.system.ErrnoException;
  }

}

package dalvik.annotation.compat {

  @libcore.api.IntraCoreApi public class VersionCodes {
    field @libcore.api.IntraCoreApi public static final int CUR_DEVELOPMENT = 10000; // 0x2710
    field @libcore.api.IntraCoreApi public static final int O = 26; // 0x1a
    field @libcore.api.IntraCoreApi public static final int P = 28; // 0x1c
    field @libcore.api.IntraCoreApi public static final int Q = 29; // 0x1d
    field @libcore.api.IntraCoreApi public static final int R = 30; // 0x1e
    field @libcore.api.IntraCoreApi public static final int S = 31; // 0x1f
    field @libcore.api.IntraCoreApi public static final int S_V2 = 32; // 0x20
    field @libcore.api.IntraCoreApi public static final int TIRAMISU = 33; // 0x21
  }

}

package dalvik.annotation.optimization {

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @libcore.api.IntraCoreApi public @interface FastNative {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @libcore.api.IntraCoreApi public @interface ReachabilitySensitive {
  }

}

package dalvik.system {

  @libcore.api.IntraCoreApi public final class BlockGuard {
    method @NonNull @libcore.api.IntraCoreApi public static dalvik.system.BlockGuard.Policy getThreadPolicy();
  }

  @libcore.api.IntraCoreApi public static interface BlockGuard.Policy {
    method @libcore.api.IntraCoreApi public void onNetwork();
  }

  @libcore.api.IntraCoreApi public final class CloseGuard {
    method @libcore.api.IntraCoreApi public void close();
    method @libcore.api.IntraCoreApi public static dalvik.system.CloseGuard get();
    method @libcore.api.IntraCoreApi public void open(String);
    method @libcore.api.IntraCoreApi public void warnIfOpen();
  }

  @libcore.api.IntraCoreApi public final class VMRuntime {
    method @libcore.api.IntraCoreApi public long addressOf(Object);
    method @libcore.api.IntraCoreApi public static dalvik.system.VMRuntime getRuntime();
    method @libcore.api.IntraCoreApi public Object newNonMovableArray(Class<?>, int);
  }

}

package java.net {

  public class Socket implements java.io.Closeable {
    method @libcore.api.IntraCoreApi public java.io.FileDescriptor getFileDescriptor$();
  }

}

package java.nio.charset {

  public abstract class CharsetEncoder {
    ctor @libcore.api.IntraCoreApi protected CharsetEncoder(java.nio.charset.Charset, float, float, byte[], boolean);
  }

}

package java.security.spec {

  public class ECParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    method @libcore.api.IntraCoreApi public String getCurveName();
    method @libcore.api.IntraCoreApi public void setCurveName(String);
  }

}

package libcore.api {

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.ANNOTATION_TYPE}) @libcore.api.IntraCoreApi public @interface CorePlatformApi {
    method @libcore.api.IntraCoreApi public abstract libcore.api.CorePlatformApi.Status status() default libcore.api.CorePlatformApi.Status.LEGACY_ONLY;
  }

  @libcore.api.IntraCoreApi public enum CorePlatformApi.Status {
    enum_constant @libcore.api.IntraCoreApi public static final libcore.api.CorePlatformApi.Status LEGACY_ONLY;
    enum_constant @libcore.api.IntraCoreApi public static final libcore.api.CorePlatformApi.Status STABLE;
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.ANNOTATION_TYPE}) @libcore.api.IntraCoreApi public @interface IntraCoreApi {
  }

}

package libcore.io {

  @libcore.api.IntraCoreApi public final class AsynchronousCloseMonitor {
    method @libcore.api.IntraCoreApi public static void signalBlockedThreads(java.io.FileDescriptor);
  }

}

package libcore.net {

  @libcore.api.IntraCoreApi public abstract class NetworkSecurityPolicy {
    ctor @libcore.api.IntraCoreApi public NetworkSecurityPolicy();
    method @libcore.api.IntraCoreApi public static libcore.net.NetworkSecurityPolicy getInstance();
    method @libcore.api.IntraCoreApi public abstract boolean isCertificateTransparencyVerificationRequired(String);
  }

}

package libcore.util {

  @libcore.api.IntraCoreApi public class NativeAllocationRegistry {
    method @libcore.api.IntraCoreApi public static libcore.util.NativeAllocationRegistry createMalloced(@NonNull ClassLoader, long);
    method @NonNull @libcore.api.IntraCoreApi public Runnable registerNativeAllocation(@NonNull Object, long);
  }

  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE_USE}) @libcore.api.IntraCoreApi public @interface NonNull {
  }

  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE_USE}) @libcore.api.IntraCoreApi public @interface Nullable {
  }

}

package sun.security.util {

  @libcore.api.IntraCoreApi public interface DerEncoder {
    method @libcore.api.IntraCoreApi public void derEncode(java.io.OutputStream) throws java.io.IOException;
  }

}

package sun.security.x509 {

  @libcore.api.IntraCoreApi public class AlgorithmId implements sun.security.util.DerEncoder java.io.Serializable {
    method @libcore.api.IntraCoreApi public void derEncode(java.io.OutputStream) throws java.io.IOException;
    method @libcore.api.IntraCoreApi public static sun.security.x509.AlgorithmId get(String) throws java.security.NoSuchAlgorithmException;
    method @libcore.api.IntraCoreApi public String getName();
  }

}

