안정성 문제 진단

불필요하거나 과도한 리컴포지션이 발생하면 앱의 안정성을 디버그해야 합니다. 이 가이드 이를 위한 몇 가지 방법을 설명합니다.

Layout Inspector

Android 스튜디오의 Layout Inspector를 사용하면 어떤 컴포저블이 있는지 확인할 수 있습니다. 재구성할 수 있습니다. Compose의 횟수가 표시됩니다. 구성 요소를 건너뛰었을 때 발생합니다.

Layout Inspector에서 재구성 및 건너뛰기 횟수

Compose 컴파일러 보고서

Compose 컴파일러는 안정성 추론 결과를 출력할 수 있습니다. 검사 이 출력을 사용하여 어떤 컴포저블이 포함되어 있는지 확인할 수 있습니다. 지정할 수 있습니다. 다음 하위 섹션에서는 이를 사용하는 방법을 요약합니다. 자세한 내용은 기술 사양 문서를 참조하세요.

설정

Compose 컴파일러 보고서는 기본적으로 사용 설정되어 있지 않습니다. 다음을 통해 활성화할 수 있습니다. 컴파일러 플래그입니다. 정확한 설정Compose 컴파일러 Gradle 플러그인을 사용하는 프로젝트의 경우 각 모듈 build.gradle 파일에 다음을 추가합니다.

  android { ... }

  composeCompiler {
    reportsDestination = layout.buildDirectory.dir("compose_compiler")
    metricsDestination = layout.buildDirectory.dir("compose_compiler")
  }

이제 프로젝트를 빌드할 때 Compose 컴파일러 보고서가 생성됩니다.

출력 예

reportsDestination는 파일 3개를 출력합니다. 다음은 출력 예입니다. 출처: JetSnack

  • <modulename>-classes.txt: 이 클래스의 클래스 안정성에 관한 보고서입니다. 모듈을 마칩니다 샘플.
  • <modulename>-composables.txt: 다시 시작할 수 있는 상태와 모듈에 있는 컴포저블 함수를 건너뛸 수 있습니다. 샘플.
  • <modulename>-composables.csv: CSV 버전의 컴포저블 보고서 스프레드시트로 가져오거나 스크립트를 사용하여 처리할 수 있습니다. 샘플
를 통해 개인정보처리방침을 정의할 수 있습니다.

컴포저블 보고서

composables.txt 파일은 주어진 매개변수 안정성, 매개변수 안정성, 다시 시작할 수 있거나 건너뛸 수 있는 인벤토리를 선택할 수 있습니다 다음은 Google Cloud에서 제공하는 JetSnack:

restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun SnackCollection(
  stable snackCollection: SnackCollection
  stable onSnackClick: Function1<Long, Unit>
  stable modifier: Modifier? = @static Companion
  stable index: Int = @static 0
  stable highlight: Boolean = @static true
)

SnackCollection 컴포저블은 완전히 다시 시작하고 건너뛸 수 있으며 있습니다. 일반적으로는 선호되지만 필수는 아닙니다.

반면에 다른 예를 살펴보겠습니다.

restartable scheme("[androidx.compose.ui.UiComposable]") fun HighlightedSnacks(
  stable index: Int
  unstable snacks: List<Snack>
  stable onSnackClick: Function1<Long, Unit>
  stable modifier: Modifier? = @static Companion
)

HighlightedSnacks 컴포저블은 건너뛸 수 없습니다. Compose에서 건너뛰지 않음 리컴포지션 중에 발생합니다. 매개변수가 변경되지 않은 경우에도 마찬가지입니다. 그 이유는 unstable 매개변수인 snacks입니다.

수업 보고서

classes.txt 파일에는 주어진 모듈을 마칩니다 다음 스니펫은 Snack 클래스의 출력입니다.

unstable class Snack {
  stable val id: Long
  stable val name: String
  stable val imageUrl: String
  stable val price: Long
  stable val tagline: String
  unstable val tags: Set<String>
  <runtime stability> = Unstable
}

참고로 Snack의 정의는 다음과 같습니다.

data class Snack(
    val id: Long,
    val name: String,
    val imageUrl: String,
    val price: Long,
    val tagline: String = "",
    val tags: Set<String> = emptySet()
)

Compose 컴파일러가 Snack를 불안정한 것으로 표시했습니다. 이는 tags 매개변수는 Set<String>입니다. 이는 변경 불가능한 유형입니다. MutableSet이(가) 아닙니다. 그러나 Set, List와 같은 표준 컬렉션 클래스는 및 Map는 궁극적으로 인터페이스입니다. 따라서 기본 구현은 여전히 변경 가능합니다

예를 들어 val set: Set<String> = mutableSetOf("foo")라고 쓸 수 있습니다. 이 변수가 상수이고 선언된 유형은 변경할 수 없지만 여전히 변경 가능합니다. Compose 컴파일러는 이 클래스는 선언된 유형만 보기 때문에 불변성을 가집니다. 따라서 tags가 불안정합니다.