diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 6dca398..3b02b86 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -1311,7 +1311,7 @@
     method public static androidx.core.graphics.Insets of(android.graphics.Rect);
     method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
     method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
-    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    method @RequiresApi(29) public android.graphics.Insets toPlatformInsets();
     field public static final androidx.core.graphics.Insets NONE;
     field public final int bottom;
     field public final int left;
@@ -1350,7 +1350,7 @@
     method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
     method public static void clearColorFilter(android.graphics.drawable.Drawable);
     method public static int getAlpha(android.graphics.drawable.Drawable);
-    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter? getColorFilter(android.graphics.drawable.Drawable);
     method public static int getLayoutDirection(android.graphics.drawable.Drawable);
     method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
     method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
@@ -1363,20 +1363,20 @@
     method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
     method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
     method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
   }
 
   public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
     method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
     method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.Context, @DrawableRes int);
     method @IdRes public int getResId();
     method public String getResPackage();
     method public int getType();
@@ -1384,9 +1384,9 @@
     method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
     method public void onPostParceling();
     method public void onPreParceling(boolean);
-    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
-    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
-    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public androidx.core.graphics.drawable.IconCompat setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat setTintList(android.content.res.ColorStateList?);
+    method public androidx.core.graphics.drawable.IconCompat setTintMode(android.graphics.PorterDuff.Mode?);
     method public android.os.Bundle toBundle();
     method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
     method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
diff --git a/core/core/api/public_plus_experimental_current.txt b/core/core/api/public_plus_experimental_current.txt
index 5dd917d..27c13a6 100644
--- a/core/core/api/public_plus_experimental_current.txt
+++ b/core/core/api/public_plus_experimental_current.txt
@@ -1311,7 +1311,7 @@
     method public static androidx.core.graphics.Insets of(android.graphics.Rect);
     method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
     method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
-    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    method @RequiresApi(29) public android.graphics.Insets toPlatformInsets();
     field public static final androidx.core.graphics.Insets NONE;
     field public final int bottom;
     field public final int left;
@@ -1350,7 +1350,7 @@
     method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
     method public static void clearColorFilter(android.graphics.drawable.Drawable);
     method public static int getAlpha(android.graphics.drawable.Drawable);
-    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter? getColorFilter(android.graphics.drawable.Drawable);
     method public static int getLayoutDirection(android.graphics.drawable.Drawable);
     method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
     method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
@@ -1363,20 +1363,20 @@
     method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
     method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
     method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
   }
 
   public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
     method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
     method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.Context, @DrawableRes int);
     method @IdRes public int getResId();
     method public String getResPackage();
     method public int getType();
@@ -1384,9 +1384,9 @@
     method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
     method public void onPostParceling();
     method public void onPreParceling(boolean);
-    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
-    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
-    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public androidx.core.graphics.drawable.IconCompat setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat setTintList(android.content.res.ColorStateList?);
+    method public androidx.core.graphics.drawable.IconCompat setTintMode(android.graphics.PorterDuff.Mode?);
     method public android.os.Bundle toBundle();
     method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
     method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 72c72f0..7322b0b2 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -1532,7 +1532,7 @@
     method public static androidx.core.graphics.Insets of(android.graphics.Rect);
     method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
     method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
-    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    method @RequiresApi(29) public android.graphics.Insets toPlatformInsets();
     method @Deprecated @RequiresApi(api=29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.Insets wrap(android.graphics.Insets);
     field public static final androidx.core.graphics.Insets NONE;
     field public final int bottom;
@@ -1604,12 +1604,12 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatUtil {
-    method public static void closeQuietly(java.io.Closeable!);
-    method @RequiresApi(19) public static java.nio.ByteBuffer? copyToDirectBuffer(android.content.Context!, android.content.res.Resources!, int);
-    method public static boolean copyToFile(java.io.File!, java.io.InputStream!);
-    method public static boolean copyToFile(java.io.File!, android.content.res.Resources!, int);
-    method public static java.io.File? getTempFile(android.content.Context!);
-    method @RequiresApi(19) public static java.nio.ByteBuffer? mmap(android.content.Context!, android.os.CancellationSignal!, android.net.Uri!);
+    method public static void closeQuietly(java.io.Closeable?);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? copyToDirectBuffer(android.content.Context, android.content.res.Resources, int);
+    method public static boolean copyToFile(java.io.File, java.io.InputStream);
+    method public static boolean copyToFile(java.io.File, android.content.res.Resources, int);
+    method public static java.io.File? getTempFile(android.content.Context);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? mmap(android.content.Context, android.os.CancellationSignal?, android.net.Uri);
   }
 
 }
@@ -1621,7 +1621,7 @@
     method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
     method public static void clearColorFilter(android.graphics.drawable.Drawable);
     method public static int getAlpha(android.graphics.drawable.Drawable);
-    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter? getColorFilter(android.graphics.drawable.Drawable);
     method public static int getLayoutDirection(android.graphics.drawable.Drawable);
     method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
     method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
@@ -1634,7 +1634,7 @@
     method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
     method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
     method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
   }
 
   @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true, ignoreParcelables=true, isCustom=true, jetifyAs="android.support.v4.graphics.drawable.IconCompat") public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
@@ -1644,15 +1644,15 @@
     method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
     method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.graphics.drawable.Icon);
     method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIconOrNullIfZeroResId(android.graphics.drawable.Icon);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.res.Resources!, String!, @DrawableRes int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.Context, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.res.Resources?, String, @DrawableRes int);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap? getBitmap();
     method @IdRes public int getResId();
     method public String getResPackage();
@@ -1660,9 +1660,9 @@
     method public android.net.Uri getUri();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.io.InputStream? getUriInputStream(android.content.Context);
     method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
-    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
-    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
-    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public androidx.core.graphics.drawable.IconCompat setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat setTintList(android.content.res.ColorStateList?);
+    method public androidx.core.graphics.drawable.IconCompat setTintMode(android.graphics.PorterDuff.Mode?);
     method public android.os.Bundle toBundle();
     method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
     method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
diff --git a/core/core/lint-baseline.xml b/core/core/lint-baseline.xml
index 79623f4..c1c27b8 100644
--- a/core/core/lint-baseline.xml
+++ b/core/core/lint-baseline.xml
@@ -3490,193 +3490,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
-        errorLine2="                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="92"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="92"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
-        errorLine2="                                                              ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="92"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    &quot;Color models must match (&quot; + foreground.getModel() + &quot; vs. &quot;"
-        errorLine2="                                                             ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="94"
-            column="62"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                            + background.getModel() + &quot;)&quot;);"
-        errorLine2="                                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="95"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
-        errorLine2="                          ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="98"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
-        errorLine2="                                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="98"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
-        errorLine2="                                                                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="98"
-            column="73"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                : foreground.convert(background.getColorSpace());"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="100"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                : foreground.convert(background.getColorSpace());"
-        errorLine2="                                                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="100"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        float[] src = s.getComponents();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="102"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        float[] dst = background.getComponents();"
-        errorLine2="                                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="103"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        float sa = s.alpha();"
-        errorLine2="                     ~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="105"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        float da = background.alpha() * (1.0f - sa);"
-        errorLine2="                              ~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="107"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        int ai = background.getComponentCount() - 1;"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="111"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return Color.valueOf(dst, background.getColorSpace());"
-        errorLine2="                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="127"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return Color.valueOf(dst, background.getColorSpace());"
-        errorLine2="                                             ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="127"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 24; however, the containing class androidx.core.os.ConfigurationCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return LocaleListCompat.wrap(configuration.getLocales());"
         errorLine2="                                                       ~~~~~~~~~~">
@@ -4282,204 +4095,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                icon = Icon.createWithBitmap((Bitmap) mObj1);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="546"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithAdaptiveBitmap((Bitmap) mObj1);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="550"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithBitmap("
-        errorLine2="                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="552"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                icon = Icon.createWithResource(getResPackage(), mInt1);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="557"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                icon = Icon.createWithData((byte[]) mObj1, mInt1, mInt2);"
-        errorLine2="                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="560"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                icon = Icon.createWithContentUri((String) mObj1);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="563"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithAdaptiveBitmapContentUri(getUri());"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="567"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithAdaptiveBitmap(BitmapFactory.decodeStream(is));"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="580"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithBitmap(createLegacyIconFromAdaptiveIcon("
-        errorLine2="                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="582"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            icon.setTintList(mTintList);"
-        errorLine2="                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="590"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            icon.setTintMode(mTintMode);"
-        errorLine2="                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="593"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return toIcon(context).loadDrawable(context);"
-        errorLine2="                                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="641"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        return new AdaptiveIconDrawable(null,"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="694"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return icon.getType();"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1101"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return icon.getResPackage();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1129"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return icon.getResId();"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1158"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return icon.getUri();"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1186"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.graphics.Insets is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return android.graphics.Insets.of(left, top, right, bottom);"
-        errorLine2="                                       ~~">
-        <location
-            file="src/main/java/androidx/core/graphics/Insets.java"
-            line="198"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 24; however, the containing class androidx.core.os.LocaleListCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return wrap(new LocaleList(localeList));"
         errorLine2="                        ~~~~~~~~~~~~~~">
@@ -7087,39 +6702,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.PaintCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return paint.hasGlyph(string);"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PaintCompat.java"
-            line="52"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.graphics.PaintCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            paint.setBlendMode(blendMode != null ? obtainBlendModeFromCompat(blendMode) : null);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PaintCompat.java"
-            line="127"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.PathUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        float[] pathData = path.approximate(error);"
-        errorLine2="                                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathUtils.java"
-            line="60"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setName(bundle.getString(NAME_KEY))"
         errorLine2="                                ~~~~~~~~~">
@@ -9507,17 +9089,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.TypefaceCompatUtil is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, &quot;r&quot;, cancellationSignal)) {"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="110"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 23; however, the containing class androidx.core.os.UserManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return context.getSystemService(UserManager.class).isUserUnlocked();"
         errorLine2="                           ~~~~~~~~~~~~~~~~">
diff --git a/core/core/src/main/java/androidx/core/graphics/ColorUtils.java b/core/core/src/main/java/androidx/core/graphics/ColorUtils.java
index 6c1e37f..a7afe56 100644
--- a/core/core/src/main/java/androidx/core/graphics/ColorUtils.java
+++ b/core/core/src/main/java/androidx/core/graphics/ColorUtils.java
@@ -20,6 +20,7 @@
 import android.graphics.Color;
 
 import androidx.annotation.ColorInt;
+import androidx.annotation.DoNotInline;
 import androidx.annotation.FloatRange;
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
@@ -89,42 +90,54 @@
     @RequiresApi(26)
     @NonNull
     public static Color compositeColors(@NonNull Color foreground, @NonNull Color background) {
-        if (!Objects.equals(foreground.getModel(), background.getModel())) {
-            throw new IllegalArgumentException(
-                    "Color models must match (" + foreground.getModel() + " vs. "
-                            + background.getModel() + ")");
+        return Api26Impl.compositeColors(foreground, background);
+    }
+
+    @RequiresApi(26)
+    static class Api26Impl {
+        private Api26Impl() {
+            // This class is not instantiable.
         }
 
-        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())
-                ? foreground
-                : foreground.convert(background.getColorSpace());
+        @DoNotInline
+        static Color compositeColors(Color foreground, Color background) {
+            if (!Objects.equals(foreground.getModel(), background.getModel())) {
+                throw new IllegalArgumentException(
+                        "Color models must match (" + foreground.getModel() + " vs. "
+                                + background.getModel() + ")");
+            }
 
-        float[] src = s.getComponents();
-        float[] dst = background.getComponents();
+            Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())
+                    ? foreground
+                    : foreground.convert(background.getColorSpace());
 
-        float sa = s.alpha();
-        // Destination alpha pre-composited
-        float da = background.alpha() * (1.0f - sa);
+            float[] src = s.getComponents();
+            float[] dst = background.getComponents();
 
-        // Index of the alpha component
-        @SuppressLint("Range") // TODO Remove after upgrading Android Gradle Plugin to 3.1 or newer.
-        int ai = background.getComponentCount() - 1;
+            float sa = s.alpha();
+            // Destination alpha pre-composited
+            float da = background.alpha() * (1.0f - sa);
 
-        // Final alpha: src_alpha + dst_alpha * (1 - src_alpha)
-        dst[ai] = sa + da;
+            // Index of the alpha component
+            @SuppressLint("Range") // TODO Remove after upgrading AGP to 3.1 or newer.
+            int ai = background.getComponentCount() - 1;
 
-        // Divide by final alpha to return non pre-multiplied color
-        if (dst[ai] > 0) {
-            sa /= dst[ai];
-            da /= dst[ai];
+            // Final alpha: src_alpha + dst_alpha * (1 - src_alpha)
+            dst[ai] = sa + da;
+
+            // Divide by final alpha to return non pre-multiplied color
+            if (dst[ai] > 0) {
+                sa /= dst[ai];
+                da /= dst[ai];
+            }
+
+            // Composite non-alpha components
+            for (int i = 0; i < ai; i++) {
+                dst[i] = src[i] * sa + dst[i] * da;
+            }
+
+            return Color.valueOf(dst, background.getColorSpace());
         }
-
-        // Composite non-alpha components
-        for (int i = 0; i < ai; i++) {
-            dst[i] = src[i] * sa + dst[i] * da;
-        }
-
-        return Color.valueOf(dst, background.getColorSpace());
     }
 
     private static int compositeAlpha(int foregroundAlpha, int backgroundAlpha) {
@@ -575,18 +588,21 @@
     /**
      * Returns the euclidean distance between two LAB colors.
      */
+    @SuppressWarnings("unused")
     public static double distanceEuclidean(@NonNull double[] labX, @NonNull double[] labY) {
         return Math.sqrt(Math.pow(labX[0] - labY[0], 2)
                 + Math.pow(labX[1] - labY[1], 2)
                 + Math.pow(labX[2] - labY[2], 2));
     }
 
+    @SuppressWarnings("SameParameterValue")
     private static float constrain(float amount, float low, float high) {
-        return amount < low ? low : (amount > high ? high : amount);
+        return amount < low ? low : Math.min(amount, high);
     }
 
+    @SuppressWarnings("SameParameterValue")
     private static int constrain(int amount, int low, int high) {
-        return amount < low ? low : (amount > high ? high : amount);
+        return amount < low ? low : Math.min(amount, high);
     }
 
     private static double pivotXyzComponent(double component) {
@@ -605,6 +621,7 @@
      * @param color2 the second ARGB color
      * @param ratio  the blend ratio of {@code color1} to {@code color2}
      */
+    @SuppressWarnings("unused")
     @ColorInt
     public static int blendARGB(@ColorInt int color1, @ColorInt int color2,
             @FloatRange(from = 0.0, to = 1.0) float ratio) {
@@ -628,6 +645,7 @@
      * @param ratio     the blend ratio of {@code hsl1} to {@code hsl2}
      * @param outResult 3-element array which holds the resulting HSL components
      */
+    @SuppressWarnings("unused")
     public static void blendHSL(@NonNull float[] hsl1, @NonNull float[] hsl2,
             @FloatRange(from = 0.0, to = 1.0) float ratio, @NonNull float[] outResult) {
         if (outResult.length != 3) {
@@ -651,6 +669,7 @@
      * @param ratio     the blend ratio of {@code lab1} to {@code lab2}
      * @param outResult 3-element array which holds the resulting LAB components
      */
+    @SuppressWarnings("unused")
     public static void blendLAB(@NonNull double[] lab1, @NonNull double[] lab2,
             @FloatRange(from = 0.0, to = 1.0) double ratio, @NonNull double[] outResult) {
         if (outResult.length != 3) {
diff --git a/core/core/src/main/java/androidx/core/graphics/Insets.java b/core/core/src/main/java/androidx/core/graphics/Insets.java
index b718179..3387d00 100644
--- a/core/core/src/main/java/androidx/core/graphics/Insets.java
+++ b/core/core/src/main/java/androidx/core/graphics/Insets.java
@@ -20,6 +20,7 @@
 
 import android.graphics.Rect;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
@@ -96,6 +97,7 @@
      * @param b The subtrahend; the value which will be subtracted from {@code a}.
      * @return a - b, i. e. all insets on every side are subtracted from each other.
      */
+    @SuppressWarnings("unused")
     @NonNull
     public static Insets subtract(@NonNull Insets a, @NonNull Insets b) {
         return Insets.of(a.left - b.left, a.top - b.top, a.right - b.right, a.bottom - b.bottom);
@@ -136,6 +138,7 @@
      * @param o the object to compare this instance with.
      * @return true iff this object is equal {@code o}
      */
+    @SuppressWarnings("RedundantIfStatement")
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -160,6 +163,7 @@
         return result;
     }
 
+    @NonNull
     @Override
     public String toString() {
         return "Insets{left=" + left + ", top=" + top
@@ -192,9 +196,21 @@
      * Return a copy this instance, converted to be an {@link android.graphics.Insets} instance
      * from the platform.
      */
-    @RequiresApi(api = 29)
+    @RequiresApi(29)
     @NonNull
     public android.graphics.Insets toPlatformInsets() {
-        return android.graphics.Insets.of(left, top, right, bottom);
+        return Api29Impl.of(left, top, right, bottom);
+    }
+
+    @RequiresApi(29)
+    static class Api29Impl {
+        private Api29Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static android.graphics.Insets of(int left, int top, int right, int bottom) {
+            return android.graphics.Insets.of(left, top, right, bottom);
+        }
     }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/PaintCompat.java b/core/core/src/main/java/androidx/core/graphics/PaintCompat.java
index 61673fe..73862de 100644
--- a/core/core/src/main/java/androidx/core/graphics/PaintCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/PaintCompat.java
@@ -19,14 +19,17 @@
 import static androidx.core.graphics.BlendModeUtils.obtainBlendModeFromCompat;
 import static androidx.core.graphics.BlendModeUtils.obtainPorterDuffFromCompat;
 
+import android.graphics.BlendMode;
 import android.graphics.Paint;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffXfermode;
 import android.graphics.Rect;
 import android.os.Build;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.util.Pair;
 
 /**
@@ -49,7 +52,7 @@
      */
     public static boolean hasGlyph(@NonNull Paint paint, @NonNull String string) {
         if (Build.VERSION.SDK_INT >= 23) {
-            return paint.hasGlyph(string);
+            return Api23Impl.hasGlyph(paint, string);
         }
         final int length = string.length();
 
@@ -124,7 +127,8 @@
      */
     public static boolean setBlendMode(@NonNull Paint paint, @Nullable BlendModeCompat blendMode) {
         if (Build.VERSION.SDK_INT >= 29) {
-            paint.setBlendMode(blendMode != null ? obtainBlendModeFromCompat(blendMode) : null);
+            Api29Impl.setBlendMode(paint,
+                    blendMode != null ? obtainBlendModeFromCompat(blendMode) : null);
             // All blend modes supported in Q
             return true;
         } else if (blendMode != null) {
@@ -153,5 +157,30 @@
         return rects;
     }
 
-    private PaintCompat() {}
+    private PaintCompat() {
+    }
+
+    @RequiresApi(23)
+    static class Api23Impl {
+        private Api23Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static boolean hasGlyph(Paint paint, String string) {
+            return paint.hasGlyph(string);
+        }
+    }
+
+    @RequiresApi(29)
+    static class Api29Impl {
+        private Api29Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static void setBlendMode(Paint paint, BlendMode blendmode) {
+            paint.setBlendMode(blendmode);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/PathUtils.java b/core/core/src/main/java/androidx/core/graphics/PathUtils.java
index 65e49f6..8c88875 100644
--- a/core/core/src/main/java/androidx/core/graphics/PathUtils.java
+++ b/core/core/src/main/java/androidx/core/graphics/PathUtils.java
@@ -19,6 +19,7 @@
 import android.graphics.Path;
 import android.graphics.PointF;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.FloatRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
@@ -57,7 +58,7 @@
     @NonNull
     public static Collection<PathSegment> flatten(@NonNull final Path path,
             @FloatRange(from = 0) final float error) {
-        float[] pathData = path.approximate(error);
+        float[] pathData = Api26Impl.approximate(path, error);
         int pointCount = pathData.length / 3;
         List<PathSegment> segments = new ArrayList<>(pointCount);
         for (int i = 1; i < pointCount; i++) {
@@ -81,4 +82,16 @@
 
     private PathUtils() {
     }
+
+    @RequiresApi(26)
+    static class Api26Impl {
+        private Api26Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static float[] approximate(Path path, float acceptableError) {
+            return path.approximate(acceptableError);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java b/core/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java
index 1f02d66..85c9e3c 100644
--- a/core/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java
+++ b/core/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java
@@ -29,6 +29,7 @@
 import android.os.StrictMode;
 import android.util.Log;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
@@ -38,6 +39,7 @@
 import java.io.Closeable;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -65,7 +67,7 @@
      * Returns null if failed to create temp file.
      */
     @Nullable
-    public static File getTempFile(Context context) {
+    public static File getTempFile(@NonNull Context context) {
         File cacheDir = context.getCacheDir();
         if (cacheDir == null) {
             return null;
@@ -105,9 +107,11 @@
      */
     @Nullable
     @RequiresApi(19)
-    public static ByteBuffer mmap(Context context, CancellationSignal cancellationSignal, Uri uri) {
+    public static ByteBuffer mmap(@NonNull Context context,
+            @Nullable CancellationSignal cancellationSignal, @NonNull Uri uri) {
         final ContentResolver resolver = context.getContentResolver();
-        try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r", cancellationSignal)) {
+        try (ParcelFileDescriptor pfd = Api19Impl.openFileDescriptor(resolver, uri, "r",
+                cancellationSignal)) {
             if (pfd == null) {
                 return null;
             }
@@ -124,9 +128,11 @@
     /**
      * Copy the resource contents to the direct byte buffer.
      */
+    @SuppressWarnings("ResultOfMethodCallIgnored")
     @Nullable
     @RequiresApi(19)
-    public static ByteBuffer copyToDirectBuffer(Context context, Resources res, int id) {
+    public static ByteBuffer copyToDirectBuffer(@NonNull Context context, @NonNull Resources res,
+            int id) {
         File tmpFile = getTempFile(context);
         if (tmpFile == null) {
             return null;
@@ -144,7 +150,7 @@
     /**
      * Copy the input stream contents to file.
      */
-    public static boolean copyToFile(File file, InputStream is) {
+    public static boolean copyToFile(@NonNull File file, @NonNull InputStream is) {
         FileOutputStream os = null;
         StrictMode.ThreadPolicy old = StrictMode.allowThreadDiskWrites();
         try {
@@ -167,7 +173,8 @@
     /**
      * Copy the resource contents to file.
      */
-    public static boolean copyToFile(File file, Resources res, int id) {
+    @SuppressWarnings("BooleanMethodIsAlwaysInverted")
+    public static boolean copyToFile(@NonNull File file, @NonNull Resources res, int id) {
         InputStream is = null;
         try {
             is = res.openRawResource(id);
@@ -177,11 +184,17 @@
         }
     }
 
-    public static void closeQuietly(Closeable c) {
+    /**
+     * Attempts to close a Closeable, swallowing any resulting IOException.
+     *
+     * @param c the closeable to close
+     */
+    public static void closeQuietly(@Nullable Closeable c) {
         if (c != null) {
             try {
                 c.close();
             } catch (IOException e) {
+                // Quietly!
             }
         }
     }
@@ -222,4 +235,18 @@
         }
         return Collections.unmodifiableMap(out);
     }
+
+    @RequiresApi(19)
+    static class Api19Impl {
+        private Api19Impl() {
+            // This class is not instantiable.
+        }
+
+        @SuppressWarnings("SameParameterValue")
+        @DoNotInline
+        static ParcelFileDescriptor openFileDescriptor(ContentResolver contentResolver, Uri uri,
+                String mode, CancellationSignal cancellationSignal) throws FileNotFoundException {
+            return contentResolver.openFileDescriptor(uri, mode, cancellationSignal);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java b/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java
index d81ba22..8e96af8 100644
--- a/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java
@@ -28,8 +28,10 @@
 import android.util.Log;
 
 import androidx.annotation.ColorInt;
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.view.ViewCompat;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -76,7 +78,7 @@
      */
     public static void setAutoMirrored(@NonNull Drawable drawable, boolean mirrored) {
         if (Build.VERSION.SDK_INT >= 19) {
-            drawable.setAutoMirrored(mirrored);
+            Api19Impl.setAutoMirrored(drawable, mirrored);
         }
     }
 
@@ -93,7 +95,7 @@
      */
     public static boolean isAutoMirrored(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 19) {
-            return drawable.isAutoMirrored();
+            return Api19Impl.isAutoMirrored(drawable);
         } else {
             return false;
         }
@@ -108,7 +110,7 @@
      */
     public static void setHotspot(@NonNull Drawable drawable, float x, float y) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.setHotspot(x, y);
+            Api21Impl.setHotspot(drawable, x, y);
         }
     }
 
@@ -121,7 +123,7 @@
     public static void setHotspotBounds(@NonNull Drawable drawable, int left, int top,
             int right, int bottom) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.setHotspotBounds(left, top, right, bottom);
+            Api21Impl.setHotspotBounds(drawable, left, top, right, bottom);
         }
     }
 
@@ -133,7 +135,7 @@
      */
     public static void setTint(@NonNull Drawable drawable, @ColorInt int tint) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.setTint(tint);
+            Api21Impl.setTint(drawable, tint);
         } else if (drawable instanceof TintAwareDrawable) {
             ((TintAwareDrawable) drawable).setTint(tint);
         }
@@ -147,7 +149,7 @@
      */
     public static void setTintList(@NonNull Drawable drawable, @Nullable ColorStateList tint) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.setTintList(tint);
+            Api21Impl.setTintList(drawable, tint);
         } else if (drawable instanceof TintAwareDrawable) {
             ((TintAwareDrawable) drawable).setTintList(tint);
         }
@@ -161,7 +163,7 @@
      */
     public static void setTintMode(@NonNull Drawable drawable, @NonNull PorterDuff.Mode tintMode) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.setTintMode(tintMode);
+            Api21Impl.setTintMode(drawable, tintMode);
         } else if (drawable instanceof TintAwareDrawable) {
             ((TintAwareDrawable) drawable).setTintMode(tintMode);
         }
@@ -173,9 +175,10 @@
      *
      * @param drawable The Drawable against which to invoke the method.
      */
+    @SuppressWarnings("unused")
     public static int getAlpha(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 19) {
-            return drawable.getAlpha();
+            return Api19Impl.getAlpha(drawable);
         } else {
             return 0;
         }
@@ -184,18 +187,20 @@
     /**
      * Applies the specified theme to this Drawable and its children.
      */
+    @SuppressWarnings("unused")
     public static void applyTheme(@NonNull Drawable drawable, @NonNull Resources.Theme theme) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.applyTheme(theme);
+            Api21Impl.applyTheme(drawable, theme);
         }
     }
 
     /**
      * Whether a theme can be applied to this Drawable and its children.
      */
+    @SuppressWarnings("unused")
     public static boolean canApplyTheme(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 21) {
-            return drawable.canApplyTheme();
+            return Api21Impl.canApplyTheme(drawable);
         } else {
             return false;
         }
@@ -206,9 +211,11 @@
      *
      * @return the current color filter, or {@code null} if none set
      */
+    @SuppressWarnings("unused")
+    @Nullable
     public static ColorFilter getColorFilter(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 21) {
-            return drawable.getColorFilter();
+            return Api21Impl.getColorFilter(drawable);
         } else {
             return null;
         }
@@ -217,6 +224,7 @@
     /**
      * Removes the color filter from the given drawable.
      */
+    @SuppressWarnings("unused")
     public static void clearColorFilter(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 23) {
             // We can use clearColorFilter() safely on M+
@@ -229,7 +237,7 @@
             // to find any DrawableContainers, and then unwrap those to clear the filter on its
             // children manually
             if (drawable instanceof InsetDrawable) {
-                clearColorFilter(((InsetDrawable) drawable).getDrawable());
+                clearColorFilter(Api19Impl.getDrawable((InsetDrawable) drawable));
             } else if (drawable instanceof WrappedDrawable) {
                 clearColorFilter(((WrappedDrawable) drawable).getWrappedDrawable());
             } else if (drawable instanceof DrawableContainer) {
@@ -239,7 +247,7 @@
                 if (state != null) {
                     Drawable child;
                     for (int i = 0, count = state.getChildCount(); i < count; i++) {
-                        child = state.getChild(i);
+                        child = Api19Impl.getChild(state, i);
                         if (child != null) {
                             clearColorFilter(child);
                         }
@@ -266,7 +274,7 @@
             @Nullable Resources.Theme theme)
             throws XmlPullParserException, IOException {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.inflate(res, parser, attrs, theme);
+            Api21Impl.inflate(drawable, res, parser, attrs, theme);
         } else {
             drawable.inflate(res, parser, attrs);
         }
@@ -303,6 +311,7 @@
      * @see #setTintMode(Drawable, PorterDuff.Mode)
      * @see #unwrap(Drawable)
      */
+    @NonNull
     public static Drawable wrap(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 23) {
             return drawable;
@@ -352,7 +361,7 @@
      */
     public static boolean setLayoutDirection(@NonNull Drawable drawable, int layoutDirection) {
         if (Build.VERSION.SDK_INT >= 23) {
-            return drawable.setLayoutDirection(layoutDirection);
+            return Api23Impl.setLayoutDirection(drawable, layoutDirection);
         } else if (Build.VERSION.SDK_INT >= 17) {
             if (!sSetLayoutDirectionMethodFetched) {
                 try {
@@ -387,9 +396,10 @@
      *         {@link ViewCompat#LAYOUT_DIRECTION_RTL}
      * @see #setLayoutDirection(Drawable, int)
      */
+    @SuppressWarnings("ConstantConditions")
     public static int getLayoutDirection(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 23) {
-            return drawable.getLayoutDirection();
+            return Api23Impl.getLayoutDirection(drawable);
         } else if (Build.VERSION.SDK_INT >= 17) {
             if (!sGetLayoutDirectionMethodFetched) {
                 try {
@@ -416,5 +426,110 @@
         }
     }
 
-    private DrawableCompat() {}
+    private DrawableCompat() {
+    }
+
+    @RequiresApi(19)
+    static class Api19Impl {
+        private Api19Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static void setAutoMirrored(Drawable drawable, boolean mirrored) {
+            drawable.setAutoMirrored(mirrored);
+        }
+
+        @DoNotInline
+        static boolean isAutoMirrored(Drawable drawable) {
+            return drawable.isAutoMirrored();
+        }
+
+        @DoNotInline
+        static int getAlpha(Drawable drawable) {
+            return drawable.getAlpha();
+        }
+
+        @DoNotInline
+        static Drawable getChild(DrawableContainer.DrawableContainerState drawableContainerState,
+                int index) {
+            return drawableContainerState.getChild(index);
+        }
+
+        @DoNotInline
+        static Drawable getDrawable(InsetDrawable drawable) {
+            return drawable.getDrawable();
+        }
+    }
+
+    @RequiresApi(21)
+    static class Api21Impl {
+        private Api21Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static void setHotspot(Drawable drawable, float x, float y) {
+            drawable.setHotspot(x, y);
+        }
+
+        @DoNotInline
+        static void setTint(Drawable drawable, int tintColor) {
+            drawable.setTint(tintColor);
+        }
+
+        @DoNotInline
+        static void setTintList(Drawable drawable, ColorStateList tint) {
+            drawable.setTintList(tint);
+        }
+
+        @DoNotInline
+        static void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
+            drawable.setTintMode(tintMode);
+        }
+
+        @DoNotInline
+        static void applyTheme(Drawable drawable, Resources.Theme t) {
+            drawable.applyTheme(t);
+        }
+
+        @DoNotInline
+        static boolean canApplyTheme(Drawable drawable) {
+            return drawable.canApplyTheme();
+        }
+
+        @DoNotInline
+        static ColorFilter getColorFilter(Drawable drawable) {
+            return drawable.getColorFilter();
+        }
+
+        @DoNotInline
+        static void inflate(Drawable drawable, Resources r, XmlPullParser parser,
+                AttributeSet attrs, Resources.Theme theme)
+                throws XmlPullParserException, IOException {
+            drawable.inflate(r, parser, attrs, theme);
+        }
+
+        @DoNotInline
+        static void setHotspotBounds(Drawable drawable, int left, int top, int right, int bottom) {
+            drawable.setHotspotBounds(left, top, right, bottom);
+        }
+    }
+
+    @RequiresApi(23)
+    static class Api23Impl {
+        private Api23Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static boolean setLayoutDirection(Drawable drawable, int layoutDirection) {
+            return drawable.setLayoutDirection(layoutDirection);
+        }
+
+        @DoNotInline
+        static int getLayoutDirection(Drawable drawable) {
+            return drawable.getLayoutDirection();
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java b/core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java
index 7ece7b1..a1833ae 100644
--- a/core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java
@@ -49,6 +49,7 @@
 import android.util.Log;
 
 import androidx.annotation.ColorInt;
+import androidx.annotation.DoNotInline;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IdRes;
 import androidx.annotation.IntDef;
@@ -59,6 +60,7 @@
 import androidx.annotation.VisibleForTesting;
 import androidx.core.content.ContextCompat;
 import androidx.core.content.res.ResourcesCompat;
+import androidx.core.util.ObjectsCompat;
 import androidx.core.util.Preconditions;
 import androidx.versionedparcelable.CustomVersionedParcelable;
 import androidx.versionedparcelable.NonParcelField;
@@ -171,12 +173,14 @@
     /**
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY)
     @ParcelField(value = 2, defaultValue = "null")
     public byte[]          mData = null;
     /**
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY)
     @ParcelField(value = 3, defaultValue = "null")
     public Parcelable      mParcelable = null;
@@ -201,6 +205,7 @@
     /**
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY)
     @ParcelField(value = 6, defaultValue = "null")
     public ColorStateList  mTintList = null;
@@ -211,6 +216,7 @@
     /**
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY)
     @ParcelField(value = 7, defaultValue = "null")
     public String mTintModeStr = null;
@@ -218,6 +224,7 @@
     /**
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY)
     @ParcelField(value = 8, defaultValue = "null")
     public String mString1;
@@ -229,21 +236,20 @@
      * @param resId ID of the drawable resource
      * @see android.graphics.drawable.Icon#createWithResource(Context, int)
      */
-    public static IconCompat createWithResource(Context context, @DrawableRes int resId) {
-        if (context == null) {
-            throw new IllegalArgumentException("Context must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithResource(@NonNull Context context, @DrawableRes int resId) {
+        ObjectsCompat.requireNonNull(context);
         return createWithResource(context.getResources(), context.getPackageName(), resId);
     }
 
     /**
      * @hide
      */
+    @NonNull
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public static IconCompat createWithResource(Resources r, String pkg, @DrawableRes int resId) {
-        if (pkg == null) {
-            throw new IllegalArgumentException("Package must not be null.");
-        }
+    public static IconCompat createWithResource(@Nullable Resources r, @NonNull String pkg,
+            @DrawableRes int resId) {
+        ObjectsCompat.requireNonNull(pkg);
         if (resId == 0) {
             throw new IllegalArgumentException("Drawable resource ID must not be 0");
         }
@@ -267,10 +273,9 @@
      * @param bits A valid {@link android.graphics.Bitmap} object
      * @see android.graphics.drawable.Icon#createWithBitmap(Bitmap)
      */
-    public static IconCompat createWithBitmap(Bitmap bits) {
-        if (bits == null) {
-            throw new IllegalArgumentException("Bitmap must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithBitmap(@NonNull Bitmap bits) {
+        ObjectsCompat.requireNonNull(bits);
         final IconCompat rep = new IconCompat(TYPE_BITMAP);
         rep.mObj1 = bits;
         return rep;
@@ -282,10 +287,9 @@
      * @param bits A valid {@link android.graphics.Bitmap} object
      * @see android.graphics.drawable.Icon#createWithAdaptiveBitmap(Bitmap)
      */
-    public static IconCompat createWithAdaptiveBitmap(Bitmap bits) {
-        if (bits == null) {
-            throw new IllegalArgumentException("Bitmap must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithAdaptiveBitmap(@NonNull Bitmap bits) {
+        ObjectsCompat.requireNonNull(bits);
         final IconCompat rep = new IconCompat(TYPE_ADAPTIVE_BITMAP);
         rep.mObj1 = bits;
         return rep;
@@ -300,10 +304,9 @@
      * @param length Length of the bitmap data
      * @see android.graphics.drawable.Icon#createWithData(byte[], int, int)
      */
-    public static IconCompat createWithData(byte[] data, int offset, int length) {
-        if (data == null) {
-            throw new IllegalArgumentException("Data must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithData(@NonNull byte[] data, int offset, int length) {
+        ObjectsCompat.requireNonNull(data);
         final IconCompat rep = new IconCompat(TYPE_DATA);
         rep.mObj1 = data;
         rep.mInt1 = offset;
@@ -317,10 +320,9 @@
      * @param uri A uri referring to local content:// or file:// image data.
      * @see android.graphics.drawable.Icon#createWithContentUri(String)
      */
-    public static IconCompat createWithContentUri(String uri) {
-        if (uri == null) {
-            throw new IllegalArgumentException("Uri must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithContentUri(@NonNull String uri) {
+        ObjectsCompat.requireNonNull(uri);
         final IconCompat rep = new IconCompat(TYPE_URI);
         rep.mObj1 = uri;
         return rep;
@@ -332,10 +334,9 @@
      * @param uri A uri referring to local content:// or file:// image data.
      * @see android.graphics.drawable.Icon#createWithContentUri(String)
      */
-    public static IconCompat createWithContentUri(Uri uri) {
-        if (uri == null) {
-            throw new IllegalArgumentException("Uri must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithContentUri(@NonNull Uri uri) {
+        ObjectsCompat.requireNonNull(uri);
         return createWithContentUri(uri.toString());
     }
 
@@ -348,9 +349,7 @@
      */
     @NonNull
     public static IconCompat createWithAdaptiveBitmapContentUri(@NonNull String uri) {
-        if (uri == null) {
-            throw new IllegalArgumentException("Uri must not be null.");
-        }
+        ObjectsCompat.requireNonNull(uri);
         final IconCompat rep = new IconCompat(TYPE_URI_ADAPTIVE_BITMAP);
         rep.mObj1 = uri;
         return rep;
@@ -365,9 +364,7 @@
      */
     @NonNull
     public static IconCompat createWithAdaptiveBitmapContentUri(@NonNull Uri uri) {
-        if (uri == null) {
-            throw new IllegalArgumentException("Uri must not be null.");
-        }
+        ObjectsCompat.requireNonNull(uri);
         return createWithAdaptiveBitmapContentUri(uri.toString());
     }
 
@@ -416,12 +413,13 @@
         // Before aosp/1307777, we don't put the package name to mString1. Try to get the
         // package name from the full resource name string. Note that this is not always the same
         // as "the package used to create this icon" and this was what aosp/1307777 tried to fix.
-        if (TextUtils.isEmpty(mString1)) {
+        if (mString1 == null || TextUtils.isEmpty(mString1)) {
             return ((String) mObj1).split(":", -1)[0];
+        } else {
+            // The name of the getResPackage() API is a bit confusing. It actually returns
+            // the app package name rather than the package name in the resource table.
+            return mString1;
         }
-        // The name of the getResPackage() API is a bit confusing. It actually returns
-        // the app package name rather than the package name in the resource table.
-        return mString1;
     }
 
     /**
@@ -493,6 +491,7 @@
      * @param tint a color, as in {@link Drawable#setTint(int)}
      * @return this same object, for use in chained construction
      */
+    @NonNull
     public IconCompat setTint(@ColorInt int tint) {
         return setTintList(ColorStateList.valueOf(tint));
     }
@@ -503,7 +502,8 @@
      * @param tintList as in {@link Drawable#setTintList(ColorStateList)}, null to remove tint
      * @return this same object, for use in chained construction
      */
-    public IconCompat setTintList(ColorStateList tintList) {
+    @NonNull
+    public IconCompat setTintList(@Nullable ColorStateList tintList) {
         mTintList = tintList;
         return this;
     }
@@ -514,7 +514,8 @@
      * @param mode a blending mode, as in {@link Drawable#setTintMode(PorterDuff.Mode)}, may be null
      * @return this same object, for use in chained construction
      */
-    public IconCompat setTintMode(PorterDuff.Mode mode) {
+    @NonNull
+    public IconCompat setTintMode(@Nullable PorterDuff.Mode mode) {
         mTintMode = mode;
         return this;
     }
@@ -537,62 +538,7 @@
     @RequiresApi(23)
     @NonNull
     public Icon toIcon(@Nullable Context context) {
-        Icon icon;
-        switch (mType) {
-            case TYPE_UNKNOWN:
-                // When type is unknown we are just wrapping an icon.
-                return (Icon) mObj1;
-            case TYPE_BITMAP:
-                icon = Icon.createWithBitmap((Bitmap) mObj1);
-                break;
-            case TYPE_ADAPTIVE_BITMAP:
-                if (Build.VERSION.SDK_INT >= 26) {
-                    icon = Icon.createWithAdaptiveBitmap((Bitmap) mObj1);
-                } else {
-                    icon = Icon.createWithBitmap(
-                            createLegacyIconFromAdaptiveIcon((Bitmap) mObj1, false));
-                }
-                break;
-            case TYPE_RESOURCE:
-                icon = Icon.createWithResource(getResPackage(), mInt1);
-                break;
-            case TYPE_DATA:
-                icon = Icon.createWithData((byte[]) mObj1, mInt1, mInt2);
-                break;
-            case TYPE_URI:
-                icon = Icon.createWithContentUri((String) mObj1);
-                break;
-            case TYPE_URI_ADAPTIVE_BITMAP:
-                if (Build.VERSION.SDK_INT >= 30) {
-                    icon = Icon.createWithAdaptiveBitmapContentUri(getUri());
-                    break;
-                }
-                if (context == null) {
-                    throw new IllegalArgumentException(
-                            "Context is required to resolve the file uri of the icon: " + getUri());
-                }
-                InputStream is = getUriInputStream(context);
-                if (is == null) {
-                    throw new IllegalStateException(
-                            "Cannot load adaptive icon from uri: " + getUri());
-                }
-                if (Build.VERSION.SDK_INT >= 26) {
-                    icon = Icon.createWithAdaptiveBitmap(BitmapFactory.decodeStream(is));
-                } else {
-                    icon = Icon.createWithBitmap(createLegacyIconFromAdaptiveIcon(
-                                BitmapFactory.decodeStream(is), false));
-                }
-                break;
-            default:
-                throw new IllegalArgumentException("Unknown type");
-        }
-        if (mTintList != null) {
-            icon.setTintList(mTintList);
-        }
-        if (mTintMode != DEFAULT_TINT_MODE) {
-            icon.setTintMode(mTintMode);
-        }
-        return icon;
+        return Api23Impl.toIcon(this, context);
     }
 
     /**
@@ -638,7 +584,7 @@
     public Drawable loadDrawable(@NonNull Context context) {
         checkResource(context);
         if (Build.VERSION.SDK_INT >= 23) {
-            return toIcon(context).loadDrawable(context);
+            return Api23Impl.loadDrawable(toIcon(context), context);
         }
         final Drawable result = loadDrawableInner(context);
         if (result != null && (mTintList != null || mTintMode != DEFAULT_TINT_MODE)) {
@@ -691,7 +637,7 @@
                 is = getUriInputStream(context);
                 if (is != null) {
                     if (Build.VERSION.SDK_INT >= 26) {
-                        return new AdaptiveIconDrawable(null,
+                        return Api26Impl.createAdaptiveIconDrawable(null,
                                 new BitmapDrawable(context.getResources(),
                                         BitmapFactory.decodeStream(is)));
                     } else {
@@ -1098,19 +1044,20 @@
     @RequiresApi(23)
     private static int getType(@NonNull Icon icon) {
         if (Build.VERSION.SDK_INT >= 28) {
-            return icon.getType();
-        }
-        try {
-            return (int) icon.getClass().getMethod("getType").invoke(icon);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Unable to get icon type " + icon, e);
-            return TYPE_UNKNOWN;
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Unable to get icon type " + icon, e);
-            return TYPE_UNKNOWN;
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Unable to get icon type " + icon, e);
-            return TYPE_UNKNOWN;
+            return Api28Impl.getType(icon);
+        } else {
+            try {
+                return (int) icon.getClass().getMethod("getType").invoke(icon);
+            } catch (IllegalAccessException e) {
+                Log.e(TAG, "Unable to get icon type " + icon, e);
+                return TYPE_UNKNOWN;
+            } catch (InvocationTargetException e) {
+                Log.e(TAG, "Unable to get icon type " + icon, e);
+                return TYPE_UNKNOWN;
+            } catch (NoSuchMethodException e) {
+                Log.e(TAG, "Unable to get icon type " + icon, e);
+                return TYPE_UNKNOWN;
+            }
         }
     }
 
@@ -1126,19 +1073,20 @@
     @RequiresApi(23)
     private static String getResPackage(@NonNull Icon icon) {
         if (Build.VERSION.SDK_INT >= 28) {
-            return icon.getResPackage();
-        }
-        try {
-            return (String) icon.getClass().getMethod("getResPackage").invoke(icon);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Unable to get icon package", e);
-            return null;
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Unable to get icon package", e);
-            return null;
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Unable to get icon package", e);
-            return null;
+            return Api28Impl.getResPackage(icon);
+        } else {
+            try {
+                return (String) icon.getClass().getMethod("getResPackage").invoke(icon);
+            } catch (IllegalAccessException e) {
+                Log.e(TAG, "Unable to get icon package", e);
+                return null;
+            } catch (InvocationTargetException e) {
+                Log.e(TAG, "Unable to get icon package", e);
+                return null;
+            } catch (NoSuchMethodException e) {
+                Log.e(TAG, "Unable to get icon package", e);
+                return null;
+            }
         }
     }
 
@@ -1155,19 +1103,20 @@
     @DrawableRes
     private static int getResId(@NonNull Icon icon) {
         if (Build.VERSION.SDK_INT >= 28) {
-            return icon.getResId();
-        }
-        try {
-            return (int) icon.getClass().getMethod("getResId").invoke(icon);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Unable to get icon resource", e);
-            return 0;
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Unable to get icon resource", e);
-            return 0;
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Unable to get icon resource", e);
-            return 0;
+            return Api28Impl.getResId(icon);
+        } else {
+            try {
+                return (int) icon.getClass().getMethod("getResId").invoke(icon);
+            } catch (IllegalAccessException e) {
+                Log.e(TAG, "Unable to get icon resource", e);
+                return 0;
+            } catch (InvocationTargetException e) {
+                Log.e(TAG, "Unable to get icon resource", e);
+                return 0;
+            } catch (NoSuchMethodException e) {
+                Log.e(TAG, "Unable to get icon resource", e);
+                return 0;
+            }
         }
     }
 
@@ -1183,19 +1132,20 @@
     @RequiresApi(23)
     private static Uri getUri(@NonNull Icon icon) {
         if (Build.VERSION.SDK_INT >= 28) {
-            return icon.getUri();
-        }
-        try {
-            return (Uri) icon.getClass().getMethod("getUri").invoke(icon);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Unable to get icon uri", e);
-            return null;
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Unable to get icon uri", e);
-            return null;
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Unable to get icon uri", e);
-            return null;
+            return Api28Impl.getUri(icon);
+        } else {
+            try {
+                return (Uri) icon.getClass().getMethod("getUri").invoke(icon);
+            } catch (IllegalAccessException e) {
+                Log.e(TAG, "Unable to get icon uri", e);
+                return null;
+            } catch (InvocationTargetException e) {
+                Log.e(TAG, "Unable to get icon uri", e);
+                return null;
+            } catch (NoSuchMethodException e) {
+                Log.e(TAG, "Unable to get icon uri", e);
+                return null;
+            }
         }
     }
 
@@ -1236,8 +1186,8 @@
         BitmapShader shader = new BitmapShader(adaptiveIconBitmap, Shader.TileMode.CLAMP,
                 Shader.TileMode.CLAMP);
         Matrix shift = new Matrix();
-        shift.setTranslate(-(adaptiveIconBitmap.getWidth() - size) / 2,
-                -(adaptiveIconBitmap.getHeight() - size) / 2);
+        shift.setTranslate(-(adaptiveIconBitmap.getWidth() - size) / 2.0f,
+                -(adaptiveIconBitmap.getHeight() - size) / 2.0f);
         shader.setLocalMatrix(shift);
         paint.setShader(shader);
         canvas.drawCircle(center, center, radius, paint);
@@ -1245,4 +1195,135 @@
         canvas.setBitmap(null);
         return icon;
     }
+
+    @RequiresApi(28)
+    static class Api28Impl {
+        private Api28Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static String getResPackage(Icon icon) {
+            return icon.getResPackage();
+        }
+
+        @DoNotInline
+        static int getType(Icon icon) {
+            return icon.getType();
+        }
+
+        @DoNotInline
+        static int getResId(Icon icon) {
+            return icon.getResId();
+        }
+
+        @DoNotInline
+        static Uri getUri(Icon icon) {
+            return icon.getUri();
+        }
+    }
+
+    @RequiresApi(26)
+    static class Api26Impl {
+        private Api26Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static AdaptiveIconDrawable createAdaptiveIconDrawable(Drawable backgroundDrawable,
+                Drawable foregroundDrawable) {
+            return new AdaptiveIconDrawable(backgroundDrawable, foregroundDrawable);
+        }
+
+        @DoNotInline
+        static Icon createWithAdaptiveBitmap(Bitmap bits) {
+            return Icon.createWithAdaptiveBitmap(bits);
+        }
+    }
+
+    @RequiresApi(30)
+    static class Api30Impl {
+        private Api30Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static Icon createWithAdaptiveBitmapContentUri(Uri uri) {
+            return Icon.createWithAdaptiveBitmapContentUri(uri);
+        }
+
+    }
+
+    @RequiresApi(23)
+    static class Api23Impl {
+        private Api23Impl() {
+            // This class is not instantiable.
+        }
+
+        static Icon toIcon(IconCompat iconCompat, Context context) {
+            Icon icon;
+            switch (iconCompat.mType) {
+                case TYPE_UNKNOWN:
+                    // When type is unknown we are just wrapping an icon.
+                    return (Icon) iconCompat.mObj1;
+                case TYPE_BITMAP:
+                    icon = Icon.createWithBitmap((Bitmap) iconCompat.mObj1);
+                    break;
+                case TYPE_ADAPTIVE_BITMAP:
+                    if (Build.VERSION.SDK_INT >= 26) {
+                        icon = Api26Impl.createWithAdaptiveBitmap((Bitmap) iconCompat.mObj1);
+                    } else {
+                        icon = Icon.createWithBitmap(
+                                createLegacyIconFromAdaptiveIcon((Bitmap) iconCompat.mObj1, false));
+                    }
+                    break;
+                case TYPE_RESOURCE:
+                    icon = Icon.createWithResource(iconCompat.getResPackage(), iconCompat.mInt1);
+                    break;
+                case TYPE_DATA:
+                    icon = Icon.createWithData((byte[]) iconCompat.mObj1, iconCompat.mInt1,
+                            iconCompat.mInt2);
+                    break;
+                case TYPE_URI:
+                    icon = Icon.createWithContentUri((String) iconCompat.mObj1);
+                    break;
+                case TYPE_URI_ADAPTIVE_BITMAP:
+                    if (Build.VERSION.SDK_INT >= 30) {
+                        icon = Api30Impl.createWithAdaptiveBitmapContentUri(iconCompat.getUri());
+                        break;
+                    }
+                    if (context == null) {
+                        throw new IllegalArgumentException(
+                                "Context is required to resolve the file uri of the icon: "
+                                        + iconCompat.getUri());
+                    }
+                    InputStream is = iconCompat.getUriInputStream(context);
+                    if (is == null) {
+                        throw new IllegalStateException(
+                                "Cannot load adaptive icon from uri: " + iconCompat.getUri());
+                    }
+                    if (Build.VERSION.SDK_INT >= 26) {
+                        icon = Api26Impl.createWithAdaptiveBitmap(BitmapFactory.decodeStream(is));
+                    } else {
+                        icon = Icon.createWithBitmap(createLegacyIconFromAdaptiveIcon(
+                                BitmapFactory.decodeStream(is), false));
+                    }
+                    break;
+                default:
+                    throw new IllegalArgumentException("Unknown type");
+            }
+            if (iconCompat.mTintList != null) {
+                icon.setTintList(iconCompat.mTintList);
+            }
+            if (iconCompat.mTintMode != DEFAULT_TINT_MODE) {
+                icon.setTintMode(iconCompat.mTintMode);
+            }
+            return icon;
+        }
+
+        @DoNotInline
+        static Drawable loadDrawable(Icon icon, Context context) {
+            return icon.loadDrawable(context);
+        }
+    }
 }
