불필요하거나 과도한 리컴포지션이 발생하면 앱의 안정성을 디버그해야 합니다. 이 가이드 이를 위한 몇 가지 방법을 설명합니다.
Layout Inspector
Android 스튜디오의 Layout Inspector를 사용하면 어떤 컴포저블이 있는지 확인할 수 있습니다. 재구성할 수 있습니다. Compose의 횟수가 표시됩니다. 구성 요소를 건너뛰었을 때 발생합니다.
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
가 불안정합니다.