강력 건너뛰기 모드

강력한 건너뛰기는 Compose 컴파일러에서 사용할 수 있는 모드입니다. 사용 설정하면 두 가지 방법으로 컴파일러의 동작을 변경합니다.

를 통해 개인정보처리방침을 정의할 수 있습니다.

강력한 건너뛰기 모드 사용 설정

Gradle 모듈에 강력한 건너뛰기를 사용 설정하려면 다음 옵션을 포함합니다. Gradle 구성의 composeCompiler 블록을 설정합니다.

android { ... }

composeCompiler {
   enableStrongSkippingMode = true
}

구성 가능한 건너뛰기 기능

강력한 건너뛰기 모드는 일반적으로 적용되는 일부 안정성 규칙을 완화합니다. 구성 가능한 함수 건너뛰기와 관련하여 Compose 컴파일러에 의해 작성됩니다. 작성자: 기본적으로 Compose 컴파일러는 구성 가능한 함수를 모두 건너뛸 수 있는 것으로 표시합니다. 인수는 안정적인 값을 갖습니다. 강력한 건너뛰기 모드로 인해 이러한 문제가 달라집니다.

강력한 건너뛰기를 사용 설정하면 다시 시작할 수 있는 모든 구성 가능한 함수가 건너뛸 수 있음. 이는 매개변수가 불안정한지 여부와 관계없이 적용됩니다. 다시 시작할 수 없는 구성 가능한 함수는 건너뛸 수 없습니다.

건너뛰어야 하는 경우

리컴포지션 중에 컴포저블을 건너뛸지 결정하기 위해 Compose는 각 매개변수의 값을 이전 값과 비교합니다. 비교 유형 매개변수의 안정성에 따라 달라집니다.

  • 불안정한 매개변수는 인스턴스 동등성 (===)을 사용하여 비교됩니다.
  • 객체 동등성 (Object.equals())을 사용하여 안정적인 매개변수를 비교합니다.

모든 매개변수가 이러한 요구사항을 충족하면 Compose는 재구성할 수 있습니다

컴포저블에서 강력한 건너뛰기를 선택 해제하는 것이 좋습니다. 다시 말해 다시 시작할 수 있지만 건너뛸 수 없는 컴포저블을 원하는 경우 이 경우 @NonSkippableComposable 주석

@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}

클래스를 안정적인 것으로 주석 처리

인스턴스 동등성 대신 객체 동등성을 사용하는 객체를 원하는 경우 지정된 클래스에 계속 @Stable로 주석을 추가합니다. 예를 들어 이 작업은 객체의 전체 목록을 관찰할 때 수행해야 하며, Room은 특정 시점에 특정 시점에 목록의 모든 항목에 새 객체를 할당하므로 변경할 수 있습니다

람다 메모

강력한 건너뛰기 모드는 람다의 기억도 더 많이 사용 설정합니다. 확인할 수 있습니다. 강력한 건너뛰기를 사용하도록 설정하면 구성 가능한 함수가 자동으로 기억됩니다.

강력한 건너뛰기를 사용할 때 컴포저블 내에서 람다 메모를 사용하려면 컴파일러가 remember 호출로 람다를 래핑합니다. 이 키는 캡쳐합니다.

다음 예와 같이 람다가 있는 경우를 고려하세요.

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = {
        use(unstableObject)
        use(stableObject)
    }
}

강력한 건너뛰기를 사용 설정하면 컴파일러는 람다를 remember 호출:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = remember(unstableObject, stableObject) {
        {
            use(unstableObject)
            use(stableObject)
        }
    }
}

키는 구성 가능한 함수와 동일한 비교 규칙을 따릅니다. 런타임 인스턴스 동등성을 사용하여 불안정한 키를 비교합니다. 안정적인 키를 비교하며 같다고 합니다

메모리 및 리컴포지션

이 최적화는 런타임 시 실행되는 컴포저블의 수를 크게 늘립니다. 리컴포지션 중에 건너뜁니다. 메모가 없으면 런타임이 를 호출하는 동안 람다 매개변수를 사용하는 컴포저블에 새 람다를 할당합니다. 재구성할 수 있습니다 결과적으로 새 람다에는 다음과 같지 않은 매개변수가 있습니다. 확인할 수 있습니다. 그러면 재구성이 발생합니다.

메모 방지

기억하지 않으려는 람다가 있다면 @DontMemoize를 사용합니다. 주석을 추가합니다.

val lambda = @DontMemoize {
    ...
}

APK 크기

컴파일할 때 건너뛸 수 있는 컴포저블은 컴파일 시 컴포저블을 사용하는 것이 좋습니다. 강력한 건너뛰기를 사용 설정하면 컴파일러는 거의 모든 컴포저블을 건너뛸 수 있는 것으로 표시하고 모든 람다를 remember{...} 따라서 강력한 건너뛰기 모드를 사용 설정하면 애플리케이션의 APK 크기에 영향을 줄 수 있습니다

Now In Android에서 강력한 건너뛰기를 사용 설정하면 APK가 증가했습니다. 4KB만큼 크게 줄어듭니다. 크기 차이는 대개 이전 버전과 같은 주어진 앱에 있었지만 비교적 사소하지 않습니다.