[go: nahoru, domu]

minSdk -> RequiresApi for camera-core

 This rolls back the minSdkVersion to the AndroidX default (14) and
 instead enforces SDK requirements with lint and the @RequiresApi(21)
 annotation.

 See aosp/1838237 for more information.

Bug: 198449102
Test: ./gradlew camera:camera-core:lint
Change-Id: I7253586fdd090d57f62f0263f5efa038c686fc9f
diff --git a/camera/camera-core/build.gradle b/camera/camera-core/build.gradle
index 87b0277..26487d1 100644
--- a/camera/camera-core/build.gradle
+++ b/camera/camera-core/build.gradle
@@ -51,6 +51,7 @@
     })
     testImplementation("androidx.exifinterface:exifinterface:1.3.2")
 
+    androidTestImplementation(libs.multidex)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
@@ -78,7 +79,7 @@
 
 android {
     defaultConfig {
-        minSdkVersion 21
+        multiDexEnabled = true
         externalNativeBuild {
             def versionScript = file("src/main/cpp/jni.lds").getAbsolutePath()
             cmake {
diff --git a/camera/camera-core/lint.xml b/camera/camera-core/lint.xml
new file mode 100644
index 0000000..0843ecf
--- /dev/null
+++ b/camera/camera-core/lint.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+    <!-- Disable NewApi lint check temporarily for unit tests.
+    This file can be removed once b/200599470 is resolved. -->
+    <issue id="NewApi">
+        <ignore path="src/test/**" />
+    </issue>
+</lint>
\ No newline at end of file
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageProxyTest.java
index 0013339..7cee794c 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageProxyTest.java
@@ -28,6 +28,7 @@
 
 import androidx.annotation.OptIn;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -41,6 +42,7 @@
  */
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class AndroidImageProxyTest {
     private static final long INITIAL_TIMESTAMP = 138990020L;
 
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageReaderProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageReaderProxyTest.java
index 53a4333..6c6136f 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageReaderProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageReaderProxyTest.java
@@ -33,6 +33,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -41,6 +42,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class AndroidImageReaderProxyTest {
     private final ImageReader mImageReader = mock(ImageReader.class);
     private ImageReaderProxy mImageReaderProxy;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
index 04937f2..a34bbd7 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
@@ -27,6 +27,7 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
 
 import org.junit.After;
 import org.junit.Before;
@@ -41,6 +42,7 @@
 
 @LargeTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class CameraXTest {
 
     private Context mContext;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCase.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCase.java
index 0e873a7..de7c213 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCase.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCase.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.Config;
 import androidx.camera.core.impl.UseCaseConfig;
@@ -32,6 +33,7 @@
  * <p>This is used to complement the {@link FakeUseCase} for testing instances where a use case of
  * different type is created.
  */
+@RequiresApi(21)
 public class FakeOtherUseCase extends UseCase {
     private volatile boolean mIsDetached = false;
 
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java
index 8b6a9bc..6e221b0 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java
@@ -17,6 +17,7 @@
 package androidx.camera.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.CaptureConfig;
 import androidx.camera.core.impl.Config;
@@ -30,6 +31,7 @@
 import java.util.UUID;
 
 /** A fake configuration for {@link FakeOtherUseCase}. */
+@RequiresApi(21)
 public class FakeOtherUseCaseConfig implements UseCaseConfig<FakeOtherUseCase> {
 
     private final Config mConfig;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
index aaa9ed5..32e1649 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
@@ -27,6 +27,7 @@
 
 import androidx.annotation.OptIn;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -41,6 +42,7 @@
  */
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class ForwardingImageProxyTest {
 
     private final ImageProxy mBaseImageProxy = mock(ImageProxy.class);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java
index 880191d..ec851c5 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java
@@ -39,6 +39,7 @@
 import androidx.camera.testing.fakes.FakeImageInfo;
 import androidx.camera.testing.fakes.FakeImageProxy;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -56,6 +57,7 @@
  */
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class ImageAnalysisAbstractAnalyzerTest {
     private static final int WIDTH = 8;
     private static final int HEIGHT = 8;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisDeviceTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisDeviceTest.java
index 59247ca..54ba2b2 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisDeviceTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisDeviceTest.java
@@ -28,6 +28,7 @@
 import androidx.camera.testing.fakes.FakeCameraInfoInternal;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Test;
@@ -35,6 +36,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class ImageAnalysisDeviceTest {
 
     private final CameraInternal mMockCameraInternal = mock(CameraInternal.class);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java
index bbd6f61..4ad0e86 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java
@@ -48,6 +48,7 @@
 import androidx.exifinterface.media.ExifInterface;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.junit.Before;
@@ -76,6 +77,7 @@
  */
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class ImageCaptureTest {
     private CameraUseCaseAdapter mCameraUseCaseAdapter;
     private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java
index 1ddc65d..2b979d9 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java
@@ -26,6 +26,7 @@
 import androidx.camera.testing.fakes.FakeImageInfo;
 import androidx.camera.testing.fakes.FakeImageProxy;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.After;
@@ -35,6 +36,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class ImageProcessingUtilTest {
 
     private static final int WIDTH = 8;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProxyDownsamplerTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProxyDownsamplerTest.java
index e908f70..cc7e0d2 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProxyDownsamplerTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProxyDownsamplerTest.java
@@ -25,6 +25,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Test;
@@ -34,6 +35,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class ImageProxyDownsamplerTest {
     private static final int WIDTH = 8;
     private static final int HEIGHT = 8;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageReaderProxysTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageReaderProxysTest.java
index 4b7be25..0ac83ab 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageReaderProxysTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageReaderProxysTest.java
@@ -46,6 +46,7 @@
  */
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class ImageReaderProxysTest {
 
     private ExecutorService mConsumerExecutor;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageSaverTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageSaverTest.java
index 1738617..5037730 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageSaverTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageSaverTest.java
@@ -48,6 +48,7 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.rule.GrantPermissionRule;
 
 import org.junit.After;
@@ -76,6 +77,7 @@
  */
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class ImageSaverTest {
 
     private static final int WIDTH = 160;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/IoExecutorTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/IoExecutorTest.java
index ecf0c0b..fb7b030 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/IoExecutorTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/IoExecutorTest.java
@@ -19,6 +19,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -32,6 +33,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class IoExecutorTest {
 
     private Executor mIoExecutor;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/MetadataImageReaderTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/MetadataImageReaderTest.java
index 6c2b905..8a0a68f 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/MetadataImageReaderTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/MetadataImageReaderTest.java
@@ -31,6 +31,7 @@
 import androidx.camera.testing.fakes.FakeImageReaderProxy;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 
 import org.junit.After;
 import org.junit.Before;
@@ -46,6 +47,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class MetadataImageReaderTest {
     private static final long TIMESTAMP_0 = 0L;
     private static final long TIMESTAMP_1 = 1000L;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java
index dbf19e5..7287460 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java
@@ -31,6 +31,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.testing.fakes.FakeImageReaderProxy;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -39,6 +40,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class SafeCloseImageReaderProxyTest {
     private FakeImageReaderProxy mFakeImageReaderProxy;
     private SafeCloseImageReaderProxy mSafeCloseImageReaderProxy;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/SingleCloseImageProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/SingleCloseImageProxyTest.java
index 04fed7a..eb095d9 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/SingleCloseImageProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/SingleCloseImageProxyTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.Mockito.verify;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -29,6 +30,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class SingleCloseImageProxyTest {
 
     private final ImageProxy mImageProxy = mock(ImageProxy.class);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
index 4389db1..efa2d2f 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
@@ -37,6 +37,7 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.After;
@@ -52,6 +53,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class SurfaceRequestTest {
 
     private static final Size FAKE_SIZE = new Size(0, 0);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.java
index 71cc836..39772e4 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.java
@@ -49,6 +49,7 @@
 import androidx.camera.testing.fakes.FakeUseCaseConfig;
 import androidx.camera.testing.fakes.FakeUseCaseConfigFactory;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -60,6 +61,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class UseCaseTest {
     private static final Size SURFACE_RESOLUTION = new Size(640, 480);
     private CameraInternal mMockCameraInternal;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.kt
index 45b1947..ce31a22 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.kt
@@ -18,6 +18,7 @@
 
 import android.media.CamcorderProfile
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assume.assumeTrue
@@ -27,6 +28,7 @@
 @RunWith(AndroidJUnit4::class)
 @SmallTest
 @Suppress("DEPRECATION")
+@SdkSuppress(minSdkVersion = 21)
 public class CamcorderProfileProxyTest {
 
     @Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureCallbacksTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureCallbacksTest.java
index 4bb7423..77cd42f 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureCallbacksTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureCallbacksTest.java
@@ -25,12 +25,14 @@
 import androidx.camera.core.impl.CameraCaptureCallbacks.NoOpCameraCaptureCallback;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class CameraCaptureCallbacksTest {
 
     @Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureFailureTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureFailureTest.java
index 3369e35..c0d99fe 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureFailureTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureFailureTest.java
@@ -20,6 +20,7 @@
 
 import androidx.camera.core.impl.CameraCaptureFailure.Reason;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Test;
@@ -27,6 +28,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class CameraCaptureFailureTest {
 
     @Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CaptureConfigTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CaptureConfigTest.java
index 148e9b7..371bd8a 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CaptureConfigTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CaptureConfigTest.java
@@ -30,6 +30,7 @@
 import androidx.camera.testing.DeferrableSurfacesUtil;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
 
 import com.google.common.collect.Lists;
 
@@ -42,6 +43,7 @@
 
 @LargeTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class CaptureConfigTest {
     private static final Option<Integer> OPTION = Config.Option.create(
             "camerax.test.option_0", Integer.class);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt
index a76dc4d..b5d0248 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt
@@ -20,6 +20,7 @@
 import androidx.camera.testing.asFlow
 import androidx.concurrent.futures.await
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CompletableDeferred
@@ -33,6 +34,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
 public class ConstantObservableTest {
 
     @Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/DeferrableSurfacesTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/DeferrableSurfacesTest.java
index 2f1684c..a83af98 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/DeferrableSurfacesTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/DeferrableSurfacesTest.java
@@ -30,6 +30,7 @@
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -49,6 +50,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class DeferrableSurfacesTest {
 
     private ScheduledExecutorService mScheduledExecutorService;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ImmediateSurfaceTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ImmediateSurfaceTest.java
index dae33b0..1eea3f5 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ImmediateSurfaceTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ImmediateSurfaceTest.java
@@ -27,6 +27,7 @@
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -42,6 +43,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public final class ImmediateSurfaceTest {
     private Surface mMockSurface = Mockito.mock(Surface.class);
     private ImmediateSurface mImmediateSurface;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt
index 805fb7b..79413be 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt
@@ -19,6 +19,7 @@
 import androidx.camera.testing.asFlow
 import androidx.concurrent.futures.await
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
@@ -34,6 +35,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
 public class LiveDataObservableTest {
 
     @Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/SessionConfigTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/SessionConfigTest.java
index 4666f7e..26bf8fd 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/SessionConfigTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/SessionConfigTest.java
@@ -29,6 +29,7 @@
 import androidx.camera.testing.fakes.FakeMultiValueSet;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 
 import com.google.common.collect.Lists;
 
@@ -41,6 +42,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class SessionConfigTest {
     private static final Option<Integer> OPTION = Option.create(
             "camerax.test.option_0", Integer.class);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/StateObservableTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/StateObservableTest.kt
index 0d901b2..0052b91 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/StateObservableTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/StateObservableTest.kt
@@ -20,6 +20,7 @@
 import androidx.concurrent.futures.await
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
@@ -42,6 +43,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
 public class StateObservableTest {
 
     @Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
index e7afeb1..1d44d7b 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
@@ -30,6 +30,7 @@
 import androidx.camera.testing.DeferrableSurfacesUtil;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -39,6 +40,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class UseCaseAttachStateTest {
     private final CameraDevice mMockCameraDevice = mock(CameraDevice.class);
     private final CameraCaptureSession mMockCameraCaptureSession =
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ViewPortsTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ViewPortsTest.java
index 5487370..976dcb3 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ViewPortsTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ViewPortsTest.java
@@ -37,6 +37,7 @@
 import androidx.camera.core.internal.ViewPorts;
 import androidx.camera.testing.fakes.FakeUseCase;
 import androidx.camera.testing.fakes.FakeUseCaseConfig;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Test;
@@ -56,6 +57,7 @@
 @SmallTest
 @SuppressLint("UnsupportedTestRunner")
 @RunWith(Enclosed.class)
+@SdkSuppress(minSdkVersion = 21)
 public class ViewPortsTest {
 
     // Rotation degrees.
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/ExifOutputStreamTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/ExifOutputStreamTest.kt
index 8b88aa5..c6386b0 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/ExifOutputStreamTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/ExifOutputStreamTest.kt
@@ -21,11 +21,13 @@
 import androidx.camera.core.impl.CameraCaptureMetaData
 import androidx.exifinterface.media.ExifInterface
 import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import java.io.File
 
 @LargeTest
+@SdkSuppress(minSdkVersion = 21)
 public class ExifOutputStreamTest {
 
     @Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/executors/HandlerScheduledExecutorServiceTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/executors/HandlerScheduledExecutorServiceTest.java
index 18beebd..ae61ac2 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/executors/HandlerScheduledExecutorServiceTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/executors/HandlerScheduledExecutorServiceTest.java
@@ -29,6 +29,7 @@
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Test;
@@ -47,6 +48,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class HandlerScheduledExecutorServiceTest {
 
     private static final long DELAYED_TASK_DELAY_MILLIS = 250;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java
index b137450..3c4aa14 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java
@@ -49,6 +49,7 @@
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -63,6 +64,7 @@
 /** JUnit test cases for {@link CameraUseCaseAdapter} class. */
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
 public class CameraUseCaseAdapterTest {
     FakeCameraDeviceSurfaceManager mFakeCameraDeviceSurfaceManager;
     FakeCamera mFakeCamera;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java
index 80198a0..4ed7152 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java
@@ -22,11 +22,13 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.TagBundle;
 
 import java.nio.ByteBuffer;
 
 /** An {@link ImageProxy} which wraps around an {@link Image}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class AndroidImageProxy implements ImageProxy {
     @GuardedBy("this")
     private final Image mImage;
@@ -96,6 +98,7 @@
     }
 
     /** An {@link ImageProxy.PlaneProxy} which wraps around an {@link Image.Plane}. */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     private static final class PlaneProxy implements ImageProxy.PlaneProxy {
         @GuardedBy("this")
         private final Image.Plane mPlane;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
index a2ac50e..ea2a97e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
@@ -23,6 +23,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ImageReaderProxy;
 import androidx.camera.core.impl.utils.MainThreadAsyncHandler;
 
@@ -34,6 +35,7 @@
  * <p>All methods map one-to-one between this {@link ImageReaderProxy} and the wrapped {@link
  * ImageReader}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class AndroidImageReaderProxy implements ImageReaderProxy {
     @GuardedBy("this")
     private final ImageReader mImageReader;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/AspectRatio.java b/camera/camera-core/src/main/java/androidx/camera/core/AspectRatio.java
index 3233526..ac5f593 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/AspectRatio.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/AspectRatio.java
@@ -17,6 +17,7 @@
 package androidx.camera.core;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
 import java.lang.annotation.Retention;
@@ -27,6 +28,7 @@
  *
  * <p>Aspect ratio is the ratio of width to height.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class AspectRatio {
     /** 4:3 standard aspect ratio. */
     public static final int RATIO_4_3 = 0;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Camera.java b/camera/camera-core/src/main/java/androidx/camera/core/Camera.java
index 4f29e186..ee03877b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Camera.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Camera.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.CameraConfig;
 import androidx.camera.core.impl.CameraInternal;
@@ -34,6 +35,7 @@
  *androidx.lifecycle.LifecycleOwner, CameraSelector, UseCase...) An example} of how to obtain an
  * instance of this class can be found in the {@link androidx.camera.lifecycle} package.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface Camera {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraClosedException.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraClosedException.java
index 4484992..2e00cd3 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraClosedException.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraClosedException.java
@@ -16,9 +16,11 @@
 
 package androidx.camera.core;
 
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
 /** This exception is thrown when request is cancelled due to that camera is closed */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class CameraClosedException extends RuntimeException {
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
index 9fa6afc..d24a652 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.FloatRange;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -40,6 +41,7 @@
  * {@link ListenableFuture} will fail immediately with
  * {@link CameraControl.OperationCanceledException}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraControl {
     /**
      * Enable the torch or disable the torch.
@@ -187,6 +189,7 @@
      * {@link Future#cancel(boolean)}, {@link OperationCanceledException} occurs when there is
      * something wrong inside CameraControl and it has to cancel the operation.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     final class OperationCanceledException extends Exception {
         /** @hide */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java
index fc0f985..fb29ce2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.CameraFactory;
 import androidx.core.util.Preconditions;
 
@@ -32,6 +33,7 @@
 /**
  * A camera executor class that executes camera operations.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class CameraExecutor implements Executor {
     private static final String TAG = "CameraExecutor";
     private static final int DEFAULT_CORE_THREADS = 1;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
index 99bc713..c71d8ec 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
@@ -17,6 +17,7 @@
 package androidx.camera.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.CameraConfig;
 import androidx.camera.core.impl.ExtendedCameraConfigProviderStore;
@@ -27,6 +28,7 @@
 /**
  * An interface for filtering cameras.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraFilter {
     /**
      * Default identifier of camera filter.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
index b479649..cb387cf 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
@@ -19,6 +19,7 @@
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.annotation.StringDef;
@@ -35,6 +36,7 @@
  *
  * <p>Applications can retrieve an instance via {@link Camera#getCameraInfo()}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraInfo {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfoUnavailableException.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfoUnavailableException.java
index f3f4cc0..88ba0d4 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfoUnavailableException.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfoUnavailableException.java
@@ -16,10 +16,12 @@
 
 package androidx.camera.core;
 
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
 /** An exception thrown when unable to retrieve information about a camera. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraInfoUnavailableException extends Exception {
     /** @hide */
     @RestrictTo(Scope.LIBRARY_GROUP)
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java
index 8a80db0..ffec29fc 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java
@@ -17,6 +17,7 @@
 package androidx.camera.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import java.util.List;
 
@@ -29,6 +30,7 @@
  * allows the applications to check whether any camera exists to fulfill the requirements or to
  * get {@link CameraInfo} instances of all cameras to retrieve the camera information.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraProvider {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
index 9ddde07..c3d43b0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
@@ -18,6 +18,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.impl.CameraInternal;
@@ -34,6 +35,7 @@
  * A set of requirements and priorities used to select a camera or return a filtered set of
  * cameras.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraSelector {
 
     /** A camera on the device facing the same direction as the device's screen. */
@@ -189,6 +191,7 @@
     }
 
     /** Builder for a {@link CameraSelector}. */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static final class Builder {
         private final LinkedHashSet<CameraFilter> mCameraFilterSet;
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java
index e87b5a3..16e5e58 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java
@@ -21,6 +21,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import com.google.auto.value.AutoValue;
 
@@ -130,6 +131,7 @@
  *
  * <p>Whenever the camera encounters an error, it reports it through {@link #getError()}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class CameraState {
 
@@ -256,6 +258,7 @@
      * {@link #ERROR_STREAM_CONFIG}, {@link #ERROR_CAMERA_DISABLED},
      * {@link #ERROR_CAMERA_FATAL_ERROR} and {@link #ERROR_DO_NOT_DISTURB_MODE_ENABLED}.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public enum ErrorType {
         /**
          * An error the camera encountered that CameraX will attempt to recover from.
@@ -277,6 +280,7 @@
     }
 
     /** States the camera can be in. */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public enum Type {
         /**
          * Represents a state where the camera is waiting for a signal to attempt to open the camera
@@ -438,6 +442,7 @@
      * </tr>
      * </table>
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     @AutoValue
     public abstract static class StateError {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraUnavailableException.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraUnavailableException.java
index 354c71c..2e951d1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraUnavailableException.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraUnavailableException.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
 import java.lang.annotation.Retention;
@@ -29,6 +30,7 @@
  * {@code CameraUnavailableException} is thrown when a camera device could not be queried or opened
  * or if the connection to an opened camera device is no longer valid.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class CameraUnavailableException extends Exception {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
index 03dd3dd..7c480ad 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
@@ -31,6 +31,7 @@
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.impl.CameraDeviceSurfaceManager;
@@ -62,6 +63,7 @@
  *
  * @hide
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @MainThread
 @RestrictTo(Scope.LIBRARY_GROUP)
 public final class CameraX {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
index b85a908..c9272f5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
@@ -23,6 +23,7 @@
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.impl.CameraDeviceSurfaceManager;
@@ -57,6 +58,7 @@
  * @see CameraXConfig.Builder
  */
 @SuppressWarnings("HiddenSuperclass")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraXConfig implements TargetConfig<CameraX> {
 
     /**
@@ -69,6 +71,7 @@
      * androidx.camera.lifecycle.ProcessCameraProvider#getInstance(android.content.Context)
      * Examples} of how this is used can be found in the {@link androidx.camera.lifecycle} package.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public interface Provider {
         /** Returns the configuration to use for initializing an instance of CameraX. */
         @NonNull
@@ -202,6 +205,7 @@
 
     /** A builder for generating {@link CameraXConfig} objects. */
     @SuppressWarnings("ObjectToString")
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static final class Builder
             implements TargetConfig.Builder<CameraX, CameraXConfig.Builder> {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraXThreads.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraXThreads.java
index d56a818..175c36d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraXThreads.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraXThreads.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.core;
 
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
@@ -25,6 +26,7 @@
  *
  * @hide
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @RestrictTo(Scope.LIBRARY_GROUP)
 public final class CameraXThreads {
     /** @hide */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java b/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java
index c441810..e8470cf 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java
@@ -17,6 +17,7 @@
 package androidx.camera.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.CaptureBundle;
 import androidx.camera.core.impl.CaptureStage;
 
@@ -28,6 +29,7 @@
 /**
  * Different implementations of {@link CaptureBundle}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class CaptureBundles {
     /** Creates a {@link CaptureBundle} which contain a single default {@link CaptureStage}. */
     @NonNull
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CaptureProcessorPipeline.java b/camera/camera-core/src/main/java/androidx/camera/core/CaptureProcessorPipeline.java
index 31610f1..f614281 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CaptureProcessorPipeline.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CaptureProcessorPipeline.java
@@ -22,6 +22,7 @@
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.CaptureProcessor;
 import androidx.camera.core.impl.ImageProxyBundle;
 import androidx.camera.core.impl.ImageReaderProxy;
@@ -38,6 +39,7 @@
 /**
  * A CaptureProcessor which can link two CaptureProcessors.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class CaptureProcessorPipeline implements CaptureProcessor {
     private final CaptureProcessor mPreCaptureProcessor;
     private final CaptureProcessor mPostCaptureProcessor;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/DisplayOrientedMeteringPointFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/DisplayOrientedMeteringPointFactory.java
index fda57c8..2f24daa 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/DisplayOrientedMeteringPointFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/DisplayOrientedMeteringPointFactory.java
@@ -22,6 +22,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.CameraInfoInternal;
 
@@ -48,6 +49,7 @@
  *
  * @see MeteringPoint
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class DisplayOrientedMeteringPointFactory extends MeteringPointFactory {
     /** The logical width of FoV in current display orientation */
     private final float mWidth;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalGetImage.java b/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalGetImage.java
index b84dc050..a5f3634 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalGetImage.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalGetImage.java
@@ -20,6 +20,7 @@
 
 import android.media.Image;
 
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RequiresOptIn;
 
 import java.lang.annotation.Retention;
@@ -36,6 +37,7 @@
  * {@link Image#close()}. Instead when the Image needs to be closed, {@link ImageProxy#close()}
  * should be called on the ImageProxy from which the Image was retrieved.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @Retention(CLASS)
 @RequiresOptIn
 public @interface ExperimentalGetImage {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ExposureState.java b/camera/camera-core/src/main/java/androidx/camera/core/ExposureState.java
index 7979a74..be7699d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ExposureState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ExposureState.java
@@ -20,12 +20,14 @@
 import android.util.Rational;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 /**
  * An interface which contains the camera exposure related information.
  *
  * <p>Applications can retrieve an instance via {@link CameraInfo#getExposureState()}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ExposureState {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ExtendableBuilder.java b/camera/camera-core/src/main/java/androidx/camera/core/ExtendableBuilder.java
index ab417ba..bbb6251 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ExtendableBuilder.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ExtendableBuilder.java
@@ -17,6 +17,7 @@
 package androidx.camera.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.MutableConfig;
 
@@ -26,6 +27,7 @@
  *
  * @param <T> the type being built by this builder.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ExtendableBuilder<T> {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java b/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java
index 4173040..a7adde0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java
@@ -19,6 +19,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.core.util.Preconditions;
 
@@ -67,6 +68,7 @@
  * default the auto-cancel duration is 5 seconds. Apps can call {@link Builder#disableAutoCancel()}
  * to disable auto-cancel.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class FocusMeteringAction {
 
     /**
@@ -154,6 +156,7 @@
     /**
      * The builder used to create the {@link FocusMeteringAction}.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static class Builder {
         @SuppressWarnings("WeakerAccess") /* synthetic accessor */
         final List<MeteringPoint> mMeteringPointsAf = new ArrayList<>();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringResult.java b/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringResult.java
index f7afcc3..ce43cbf 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringResult.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringResult.java
@@ -17,11 +17,13 @@
 package androidx.camera.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
 /**
  * Result of the {@link CameraControl#startFocusAndMetering(FocusMeteringAction)}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class FocusMeteringResult {
     private boolean mIsFocusSuccessful;
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java
index 3372c84..672dd35 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java
@@ -22,6 +22,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -35,6 +36,7 @@
  * <p>Listeners for the image close call can be added. When the image is closed, the listeners will
  * be notified.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 abstract class ForwardingImageProxy implements ImageProxy {
     @GuardedBy("this")
     protected final ImageProxy mImage;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
index 555c140..6431f05 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
@@ -50,6 +50,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.impl.CameraInfoInternal;
@@ -93,6 +94,7 @@
  * Failing to close the image will cause future images to be stalled or dropped depending on the
  * backpressure strategy.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ImageAnalysis extends UseCase {
 
     ////////////////////////////////////////////////////////////////////////////////////////////
@@ -672,6 +674,7 @@
      * to receive images and perform custom processing by implementing the
      * {@link ImageAnalysis.Analyzer#analyze(ImageProxy)} function.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public interface Analyzer {
         /**
          * Analyzes an image to produce a result.
@@ -719,6 +722,7 @@
      *
      * @hide
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     @RestrictTo(Scope.LIBRARY_GROUP)
     public static final class Defaults implements ConfigProvider<ImageAnalysisConfig> {
         private static final Size DEFAULT_TARGET_RESOLUTION = new Size(640, 480);
@@ -745,6 +749,7 @@
 
     /** Builder for a {@link ImageAnalysis}. */
     @SuppressWarnings("ObjectToString")
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static final class Builder
             implements ImageOutputConfig.Builder<Builder>,
             ThreadConfig.Builder<Builder>,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
index d7dc3f1..12d1f07 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
@@ -23,6 +23,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ImageReaderProxy;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -39,6 +40,7 @@
  * This is an extension of {@link ImageAnalysis}. It has the same lifecycle and share part of the
  * states.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 abstract class ImageAnalysisAbstractAnalyzer implements ImageReaderProxy.OnImageAvailableListener {
 
     private static final String TAG = "ImageAnalysisAnalyzer";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisBlockingAnalyzer.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisBlockingAnalyzer.java
index df579f5..4463eda 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisBlockingAnalyzer.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisBlockingAnalyzer.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ImageReaderProxy;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.impl.utils.futures.FutureCallback;
@@ -30,6 +31,7 @@
  *
  * <p> Used with {@link ImageAnalysis}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class ImageAnalysisBlockingAnalyzer extends ImageAnalysisAbstractAnalyzer {
 
     @Nullable
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisNonBlockingAnalyzer.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisNonBlockingAnalyzer.java
index 9fec57b..4ffa539 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisNonBlockingAnalyzer.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisNonBlockingAnalyzer.java
@@ -19,6 +19,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 import androidx.camera.core.impl.ImageReaderProxy;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
@@ -34,6 +35,7 @@
  *
  * <p> Used with {@link ImageAnalysis}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class ImageAnalysisNonBlockingAnalyzer extends ImageAnalysisAbstractAnalyzer {
 
     // The executor for managing cached image.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
index 0135bde..55d1539 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
@@ -70,6 +70,7 @@
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.annotation.UiThread;
@@ -164,6 +165,7 @@
  * <p>When capturing to memory, the captured image is made available through an {@link ImageProxy}
  * via an {@link ImageCapture.OnImageCapturedCallback}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ImageCapture extends UseCase {
 
     ////////////////////////////////////////////////////////////////////////////////////////////
@@ -1788,6 +1790,7 @@
     }
 
     /** Listener containing callbacks for image file I/O events. */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public interface OnImageSavedCallback {
         /** Called when an image has been successfully saved. */
         void onImageSaved(@NonNull OutputFileResults outputFileResults);
@@ -1804,6 +1807,7 @@
     /**
      * Callback for when an image capture has completed.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public abstract static class OnImageCapturedCallback {
         /**
          * Callback for when the image has been captured.
@@ -1885,6 +1889,7 @@
      * either a {@link File}, {@link MediaStore} or a {@link OutputStream}. The metadata will be
      * stored with the saved image. For JPEG this will be included in the EXIF.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static final class OutputFileOptions {
 
         @Nullable
@@ -1955,6 +1960,7 @@
         /**
          * Builder class for {@link OutputFileOptions}.
          */
+        @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info
         public static final class Builder {
             @Nullable
             private File mFile;
@@ -2045,6 +2051,7 @@
     /**
      * Info about the saved image file.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static class OutputFileResults {
         @Nullable
         private Uri mSavedUri;
@@ -2067,6 +2074,7 @@
     }
 
     /** Holder class for metadata that will be saved with captured images. */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static final class Metadata {
         /**
          * Indicates a left-right mirroring (reflection).
@@ -2308,6 +2316,7 @@
     }
 
     @VisibleForTesting
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     static class ImageCaptureRequest {
         @RotationValue
         final int mRotationDegrees;
@@ -2496,6 +2505,7 @@
 
     /** Builder for an {@link ImageCapture}. */
     @SuppressWarnings("ObjectToString")
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static final class Builder implements
             UseCaseConfig.Builder<ImageCapture, ImageCaptureConfig, Builder>,
             ImageOutputConfig.Builder<Builder>,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureException.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureException.java
index 56e5f72..5847aa6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureException.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureException.java
@@ -18,12 +18,14 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 /**
  * An exception thrown to indicate an error has occurred during image capture or while saving the
  * captured image. See {@link ImageCapture.OnImageCapturedCallback} and
  * {@link ImageCapture.OnImageSavedCallback}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class ImageCaptureException extends Exception {
 
     @ImageCapture.ImageCaptureError
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java
index f5feed0..8ae16ad 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java
@@ -17,11 +17,13 @@
 package androidx.camera.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.TagBundle;
 import androidx.camera.core.impl.utils.ExifData;
 
 /** Metadata for an image. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ImageInfo {
     /**
      * Returns all tags stored in the metadata.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
index 415f150..d5dbee2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
@@ -22,11 +22,13 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ImageReaderProxy;
 
 import java.nio.ByteBuffer;
 
 /** Utility class to convert an {@link Image} from YUV to RGB. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class ImageProcessingUtil {
 
     private static final String TAG = "ImageProcessingUtil";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java
index 867a605..16404a4 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java
@@ -22,10 +22,12 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import java.nio.ByteBuffer;
 
 /** An image proxy which has a similar interface as {@link android.media.Image}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ImageProxy extends AutoCloseable {
     /**
      * Closes the underlying {@link android.media.Image}.
@@ -84,6 +86,7 @@
     PlaneProxy[] getPlanes();
 
     /** A plane proxy which has an analogous interface as {@link android.media.Image.Plane}. */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     interface PlaneProxy {
         /**
          * Returns the row stride.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java
index 08e7f24..b7a2eb9 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java
@@ -20,10 +20,12 @@
 import android.util.Size;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import java.nio.ByteBuffer;
 
 /** Utility functions for downsampling an {@link ImageProxy}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class ImageProxyDownsampler {
 
     private ImageProxyDownsampler() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderFormatRecommender.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderFormatRecommender.java
index 9e38a5d..3cd407e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderFormatRecommender.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderFormatRecommender.java
@@ -19,9 +19,12 @@
 import android.graphics.ImageFormat;
 import android.media.ImageReader;
 
+import androidx.annotation.RequiresApi;
+
 import com.google.auto.value.AutoValue;
 
 /** Recommends formats for a combination of {@link ImageReader} instances. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class ImageReaderFormatRecommender {
 
     private ImageReaderFormatRecommender() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxyProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxyProvider.java
index a75a49d..12839ce 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxyProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxyProvider.java
@@ -17,6 +17,7 @@
 package androidx.camera.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.ImageReaderProxy;
 
@@ -25,6 +26,7 @@
  *
  * @hide
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public interface ImageReaderProxyProvider {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxys.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxys.java
index f4cdc15..7e5ccc1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxys.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxys.java
@@ -19,11 +19,13 @@
 import android.media.ImageReader;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ImageReaderProxy;
 
 /**
  * Different implementations of {@link ImageReaderProxy}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class ImageReaderProxys {
 
     private ImageReaderProxys() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageSaver.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageSaver.java
index 63567ae..98d2189 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageSaver.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageSaver.java
@@ -25,6 +25,7 @@
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.utils.Exif;
 import androidx.camera.core.internal.compat.workaround.ExifRotationAvailability;
 import androidx.camera.core.internal.utils.ImageUtil;
@@ -41,6 +42,7 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
 
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class ImageSaver implements Runnable {
     private static final String TAG = "ImageSaver";
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java
index 010bc49..e18d65a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java
@@ -17,11 +17,13 @@
 package androidx.camera.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.TagBundle;
 import androidx.camera.core.impl.utils.ExifData;
 
 import com.google.auto.value.AutoValue;
 
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 abstract class ImmutableImageInfo implements ImageInfo {
     public static ImageInfo create(@NonNull TagBundle tag, long timestamp,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/InitializationException.java b/camera/camera-core/src/main/java/androidx/camera/core/InitializationException.java
index a29b185..2ccc113 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/InitializationException.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/InitializationException.java
@@ -17,11 +17,13 @@
 package androidx.camera.core;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 /**
  * {@code InitializationException} is thrown when a failure occurs during an initialization
  * process.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class InitializationException extends Exception {
 
     public InitializationException(@Nullable String message) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Logger.java b/camera/camera-core/src/main/java/androidx/camera/core/Logger.java
index f51e244..3703bbd 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Logger.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Logger.java
@@ -22,6 +22,7 @@
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
 /**
@@ -55,6 +56,7 @@
  *
  * @hide
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public final class Logger {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java b/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
index 168641e..fcd0a7d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
@@ -23,6 +23,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.CameraCaptureCallback;
 import androidx.camera.core.impl.CameraCaptureResult;
 import androidx.camera.core.impl.ImageReaderProxy;
@@ -45,6 +46,7 @@
  * acquired at one time as defined by <code>maxImages</code> in the constructor. Any ImageProxy
  * produced after that will be dropped unless one of the ImageProxy currently acquired is closed.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class MetadataImageReader implements ImageReaderProxy, ForwardingImageProxy.OnImageCloseListener {
     private static final String TAG = "MetadataImageReader";
     private final Object mLock = new Object();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/MeteringPoint.java b/camera/camera-core/src/main/java/androidx/camera/core/MeteringPoint.java
index ddc11d9..23c2d6a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/MeteringPoint.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/MeteringPoint.java
@@ -19,6 +19,7 @@
 import android.util.Rational;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
 /**
@@ -49,6 +50,7 @@
  * The metering rectangle defined by the {@link MeteringPoint} has the same shape as the sensor
  * array.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class MeteringPoint {
     private float mNormalizedX;
     private float mNormalizedY;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/MeteringPointFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/MeteringPointFactory.java
index 74c8674..b0f64c6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/MeteringPointFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/MeteringPointFactory.java
@@ -21,6 +21,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
 /**
@@ -34,6 +35,7 @@
  * @see #createPoint(float, float)
  * @see #createPoint(float, float, float)
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public abstract class MeteringPointFactory {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
index f39681f..0d7d4c6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
@@ -53,6 +53,7 @@
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.annotation.UiThread;
@@ -132,6 +133,7 @@
  *     </code>
  * </pre>
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class Preview extends UseCase {
 
     ////////////////////////////////////////////////////////////////////////////////////////////
@@ -559,6 +561,7 @@
      *
      * @see Preview#setSurfaceProvider(Executor, SurfaceProvider)
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public interface SurfaceProvider {
         /**
          * Called when a new {@link Surface} has been requested by the camera.
@@ -648,6 +651,7 @@
 
     /** Builder for a {@link Preview}. */
     @SuppressWarnings("ObjectToString")
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static final class Builder
             implements UseCaseConfig.Builder<Preview, PreviewConfig, Builder>,
             ImageOutputConfig.Builder<Builder>,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java
index 3afb75c..9e6a52c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java
@@ -24,6 +24,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.CameraCaptureCallback;
 import androidx.camera.core.impl.CaptureBundle;
 import androidx.camera.core.impl.CaptureProcessor;
@@ -52,6 +53,7 @@
  * the {@link CaptureProcessor} set, then returns a single output ImageProxy to
  * OnImageAvailableListener.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class ProcessingImageReader implements ImageReaderProxy {
     private static final String TAG = "ProcessingImageReader";
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java
index 0769084..acb6077 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java
@@ -28,6 +28,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.CameraCaptureCallback;
 import androidx.camera.core.impl.CaptureProcessor;
 import androidx.camera.core.impl.CaptureStage;
@@ -45,6 +46,7 @@
 /**
  * A {@link DeferrableSurface} that does processing and outputs a {@link SurfaceTexture}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class ProcessingSurface extends DeferrableSurface {
     private static final String TAG = "ProcessingSurfaceTextur";
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ResolutionInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/ResolutionInfo.java
index 8a836c7..eeee01f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ResolutionInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ResolutionInfo.java
@@ -20,6 +20,7 @@
 import android.util.Size;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ImageOutputConfig;
 
 import com.google.auto.value.AutoValue;
@@ -33,6 +34,7 @@
  * {@link ImageAnalysis} before an {@link ImageProxy} is received from
  * {@link ImageAnalysis.Analyzer}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class ResolutionInfo {
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
index 5f8c672..8132309 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
@@ -21,6 +21,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ImageReaderProxy;
 
 import java.util.concurrent.Executor;
@@ -29,6 +30,7 @@
  * An {@link ImageReaderProxy} that wraps another ImageReaderProxy to safely wait until all
  * produced {@link ImageProxy} are closed before closing the ImageReaderProxy.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class SafeCloseImageReaderProxy implements ImageReaderProxy {
     // Lock to synchronize acquired ImageProxys and close.
     private final Object mLock = new Object();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxy.java
index 7e79369..3c45ed6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxy.java
@@ -21,10 +21,12 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 /**
  * An {@link ImageProxy} which overwrites the {@link ImageInfo}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class SettableImageProxy extends ForwardingImageProxy{
     private final ImageInfo mImageInfo;
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxyBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxyBundle.java
index b66e09e..8bf8a73 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxyBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxyBundle.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ImageProxyBundle;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 
@@ -33,6 +34,7 @@
  * A {@link ImageProxyBundle} with a predefined set of captured ids. The {@link ListenableFuture}
  * for the capture id becomes valid when the corresponding {@link ImageProxy} has been set.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class SettableImageProxyBundle implements ImageProxyBundle {
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     final Object mLock = new Object();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SingleCloseImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/SingleCloseImageProxy.java
index 1f0ca63..a6ddb1e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SingleCloseImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SingleCloseImageProxy.java
@@ -17,8 +17,10 @@
 package androidx.camera.core;
 
 import androidx.annotation.GuardedBy;
+import androidx.annotation.RequiresApi;
 
 /** A {@link ImageProxy} which filters out redundant calls to {@link #close()}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class SingleCloseImageProxy extends ForwardingImageProxy {
     @GuardedBy("this")
     private boolean mClosed = false;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOrientedMeteringPointFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOrientedMeteringPointFactory.java
index 8529d79..3c3c74de 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOrientedMeteringPointFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOrientedMeteringPointFactory.java
@@ -23,6 +23,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
 /**
@@ -44,6 +45,7 @@
  *
  * @see MeteringPoint
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class SurfaceOrientedMeteringPointFactory extends MeteringPointFactory {
     /** the width of the area in surface orientation */
     private final float mWidth;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java
index b9fb40f..ae5c4bf 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java
@@ -30,6 +30,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.DeferrableSurface;
@@ -60,6 +61,7 @@
  *
  * @see Preview.SurfaceProvider#onSurfaceRequested(SurfaceRequest)
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class SurfaceRequest {
 
     private final Size mResolution;
@@ -474,6 +476,7 @@
      * Listener that receives updates of the {@link TransformationInfo} associated with the
      * {@link SurfaceRequest}.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public interface TransformationInfoListener {
 
         /**
@@ -498,6 +501,7 @@
      * Result of providing a surface to a {@link SurfaceRequest} via
      * {@link #provideSurface(Surface, Executor, Consumer)}.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     @AutoValue
     public abstract static class Result {
 
@@ -651,6 +655,7 @@
      * @see CameraCharacteristics#SENSOR_ORIENTATION
      * @see ViewPort
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     @AutoValue
     public abstract static class TransformationInfo {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/TorchState.java b/camera/camera-core/src/main/java/androidx/camera/core/TorchState.java
index b91b28d..bf52caf 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/TorchState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/TorchState.java
@@ -17,12 +17,14 @@
 package androidx.camera.core;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
 /** The camera flash torch state. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class TorchState {
     /** Torch is off. */
     public static final int OFF = 0;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java b/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
index 25ac77d..a1b203e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
@@ -27,6 +27,7 @@
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.impl.CameraControlInternal;
@@ -56,6 +57,7 @@
  * that are usable by a camera. UseCase also will communicate of the active/inactive state to
  * the Camera.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public abstract class UseCase {
 
     ////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java b/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java
index cb5459a..0926e89 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.util.Preconditions;
 import androidx.lifecycle.Lifecycle;
 
@@ -32,6 +33,7 @@
  * {@link UseCaseGroup} usually share some common properties like the FOV defined by
  * {@link ViewPort}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class UseCaseGroup {
 
     @Nullable
@@ -64,6 +66,7 @@
     /**
      * A builder for generating {@link UseCaseGroup}.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static final class Builder {
 
         private ViewPort mViewPort;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java
index a958c5c..8ef82f0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java
@@ -123,6 +123,7 @@
  *
  * @hide
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @RestrictTo(Scope.LIBRARY_GROUP)
 public final class VideoCapture extends UseCase {
 
@@ -1311,6 +1312,7 @@
      *
      * @hide
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     @RestrictTo(Scope.LIBRARY_GROUP)
     public static final class Defaults
             implements ConfigProvider<VideoCaptureConfig> {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ViewPort.java b/camera/camera-core/src/main/java/androidx/camera/core/ViewPort.java
index bd134d5..01a01c5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ViewPort.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ViewPort.java
@@ -23,6 +23,7 @@
 
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.ImageOutputConfig;
 import androidx.core.util.Preconditions;
@@ -54,6 +55,7 @@
  * a way that only the area defined by the crop rect is visible to end users. Once the crop rect
  * is applied, all the use cases will produce the same image with possibly different resolutions.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ViewPort {
 
     /**
@@ -199,6 +201,7 @@
     /**
      * Builder for {@link ViewPort}.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     public static final class Builder {
 
         private static final int DEFAULT_LAYOUT_DIRECTION = android.util.LayoutDirection.LTR;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ZoomState.java b/camera/camera-core/src/main/java/androidx/camera/core/ZoomState.java
index 0cbdb84..ad1e334 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ZoomState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ZoomState.java
@@ -16,11 +16,14 @@
 
 package androidx.camera.core;
 
+import androidx.annotation.RequiresApi;
+
 /**
  * An interface which contains the zoom related information from a camera.
  *
  * <p>Applications can retrieve an instance via {@link CameraInfo#getZoomState()}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ZoomState {
     /**
      * Returns the zoom ratio. The value is 1.0 by default.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java
index 865e2d1..e8ed228 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java
@@ -19,10 +19,12 @@
 import android.media.CamcorderProfile;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 /**
  * CamcorderProfileProvider is used to obtain the {@link CamcorderProfileProxy}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CamcorderProfileProvider {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java
index 5f0e82e..3c37a1b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java
@@ -19,6 +19,7 @@
 import android.media.CamcorderProfile;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import com.google.auto.value.AutoValue;
 
@@ -26,6 +27,7 @@
  * CamcorderProfileProxy defines the get methods that is mapping to the fields of
  * {@link CamcorderProfile}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class CamcorderProfileProxy {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallback.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallback.java
index f82b4c5..05083ec 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallback.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallback.java
@@ -17,12 +17,14 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 /**
  * A callback object for tracking the progress of a capture request submitted to the camera device.
  * Once one of the methods is called, other methods won't be called again on the same instance.
  *
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public abstract class CameraCaptureCallback {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallbacks.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallbacks.java
index 1ca2fe0..744c289 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallbacks.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallbacks.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -25,6 +26,7 @@
 /**
  * Different implementations of {@link CameraCaptureCallback}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraCaptureCallbacks {
     private CameraCaptureCallbacks() {
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureFailure.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureFailure.java
index 279ce53d..af4b320 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureFailure.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureFailure.java
@@ -17,11 +17,13 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 /**
  * A report of failed capture for a single image capture.
  *
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class CameraCaptureFailure {
 
     private final Reason mReason;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureMetaData.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureMetaData.java
index 1650b4d..3e73d54 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureMetaData.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureMetaData.java
@@ -16,10 +16,13 @@
 
 package androidx.camera.core.impl;
 
+import androidx.annotation.RequiresApi;
+
 /**
  * This class defines the enumeration constants used for querying the camera capture mode and
  * results.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraCaptureMetaData {
     private CameraCaptureMetaData() {
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResult.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResult.java
index a808987..cdaa454 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResult.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResult.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.CameraCaptureMetaData.AeState;
 import androidx.camera.core.impl.CameraCaptureMetaData.AfMode;
 import androidx.camera.core.impl.CameraCaptureMetaData.AfState;
@@ -28,6 +29,7 @@
  * The result of a single image capture.
  *
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraCaptureResult {
 
     /** Returns the current auto focus mode of operation. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResults.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResults.java
index 6ccf048..a6867ac 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResults.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResults.java
@@ -18,12 +18,14 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageInfo;
 import androidx.camera.core.internal.CameraCaptureResultImageInfo;
 
 /**
  * Utility functionality for {@link CameraCaptureResult}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraCaptureResults {
     /**
      * Retrieves the underlying {@link CameraCaptureResult} from the {@link ImageInfo} if the
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java
index 7a9196b..90c9cac 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java
@@ -19,6 +19,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Preview;
 
@@ -28,6 +29,7 @@
 /**
  * Configuration for a {@link androidx.camera.core.Camera}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraConfig extends ReadableConfig {
 
     // Option Declarations:
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
index 48302fe..b535d3b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
@@ -20,11 +20,13 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraInfo;
 
 /**
  * Provides the ability to create a {@link CameraConfig} given a {@link CameraInfo}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraConfigProvider {
 
     CameraConfigProvider EMPTY = (cameraInfo, context) -> null;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigs.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigs.java
index fd99c72c9..1eb8774e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigs.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigs.java
@@ -17,10 +17,12 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 /**
  * Utility methods for operating on {@link CameraConfig} instances.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class CameraConfigs {
     private static final CameraConfig EMPTY_CONFIG = new EmptyCameraConfig();
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java
index cea2721..d770f51 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java
@@ -21,6 +21,7 @@
 import android.graphics.Rect;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.FocusMeteringAction;
 import androidx.camera.core.FocusMeteringResult;
@@ -39,6 +40,7 @@
  * triggering
  * AF/AE.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraControlInternal extends CameraControl {
 
     /** Returns the current flash mode. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraDeviceSurfaceManager.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraDeviceSurfaceManager.java
index 00df7bd..3d16c28 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraDeviceSurfaceManager.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraDeviceSurfaceManager.java
@@ -21,6 +21,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.InitializationException;
 
 import java.util.List;
@@ -31,6 +32,7 @@
  * Camera device manager to provide the guaranteed supported stream capabilities related info for
  * all camera devices
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraDeviceSurfaceManager {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
index 1e87b19..814ea36 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraUnavailableException;
 import androidx.camera.core.InitializationException;
@@ -29,6 +30,7 @@
 /**
  * The factory class that creates {@link CameraInternal} instances.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraFactory {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFilters.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFilters.java
index 7c3be42..b40f6b41 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFilters.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFilters.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.core.impl;
 
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraFilter;
 
 import java.util.Collections;
@@ -23,6 +24,7 @@
 /**
  * Implementations of different {@link CameraFilter}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class CameraFilters {
     /**
      * A camera filter which returns all input camera infos.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
index a0fd33d..d35e1d0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
 import androidx.core.util.Preconditions;
@@ -30,6 +31,7 @@
  *
  * <p>Contains methods for retrieving characteristics for a specific camera.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraInfoInternal extends CameraInfo {
     /**
      * Returns the LensFacing of this camera.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
index c7e24bc..5987245 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.CameraInfo;
@@ -34,6 +35,7 @@
  *
  * <p> It is a Camera instance backed by a single physical camera.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CameraInternal extends Camera, UseCase.StateChangeCallback {
     /**
      * The state of a camera within the process.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraRepository.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraRepository.java
index e920606..020d772 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraRepository.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraRepository.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraUnavailableException;
 import androidx.camera.core.InitializationException;
 import androidx.camera.core.Logger;
@@ -39,6 +40,7 @@
 /**
  * A collection of {@link CameraInternal} instances.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraRepository {
     private static final String TAG = "CameraRepository";
     private final Object mCamerasLock = new Object();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraStateRegistry.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraStateRegistry.java
index 0364baf..cea9370 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraStateRegistry.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraStateRegistry.java
@@ -19,6 +19,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.WorkerThread;
 import androidx.camera.core.Camera;
 import androidx.camera.core.Logger;
@@ -37,6 +38,7 @@
  * Cameras that are in a {@link CameraInternal.State#PENDING_OPEN} state can be notified when
  * there is a slot available to open a camera.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraStateRegistry {
     private static final String TAG = "CameraStateRegistry";
     private final StringBuilder mDebugString = new StringBuilder();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java
index 72f263f..5c98ae1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java
@@ -19,6 +19,7 @@
 import android.os.Handler;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import com.google.auto.value.AutoValue;
 
@@ -27,6 +28,7 @@
 /**
  * Configuration options for threads used by the camera stack implementation.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class CameraThreadConfig {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java
index b09f9dd..9ec589f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java
@@ -22,6 +22,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.Logger;
 
@@ -29,6 +30,7 @@
  * Validation methods to verify the camera is initialized successfully, more info please reference
  * b/167201193.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraValidator {
     private CameraValidator() {
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureBundle.java
index 5b3c2a7..77870fd 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureBundle.java
@@ -17,12 +17,14 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import java.util.List;
 
 /**
  * A interface to return an ordered collection of {@link CaptureStage}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CaptureBundle {
     /**
      * Returns a list of {@link CaptureStage} in order of how they are to be issued.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureConfig.java
index 018ec009..78d4181 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureConfig.java
@@ -23,6 +23,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -37,6 +38,7 @@
  * <p>The CaptureConfig contains all the {@link android.hardware.camera2} parameters that are
  * required to issue a {@link CaptureRequest}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CaptureConfig {
     /** Indicates template type is not set. */
     public static final int TEMPLATE_TYPE_NONE = -1;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureProcessor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureProcessor.java
index 54c7037b..d9073d5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureProcessor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureProcessor.java
@@ -19,6 +19,7 @@
 import android.util.Size;
 import android.view.Surface;
 
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.Preview;
@@ -26,6 +27,7 @@
 /**
  * A processing step of the image capture pipeline.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CaptureProcessor {
     /**
      * This gets called to update where the CaptureProcessor should write the output of {@link
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureStage.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureStage.java
index a93bf97..4cf81b7 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureStage.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureStage.java
@@ -16,9 +16,12 @@
 
 package androidx.camera.core.impl;
 
+import androidx.annotation.RequiresApi;
+
 /**
  * A {@link CaptureConfig} with an identifier.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface CaptureStage {
 
     /** Returns the identifier for the capture. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/Config.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/Config.java
index e26c48f..243f987 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/Config.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/Config.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import com.google.auto.value.AutoValue;
 
@@ -35,6 +36,7 @@
  * {@link Config#retrieveOptionWithPriority} and {@link Config#getPriorities} can be used to
  * retrieve option value of specified priority.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface Config {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ConfigProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ConfigProvider.java
index 972316a..85db119 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ConfigProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ConfigProvider.java
@@ -17,12 +17,14 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 /**
  * A class which provides a {@link Config} object.
  *
  * @param <C> the {@link Config} type provided
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ConfigProvider<C extends Config> {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java
index f090d00c..da66819 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.utils.futures.Futures;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -29,6 +30,7 @@
  * An {@link Observable} whose value is set at construction time and never changes.
  * @param <T> The observed type.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ConstantObservable<T> implements Observable<T> {
     private static final ConstantObservable<Object> NULL_OBSERVABLE =
             new ConstantObservable<>(null);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurface.java
index 3900a5b..1352d7f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurface.java
@@ -24,6 +24,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.Logger;
@@ -45,6 +46,7 @@
  * <p>Resources managed by this class can be safely cleaned up upon completion of the
  * {@link ListenableFuture} returned by {@link #getTerminationFuture()}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public abstract class DeferrableSurface {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurfaces.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurfaces.java
index ee73821..6e4789c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurfaces.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurfaces.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -39,6 +40,7 @@
 /**
  * Utility functions for manipulating {@link DeferrableSurface}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class DeferrableSurfaces {
 
     private DeferrableSurfaces() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeviceProperties.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeviceProperties.java
index 7b28a94..441f99a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeviceProperties.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeviceProperties.java
@@ -19,12 +19,14 @@
 import android.os.Build;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import com.google.auto.value.AutoValue;
 
 /**
  * Container of the device properties.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class DeviceProperties {
     /** Creates an instance by querying the properties from {@link android.os.Build}. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
index 66fc97b..725d8af 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -26,6 +27,7 @@
  * Stores {@link CameraConfigProvider} instances which allow building {@link CameraConfig} using
  * keys (extensions modes for example). The provided {@link CameraConfig}s are unique to the device.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ExtendedCameraConfigProviderStore {
 
     private static final Object LOCK = new Object();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/Identifier.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/Identifier.java
index 1da3738..6f8bc8a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/Identifier.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/Identifier.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import com.google.auto.value.AutoValue;
 
@@ -25,6 +26,7 @@
  * The caller should make the input value object unique when calling the {@link #create(Object)}
  * function. So that the {@link Identifier} can be recognized and used for specific purposes.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class Identifier {
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java
index a53a1f6..5a298f1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java
@@ -21,6 +21,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.ImageAnalysis;
@@ -31,6 +32,7 @@
 /**
  * Configuration for an image analysis use case.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ImageAnalysisConfig
         implements UseCaseConfig<ImageAnalysis>,
         ImageOutputConfig,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java
index c40c3ef..9c535eb 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.ImageCapture.CaptureMode;
@@ -31,6 +32,7 @@
 /**
  * Configuration for an image capture use case.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ImageCaptureConfig implements UseCaseConfig<ImageCapture>, ImageOutputConfig,
         IoConfig {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageFormatConstants.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageFormatConstants.java
index 4dff791..ac6d4c7 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageFormatConstants.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageFormatConstants.java
@@ -16,10 +16,13 @@
 
 package androidx.camera.core.impl;
 
+import androidx.annotation.RequiresApi;
+
 /**
  * This class used to constant values corresponding to the internal defined image format value used
  * in StreamConfigurationMap.java.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ImageFormatConstants {
     // Internal format in StreamConfigurationMap.java that will be mapped to public ImageFormat.JPEG
     public static final int INTERNAL_DEFINED_IMAGE_FORMAT_JPEG = 0x21;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInfoProcessor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInfoProcessor.java
index 63f3591..89fff66 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInfoProcessor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInfoProcessor.java
@@ -18,12 +18,14 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageInfo;
 
 /**
  * A processing step that updates the necessary {@link CaptureStage} based on the current
  * {@link ImageInfo}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ImageInfoProcessor {
     /**
      * Returns the {@link CaptureStage} which should be issued for the processing.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInputConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInputConfig.java
index 225e6e6..2947d4b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInputConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInputConfig.java
@@ -16,9 +16,11 @@
 
 package androidx.camera.core.impl;
 
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Camera;
 
 /** Configuration containing options for configuring the input image data of a pipeline. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ImageInputConfig extends ReadableConfig {
     Config.Option<Integer> OPTION_INPUT_FORMAT =
             Config.Option.create("camerax.core.imageInput.inputFormat", int.class);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageOutputConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageOutputConfig.java
index 62d5e09..93b3ab4 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageOutputConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageOutputConfig.java
@@ -24,6 +24,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.AspectRatio;
 
 import java.lang.annotation.Retention;
@@ -33,6 +34,7 @@
 /**
  * Configuration containing options for configuring the output image data of a pipeline.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ImageOutputConfig extends ReadableConfig {
     /**
      * Invalid integer rotation.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageProxyBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageProxyBundle.java
index 9594745..9ecbd1c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageProxyBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageProxyBundle.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageProxy;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -26,6 +27,7 @@
 /**
  * A set of {@link ImageProxy} which are mapped an identifier.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ImageProxyBundle {
     /**
      * Get a {@link ListenableFuture} for a {@link ImageProxy}.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java
index 4b2d253..7db3473 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java
@@ -21,6 +21,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.ImageProxy;
@@ -35,6 +36,7 @@
  *
  */
 
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ImageReaderProxy {
     /**
      * Acquires the latest image in the queue.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImmediateSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImmediateSurface.java
index aeb8aaf..057f327 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImmediateSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImmediateSurface.java
@@ -20,6 +20,7 @@
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.utils.futures.Futures;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -28,6 +29,7 @@
  * A {@link DeferrableSurface} which always returns immediately.
  *
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ImmediateSurface extends DeferrableSurface {
     private final Surface mSurface;
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java
index e388744..3ac75d8 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraFilter;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
@@ -28,6 +29,7 @@
 /**
  * A filter that filters camera based on lens facing.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class LensFacingCameraFilter implements CameraFilter {
     @CameraSelector.LensFacing
     private int mLensFacing;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingConverter.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingConverter.java
index 1db98f3..6748024 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingConverter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingConverter.java
@@ -18,11 +18,13 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraSelector;
 
 /**
  * Helper class that defines certain enum-like methods for {@link CameraSelector.LensFacing}
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class LensFacingConverter {
 
     private LensFacingConverter() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java
index e8520da..4378e9f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java
@@ -21,6 +21,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.core.util.Preconditions;
@@ -47,6 +48,7 @@
  * @param <T> The data type used for
  *            {@link Observable.Observer#onNewData(Object)}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class LiveDataObservable<T> implements Observable<T> {
 
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MetadataHolderService.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MetadataHolderService.java
index d2fc5c4..a2ca5a2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MetadataHolderService.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MetadataHolderService.java
@@ -22,11 +22,13 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 /**
  * A placeholder service to avoid adding application-level metadata. The service is only used to
  * expose metadata defined in the library's manifest. It is never invoked.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class MetadataHolderService extends Service {
     @Nullable
     @Override
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MultiValueSet.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MultiValueSet.java
index d83bd3c..6776d2e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MultiValueSet.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MultiValueSet.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -29,6 +30,7 @@
  *
  * @param <C> The type of the parameter.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public abstract class MultiValueSet<C> {
 
     private Set<C> mSet = new HashSet<>();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableConfig.java
index 67b8936..107b439 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableConfig.java
@@ -18,12 +18,14 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 /**
  * MutableConfig is a {@link Config} that can be modified.
  *
  * <p>MutableConfig is the interface used to create immutable Config objects.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface MutableConfig extends Config {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableOptionsBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableOptionsBundle.java
index 6ff127e..f376a07 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableOptionsBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableOptionsBundle.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import java.util.Collections;
 import java.util.Map;
@@ -29,6 +30,7 @@
 /**
  * A MutableOptionsBundle is an {@link OptionsBundle} which allows for insertion/removal.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class MutableOptionsBundle extends OptionsBundle implements MutableConfig {
     @NonNull
     private static final OptionPriority DEFAULT_PRIORITY = OptionPriority.OPTIONAL;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableStateObservable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableStateObservable.java
index 90fa540..2931c781 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableStateObservable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableStateObservable.java
@@ -18,12 +18,14 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 /**
  * A {@link StateObservable} whose state can be set.
  *
  * @param <T> The state type.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class MutableStateObservable<T> extends StateObservable<T> {
 
     private MutableStateObservable(@Nullable Object initialState, boolean isError) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableTagBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableTagBundle.java
index 342060a..8fc5d48 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableTagBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableTagBundle.java
@@ -19,12 +19,14 @@
 import android.util.ArrayMap;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import java.util.Map;
 
 /**
  * A mutable {@link TagBundle} which allows insertion/removal.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class MutableTagBundle extends TagBundle {
 
     private MutableTagBundle(Map<String, Object> source) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/Observable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/Observable.java
index 4491d48..40fa94c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/Observable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/Observable.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -28,6 +29,7 @@
  *
  * @param <T> The type of the data in the stream.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface Observable<T> {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/OptionsBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/OptionsBundle.java
index ceb9f8a..cc36b52 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/OptionsBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/OptionsBundle.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import java.util.Collections;
 import java.util.Comparator;
@@ -33,6 +34,7 @@
  * <p>OptionsBundle is a collection of {@link Config.Option}s and their values which can be
  * queried based on exact {@link Config.Option} objects or based on Option ids.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class OptionsBundle implements Config {
     protected static final Comparator<Option<?>> ID_COMPARE =
             (o1, o2) -> {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/OutputSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/OutputSurface.java
index 4d633f9..609342c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/OutputSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/OutputSurface.java
@@ -20,12 +20,14 @@
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import com.google.auto.value.AutoValue;
 
 /**
  * A class wrapping output surface information for initializing {@link SessionProcessor}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class OutputSurface {
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/PreviewConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/PreviewConfig.java
index de4e98c1..146c52a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/PreviewConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/PreviewConfig.java
@@ -18,12 +18,14 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Preview;
 import androidx.camera.core.internal.ThreadConfig;
 
 /**
  * Configuration for a {@link Preview} use case.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class PreviewConfig
         implements UseCaseConfig<Preview>,
         ImageOutputConfig,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirk.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirk.java
index 48a8fd2..eb282da 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirk.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.core.impl;
 
+import androidx.annotation.RequiresApi;
+
 /**
  * Defines an inconsistency, a limitation, or any behavior that deviates from the standard behavior.
  *
@@ -25,5 +27,6 @@
  *
  * @see Quirks
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface Quirk {
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirks.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirks.java
index 5e3871f..5887e59b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirks.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirks.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -26,6 +27,7 @@
  * Wraps a list of {@link Quirk}s, allowing to easily retrieve a {@link Quirk} instance by its
  * class.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class Quirks {
 
     @NonNull
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ReadableConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ReadableConfig.java
index 52bdee6..b533694 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ReadableConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ReadableConfig.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import java.util.Set;
 
@@ -27,6 +28,7 @@
  * <p>ReadableConfig objects are also {@link Config} objects, so can be passed to any method that
  * expects a {@link Config}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ReadableConfig extends Config {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/RequestProcessor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/RequestProcessor.java
index 9fdbcbf..ef6c237 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/RequestProcessor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/RequestProcessor.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import java.util.List;
 
@@ -29,6 +30,7 @@
  *
  * <p>The images to be fetched is managed inside {@link SessionProcessor}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface RequestProcessor {
     /**
      * Submit a request.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionConfig.java
index fb02c44..b599e5b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionConfig.java
@@ -23,6 +23,7 @@
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 import androidx.camera.core.internal.compat.workaround.SurfaceSorter;
 
@@ -41,6 +42,7 @@
  * required to initialize a {@link android.hardware.camera2.CameraCaptureSession} and issue a {@link
  * CaptureRequest}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class SessionConfig {
 
     /** The set of {@link Surface} that data from the camera will be put into. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessor.java
index 6bbf57c..99f8a46 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessor.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraInfo;
 
 /**
@@ -37,6 +38,7 @@
  * <p>The SessionProcessor is expected to release all intermediate {@link ImageReader}s when
  * {@link #deInitSession()} is called.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface SessionProcessor {
     /**
      * Initializes the session and returns a transformed {@link SessionConfig} which should be
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessorSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessorSurface.java
index e3617b1..68d23ed 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessorSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessorSurface.java
@@ -19,6 +19,7 @@
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.utils.futures.Futures;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -30,6 +31,7 @@
  * <p>It is similar as {@link ImmediateSurface} but contains output config Id that can be used to
  * query the surface the id associates with.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class SessionProcessorSurface extends DeferrableSurface {
     private final Surface mSurface;
     private final int mOutputConfigId;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SingleImageProxyBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SingleImageProxyBundle.java
index 829c73b..292b79b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SingleImageProxyBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SingleImageProxyBundle.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageInfo;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.impl.utils.futures.Futures;
@@ -29,6 +30,7 @@
 /**
  * An {@link ImageProxyBundle} that contains a single {@link ImageProxy}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class SingleImageProxyBundle implements ImageProxyBundle {
     private final int mCaptureId;
     private final ImageProxy mImageProxy;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/StateObservable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/StateObservable.java
index ed3ab43..8505c92 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/StateObservable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/StateObservable.java
@@ -19,6 +19,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.core.util.Preconditions;
 
@@ -55,6 +56,7 @@
  *
  * @param <T> The state type.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public abstract class StateObservable<T> implements Observable<T> {
     private static final int INITIAL_VERSION = 0;
 
@@ -180,6 +182,7 @@
         }
     }
 
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     private static final class ObserverWrapper<T> implements Runnable {
         private static final Object NOT_SET = new Object();
         private static final int NO_VERSION = -1;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceCombination.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceCombination.java
index 7afe835..43ada23 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceCombination.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceCombination.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -29,6 +30,7 @@
  * of surface configuration type and size pairs can be supported for different hardware level camera
  * devices. This structure is used to store a list of surface configuration as a combination.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class SurfaceCombination {
 
     private final List<SurfaceConfig> mSurfaceConfigList = new ArrayList<>();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceConfig.java
index 7a1d3b0..1428065 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceConfig.java
@@ -20,6 +20,7 @@
 import android.os.Handler;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import com.google.auto.value.AutoValue;
 
@@ -33,6 +34,7 @@
  * of surface configuration type and size pairs can be supported for different hardware level camera
  * devices.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class SurfaceConfig {
     /** Prevent subclassing */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceSizeDefinition.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceSizeDefinition.java
index bbb89bd..7c6f9ea 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceSizeDefinition.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceSizeDefinition.java
@@ -18,6 +18,8 @@
 
 import android.util.Size;
 
+import androidx.annotation.RequiresApi;
+
 import com.google.auto.value.AutoValue;
 
 /**
@@ -27,6 +29,7 @@
  * guaranteed stream combinations for different hardware level devices.
  */
 @SuppressWarnings("AutoValueImmutableFields")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class SurfaceSizeDefinition {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/TagBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/TagBundle.java
index 30851f0..ae4ae00 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/TagBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/TagBundle.java
@@ -21,6 +21,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import java.util.Map;
 import java.util.Set;
@@ -28,6 +29,7 @@
 /**
  * A TagBundle is an immutable tags collection which does not allow insertion/removal.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class TagBundle {
     /** It is used to store all the keys and Tags */
     protected final Map<String, Object> mTagMap;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseAttachState.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseAttachState.java
index 30bc983..f284b5c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseAttachState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseAttachState.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 
 import java.util.ArrayList;
@@ -34,7 +35,7 @@
  * the camera capture, but not currently capturing. Active means the use case is either currently
  * issuing a capture request or one has already been issued.
  */
-
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class UseCaseAttachState {
     private static final String TAG = "UseCaseAttachState";
     /** The name of the camera the use cases are attached to. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
index 680d3f8..70bdbc4 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.ExtendableBuilder;
 import androidx.camera.core.UseCase;
@@ -29,6 +30,7 @@
  *
  * @param <T> The use case being configured.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface UseCaseConfig<T extends UseCase> extends TargetConfig<T>, UseCaseEventConfig,
         ImageInputConfig {
     // Option Declarations:
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfigFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfigFactory.java
index ea5df64..a66b306 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfigFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfigFactory.java
@@ -20,11 +20,13 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.InitializationException;
 
 /**
  * A Repository for generating use case configurations.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface UseCaseConfigFactory {
 
     enum CaptureType {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/VideoCaptureConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/VideoCaptureConfig.java
index 42dce8b..883d8c3 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/VideoCaptureConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/VideoCaptureConfig.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.VideoCapture;
 import androidx.camera.core.internal.ThreadConfig;
 
@@ -25,6 +26,7 @@
  *
  * <p>In the earlier stage, the VideoCapture is deprioritized.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class VideoCaptureConfig
         implements UseCaseConfig<VideoCapture>,
         ImageOutputConfig,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Absent.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Absent.java
index f64adc4..dbdabbc 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Absent.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Absent.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl.utils;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.util.Preconditions;
 import androidx.core.util.Supplier;
 
@@ -25,6 +26,7 @@
  *
  * <p>Copied and adapted from Guava.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class Absent<T> extends Optional<T> {
     static final Absent<Object> sInstance = new Absent<>();
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataInputStream.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataInputStream.java
index 318761b..c1294e5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataInputStream.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataInputStream.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.core.impl.utils;
 
+import androidx.annotation.RequiresApi;
+
 import java.io.ByteArrayInputStream;
 import java.io.DataInput;
 import java.io.DataInputStream;
@@ -29,6 +31,7 @@
  * order.
  */
 // Note: This class is adapted from {@link androidx.exifinterface.media.ExifInterface}
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class ByteOrderedDataInputStream extends InputStream implements DataInput {
     private static final ByteOrder LITTLE_ENDIAN = ByteOrder.LITTLE_ENDIAN;
     private static final ByteOrder BIG_ENDIAN = ByteOrder.BIG_ENDIAN;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataOutputStream.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataOutputStream.java
index 5f830f8..3b49af3 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataOutputStream.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataOutputStream.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.core.impl.utils;
 
+import androidx.annotation.RequiresApi;
+
 import java.io.FilterOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -26,6 +28,7 @@
  * order.
  */
 // Note: This class is adapted from {@link androidx.exifinterface.media.ExifInterface}
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class ByteOrderedDataOutputStream extends FilterOutputStream {
     final OutputStream mOutputStream;
     private ByteOrder mByteOrder;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java
index cc39e50..4ead922 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java
@@ -18,12 +18,14 @@
 
 import android.view.Surface;
 
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 import androidx.camera.core.impl.ImageOutputConfig.RotationValue;
 
 /**
  * Contains utility methods related to camera orientation.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraOrientationUtil {
     private static final String TAG = "CameraOrientationUtil";
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CloseGuardHelper.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CloseGuardHelper.java
index 89e1983..051c5e0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CloseGuardHelper.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CloseGuardHelper.java
@@ -28,6 +28,7 @@
  *
  * <p>All operations will be no-ops on non-supported API levels.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CloseGuardHelper {
 
     private final CloseGuardImpl mImpl;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java
index a75d1a9..13bb51e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java
@@ -28,6 +28,7 @@
 /**
  * Utility class for {@link Context} related operations.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ContextUtil {
     /**
      * Gets the application context and preserves the attribution tag.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Exif.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Exif.java
index ac6a24b..315b3fc 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Exif.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Exif.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.Logger;
 import androidx.exifinterface.media.ExifInterface;
@@ -42,6 +43,7 @@
  *
  * <p>Call {@link #save()} to persist changes to disc.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class Exif {
 
     /** Timestamp value indicating a timestamp value that is either not set or not valid */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifAttribute.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifAttribute.java
index 02a1d39..86442e9 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifAttribute.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifAttribute.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 
 import java.io.IOException;
@@ -31,6 +32,7 @@
  *
  * This class was pulled from the {@link androidx.exifinterface.media.ExifInterface} class.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class ExifAttribute {
     private static final String TAG = "ExifAttribute";
     public static final long BYTES_OFFSET_UNKNOWN = -1;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifData.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifData.java
index ea5d08a..e347233 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifData.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifData.java
@@ -115,6 +115,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 import androidx.camera.core.impl.CameraCaptureMetaData;
 import androidx.core.util.Preconditions;
@@ -141,6 +142,7 @@
 // types besides JPEG have been removed. Support for thumbnails/strips has been removed along
 // with many exif tags. If more tags are required, the source code for ExifInterface should be
 // referenced and can be adapted to this class.
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class ExifData {
     private static final String TAG = "ExifData";
     private static final boolean DEBUG = false;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifOutputStream.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifOutputStream.java
index a2594fd..319a175 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifOutputStream.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifOutputStream.java
@@ -26,6 +26,7 @@
 import static androidx.camera.core.impl.utils.ExifData.IFD_TYPE_PRIMARY;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 import androidx.core.util.Preconditions;
 
@@ -68,6 +69,7 @@
  * }
  * </pre>
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ExifOutputStream extends FilterOutputStream {
     private static final String TAG = "ExifOutputStream";
     private static final boolean DEBUG = false;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifTag.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifTag.java
index c0df33b..c760f54 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifTag.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifTag.java
@@ -24,6 +24,7 @@
 import static androidx.camera.core.impl.utils.ExifAttribute.IFD_FORMAT_UNDEFINED;
 import static androidx.camera.core.impl.utils.ExifAttribute.IFD_FORMAT_USHORT;
 
+import androidx.annotation.RequiresApi;
 import androidx.exifinterface.media.ExifInterface;
 
 /**
@@ -34,6 +35,7 @@
  *
  * @see ExifInterface
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class ExifTag {
     public final int number;
     public final String name;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/LongRational.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/LongRational.java
index 3b6353d..1b83064 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/LongRational.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/LongRational.java
@@ -17,11 +17,13 @@
 package androidx.camera.core.impl.utils;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 /**
  * The rational data type of EXIF tag. Contains a pair of longs representing the
  * numerator and denominator of a Rational number.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class LongRational {
 
     private final long mNumerator;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MainThreadAsyncHandler.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MainThreadAsyncHandler.java
index f90cdc0..7b13ef9 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MainThreadAsyncHandler.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MainThreadAsyncHandler.java
@@ -19,12 +19,14 @@
 import android.os.Handler;
 import android.os.Looper;
 
+import androidx.annotation.RequiresApi;
 import androidx.core.os.HandlerCompat;
 
 /**
  * Singleton instance of an async main thread {@link Handler}.
  * @see HandlerCompat#createAsync(Looper)
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class MainThreadAsyncHandler {
     private static volatile Handler sHandler;
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Optional.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Optional.java
index fd8fc4f..2d23f95 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Optional.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Optional.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl.utils;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.util.Preconditions;
 import androidx.core.util.Supplier;
 
@@ -68,6 +69,7 @@
  *            this type, so it is safe to cast an {@code Optional<T>} to {@code Optional<S>} for any
  *            supertype {@code S} of {@code T}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public abstract class Optional<T> implements Serializable {
     /**
      * Returns an {@code Optional} instance with no contained reference.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Present.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Present.java
index 1132fec..6714f16 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Present.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Present.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl.utils;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.util.Preconditions;
 import androidx.core.util.Supplier;
 
@@ -25,6 +26,7 @@
  *
  * <p>Copied and adapted from Guava.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class Present<T> extends Optional<T> {
     private final T mReference;
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Threads.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Threads.java
index 50bd09b..2846661 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Threads.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Threads.java
@@ -18,11 +18,13 @@
 
 import android.os.Looper;
 
+import androidx.annotation.RequiresApi;
 import androidx.core.util.Preconditions;
 
 /**
  * Helpers for {@link Thread}s.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class Threads {
 
     // Prevent instantiation.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/CameraXExecutors.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/CameraXExecutors.java
index 943b67d..4d6d86d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/CameraXExecutors.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/CameraXExecutors.java
@@ -20,6 +20,7 @@
 import android.os.Looper;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledExecutorService;
@@ -27,6 +28,7 @@
 /**
  * Utility class for generating specific implementations of {@link Executor}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraXExecutors {
 
     // Should not be instantiated
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/DirectExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/DirectExecutor.java
index 97d2d10..776239c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/DirectExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/DirectExecutor.java
@@ -16,12 +16,15 @@
 
 package androidx.camera.core.impl.utils.executor;
 
+import androidx.annotation.RequiresApi;
+
 import java.util.concurrent.Executor;
 
 /**
  * An {@link Executor} that runs each task in the thread that invokes {@link Executor#execute
  * execute}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class DirectExecutor implements Executor {
     private static volatile DirectExecutor sDirectExecutor;
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HandlerScheduledExecutorService.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HandlerScheduledExecutorService.java
index 8644b6a..541fe35 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HandlerScheduledExecutorService.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HandlerScheduledExecutorService.java
@@ -21,6 +21,7 @@
 import android.os.SystemClock;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 
@@ -45,6 +46,7 @@
  *
  * <p>Currently, can only be used to schedule future non-repeating tasks.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class HandlerScheduledExecutorService extends AbstractExecutorService implements
         ScheduledExecutorService {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HighPriorityExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HighPriorityExecutor.java
index ea835b9..04351c9 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HighPriorityExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HighPriorityExecutor.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl.utils.executor;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraXThreads;
 
 import java.util.concurrent.Executor;
@@ -27,6 +28,7 @@
 /**
  * A singleton executor used for non-blocking tasks.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class HighPriorityExecutor implements Executor {
     private static volatile Executor sExecutor;
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/IoExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/IoExecutor.java
index ad6d4dd..8e2ef48 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/IoExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/IoExecutor.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl.utils.executor;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraXThreads;
 
 import java.util.Locale;
@@ -29,6 +30,7 @@
 /**
  * A singleton executor which should be used for I/O tasks.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 // TODO(b/115779693): Make this executor configurable
 final class IoExecutor implements Executor {
     private static volatile Executor sExecutor;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/MainThreadExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/MainThreadExecutor.java
index 977c9d9..9a981fc 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/MainThreadExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/MainThreadExecutor.java
@@ -19,6 +19,8 @@
 import android.os.Handler;
 import android.os.Looper;
 
+import androidx.annotation.RequiresApi;
+
 import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -29,6 +31,7 @@
  * <p>Since {@link ScheduledExecutorService} implements {@link Executor}, this can also be used
  * as a simple Executor.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class MainThreadExecutor {
     private static volatile ScheduledExecutorService sInstance;
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/SequentialExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/SequentialExecutor.java
index 9d99a82..33390ae 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/SequentialExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/SequentialExecutor.java
@@ -22,6 +22,7 @@
 import static androidx.camera.core.impl.utils.executor.SequentialExecutor.WorkerRunningState.RUNNING;
 
 import androidx.annotation.GuardedBy;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 import androidx.core.util.Preconditions;
 
@@ -46,6 +47,7 @@
  *
  * <p>Copied and adapted from Guava.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class SequentialExecutor implements Executor {
     private static final String TAG = "SequentialExecutor";
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/AsyncFunction.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/AsyncFunction.java
index 1ffb5e7..039dade 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/AsyncFunction.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/AsyncFunction.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl.utils.futures;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -36,6 +37,7 @@
  * @param <O>
  */
 @FunctionalInterface
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface AsyncFunction<I, O> {
     /**
      * Returns an output {@code Future} to use in place of the given {@code input}. The output
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ChainingListenableFuture.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ChainingListenableFuture.java
index ff36dcd..df12799 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ChainingListenableFuture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ChainingListenableFuture.java
@@ -23,6 +23,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -50,6 +51,7 @@
  * in a {@code UndeclaredThrowableException} so that this class can get access to the cause.
  *
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class ChainingListenableFuture<I, O> extends FutureChain<O> implements Runnable {
     @Nullable
     private AsyncFunction<? super I, ? extends O> mFunction;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureCallback.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureCallback.java
index 681271f..3c30e57 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureCallback.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureCallback.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.impl.utils.futures;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -36,6 +37,7 @@
  * @since 10.0
  * @param <V>
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface FutureCallback<V> {
     /** Invoked with the result of the {@code Future} computation when it is successful. */
     void onSuccess(@Nullable V result);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureChain.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureChain.java
index 6cf3de9..19e1cfb 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureChain.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureChain.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.arch.core.util.Function;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.core.util.Preconditions;
@@ -42,6 +43,7 @@
  *  }</pre>
  *  @param <V>
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class FutureChain<V> implements ListenableFuture<V> {
     @NonNull
     private final ListenableFuture<V> mDelegate;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java
index f2e0299..f277485 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.arch.core.util.Function;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -39,6 +40,7 @@
 /**
  * Utility class for generating specific implementations of {@link ListenableFuture}.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class Futures {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ImmediateFuture.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ImmediateFuture.java
index 6ce54d0..3871479 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ImmediateFuture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ImmediateFuture.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 import androidx.core.util.Preconditions;
 
@@ -35,6 +36,7 @@
  * <p>This implementation is based off of the Guava ImmediateSuccessfulFuture class.
  * @param <V> The type of the value stored in the future.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 abstract class ImmediateFuture<V> implements ListenableFuture<V> {
 
     private static final String TAG = "ImmediateFuture";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ListFuture.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ListFuture.java
index 45cb086..e86a202 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ListFuture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ListFuture.java
@@ -22,6 +22,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.core.util.Preconditions;
@@ -49,6 +50,7 @@
  * each component future to fill out the value in the List when that future
  * completes.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class ListFuture<V> implements ListenableFuture<List<V>> {
     @Nullable
     List<? extends ListenableFuture<? extends V>> mFutures;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java
index ea4f5a5..dd396b5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java
@@ -17,12 +17,14 @@
 package androidx.camera.core.internal;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageInfo;
 import androidx.camera.core.impl.CameraCaptureResult;
 import androidx.camera.core.impl.TagBundle;
 import androidx.camera.core.impl.utils.ExifData;
 
 /** An ImageInfo that is created by a {@link CameraCaptureResult}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraCaptureResultImageInfo implements ImageInfo {
     private final CameraCaptureResult mCameraCaptureResult;
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
index 445d919..060844a2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
@@ -24,6 +24,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.CameraInfo;
@@ -63,6 +64,7 @@
  * extensions in order to select the correct CameraInternal instance which has the required
  * camera id.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class CameraUseCaseAdapter implements Camera {
     @NonNull
     private CameraInternal mCameraInternal;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/ImmutableZoomState.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/ImmutableZoomState.java
index f62de7f..fd3fec5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/ImmutableZoomState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/ImmutableZoomState.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.internal;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ZoomState;
 
 import com.google.auto.value.AutoValue;
@@ -24,6 +25,7 @@
 /**
  * An implementation of {@link ZoomState} that is immutable.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class ImmutableZoomState implements ZoomState {
     /** Create an immutable instance of {@link ZoomState}. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/IoConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/IoConfig.java
index 7f283be..173f9f3 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/IoConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/IoConfig.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ReadableConfig;
 
 import java.util.concurrent.Executor;
@@ -25,6 +26,7 @@
 /**
  * Configuration containing IO related options.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface IoConfig extends ReadableConfig {
 
     // Option Declarations:
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/TargetConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/TargetConfig.java
index ad97e73..74bed52 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/TargetConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/TargetConfig.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.impl.ReadableConfig;
@@ -27,6 +28,7 @@
  *
  * @param <T> The type of the object being configured.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface TargetConfig<T> extends ReadableConfig {
 
     // Option Declarations:
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java
index e31c0f4..6435a03 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ReadableConfig;
 
 import java.util.concurrent.Executor;
@@ -25,6 +26,7 @@
 /**
  * Configuration containing options pertaining to threads used by the configured object.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface ThreadConfig extends ReadableConfig {
 
     // Option Declarations:
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseEventConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseEventConfig.java
index 729683e..3e8a1e5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseEventConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseEventConfig.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.impl.Config;
 import androidx.camera.core.impl.ReadableConfig;
@@ -25,6 +26,7 @@
 /**
  * Configuration containing options pertaining to EventCallback object.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface UseCaseEventConfig extends ReadableConfig {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/ViewPorts.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/ViewPorts.java
index 2a88ff6..8f39855 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/ViewPorts.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/ViewPorts.java
@@ -26,6 +26,7 @@
 
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.ViewPort;
 import androidx.camera.core.internal.utils.ImageUtil;
@@ -37,6 +38,7 @@
 /**
  * Utility methods for calculating viewports.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class ViewPorts {
     private ViewPorts() {
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirks.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirks.java
index fec5d94..db756d6b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirks.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirks.java
@@ -18,6 +18,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.Quirk;
 import androidx.camera.core.impl.Quirks;
 
@@ -30,6 +31,7 @@
  * <p>
  * Device specific quirks are lazily loaded, i.e. They are loaded the first time they're needed.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class DeviceQuirks {
 
     @NonNull
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
index aab22f8..79ddcbb 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.internal.compat.quirk;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.Quirk;
 
 import java.util.ArrayList;
@@ -25,6 +26,7 @@
 /**
  * Loads all device specific quirks required for the current device
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class DeviceQuirksLoader {
 
     private DeviceQuirksLoader() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java
index 4992f44..4713958 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java
@@ -19,6 +19,7 @@
 import android.os.Build;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.CaptureConfig;
 import androidx.camera.core.impl.Config;
 import androidx.camera.core.impl.Quirk;
@@ -35,6 +36,7 @@
  * calculate the rotation value according to the target rotation setting for the final output
  * image. See: b/171492111.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ImageCaptureRotationOptionQuirk implements Quirk {
 
     static boolean load() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/OnePixelShiftQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/OnePixelShiftQuirk.java
index 70adcc1..15d272a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/OnePixelShiftQuirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/OnePixelShiftQuirk.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.core.internal.compat.quirk;
 
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.Quirk;
 
 /**
@@ -24,5 +25,6 @@
  *
  * <p>Subclasses of this quirk may contain device specific information.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface OnePixelShiftQuirk extends Quirk {
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SoftwareJpegEncodingPreferredQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SoftwareJpegEncodingPreferredQuirk.java
index de15939..68573e0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SoftwareJpegEncodingPreferredQuirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SoftwareJpegEncodingPreferredQuirk.java
@@ -17,6 +17,7 @@
 package androidx.camera.core.internal.compat.quirk;
 
 
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.Quirk;
 
 /**
@@ -26,5 +27,6 @@
  * <p>Subclasses of this quirk may prefer CameraX produces JPEGs itself (likely from a YUV
  * format) for compatibility or performance reasons.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface SoftwareJpegEncodingPreferredQuirk extends Quirk {
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SurfaceOrderQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SurfaceOrderQuirk.java
index e9eb4e01..40c9770 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SurfaceOrderQuirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SurfaceOrderQuirk.java
@@ -18,6 +18,7 @@
 
 import android.os.Build;
 
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.Quirk;
 import androidx.camera.core.internal.compat.workaround.SurfaceSorter;
 
@@ -35,6 +36,7 @@
  *
  * @see SurfaceSorter
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class SurfaceOrderQuirk implements Quirk {
 
     private static final Set<String> BUILD_HARDWARE_SET = new HashSet<>(Arrays.asList(
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/ExifRotationAvailability.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/ExifRotationAvailability.java
index 8dae82b..dc2bebb 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/ExifRotationAvailability.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/ExifRotationAvailability.java
@@ -19,6 +19,7 @@
 import android.graphics.ImageFormat;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.impl.CaptureConfig;
 import androidx.camera.core.internal.compat.quirk.DeviceQuirks;
@@ -30,6 +31,7 @@
  *
  * @see ImageCaptureRotationOptionQuirk
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class ExifRotationAvailability {
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/SurfaceSorter.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/SurfaceSorter.java
index 55bc649..ff0324b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/SurfaceSorter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/SurfaceSorter.java
@@ -19,6 +19,7 @@
 import android.media.MediaCodec;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Preview;
 import androidx.camera.core.VideoCapture;
 import androidx.camera.core.impl.DeferrableSurface;
@@ -33,6 +34,7 @@
  *
  * @see SurfaceOrderQuirk
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class SurfaceSorter {
     // The larger priority value will be placed at the back of the list.
     private static final int PRIORITY_MEDIA_CODEC_SURFACE = 1;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java
index 59ec4f2..e6ebb17 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java
@@ -28,6 +28,7 @@
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.Logger;
 
@@ -38,6 +39,7 @@
 /**
  * Utility class for image related operations.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ImageUtil {
     private static final String TAG = "ImageUtil";
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/UseCaseConfigUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/UseCaseConfigUtil.java
index dc9e693..006db56e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/UseCaseConfigUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/UseCaseConfigUtil.java
@@ -20,6 +20,7 @@
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.ImageOutputConfig;
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.utils.CameraOrientationUtil;
@@ -27,6 +28,7 @@
 /**
  * Contains utility methods related to UseCaseConfig.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class UseCaseConfigUtil {
     private UseCaseConfigUtil() {}
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/VideoUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/VideoUtil.java
index 590b64b..71693e7 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/VideoUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/VideoUtil.java
@@ -23,12 +23,14 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 import androidx.core.util.Preconditions;
 
 /**
  * Utility class for video recording related operations.
  */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class VideoUtil {
     private static final String TAG = "VideoUtil";