Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc1646fb authored by Jared Duke's avatar Jared Duke
Browse files

Add Kotlin intrinsics proguard rules to SystemUI

Introduce several Kotlin Proguard rules to strip synthetically generated
calls to kotlin Intrinsics, particularly for null checks. These checks
are typically inserted at the boundaries between Kotlin and Java, but
add a non-trivial amount to SystemUI code size (~3% of compiled size).

Note that this may change the exception/crash stacks for various crash
clusters, but this Proguard configuration is used in production by a
number of widely distributed apps.

Test: m + boot test
Bug: 203472868
Change-Id: I8547600e28ce026a3fbf6a694192fa3e02b2e630
parent 4aa5f891
Loading
Loading
Loading
Loading
+39 −1
Original line number Diff line number Diff line
@@ -37,3 +37,41 @@
-keep class com.android.systemui.dagger.GlobalRootComponent$SysUIComponentImpl { *; }
-keep class com.android.systemui.dagger.Dagger** { *; }
-keep class com.android.systemui.tv.Dagger** { *; }

# Removes runtime checks added through Kotlin to JVM code genereration to
# avoid linear growth as more Kotlin code is converted / added to the codebase.
# These checks are generally applied to Java platform types (values returned
# from Java code that don't have nullness annotations), but we remove them to
# avoid code size increases.
#
# See also https://kotlinlang.org/docs/reference/java-interop.html
#
# TODO(b/199941987): Consider standardizing these rules in a central place as
# Kotlin gains adoption with other platform targets.
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
    # Remove check for method parameters being null
    static void checkParameterIsNotNull(java.lang.Object, java.lang.String);

    # When a Java platform type is returned and passed to Kotlin NonNull method,
    # remove the null check
    static void checkExpressionValueIsNotNull(java.lang.Object, java.lang.String);
    static void checkNotNullExpressionValue(java.lang.Object, java.lang.String);

    # Remove check that final value returned from method is null, if passing
    # back Java platform type.
    static void checkReturnedValueIsNotNull(java.lang.Object, java.lang.String, java.lang.String);
    static void checkReturnedValueIsNotNull(java.lang.Object, java.lang.String);

    # Null check for accessing a field from a parent class written in Java.
    static void checkFieldIsNotNull(java.lang.Object, java.lang.String, java.lang.String);
    static void checkFieldIsNotNull(java.lang.Object, java.lang.String);

    # Removes code generated from !! operator which converts Nullable type to
    # NonNull type. These would throw an NPE immediate after on access.
    static void checkNotNull(java.lang.Object, java.lang.String);
    static void checkNotNullParameter(java.lang.Object, java.lang.String);

    # Removes lateinit var check being used before being set. Check is applied
    # on every field access without this.
    static void throwUninitializedPropertyAccessException(java.lang.String);
}