Recomposition
Jetpack Compose로 안드로이드를 개발하다보면 Recomposition을 경험하게 된다.
Recomposition이란, 상태가 변경될 때마다 Composable을 다시 그리는 현상을 의미한다.
만약 컴포즈가 stable한 상태가 아니라면 컴포즈는 불필요한 Recomposition을 자주 발생시킨다.
이를 방지하고자 나는 현재 상태가 stable인지 혹은 unstable인지 알 수 있는 방법을 찾아보았다.
그러다 Compose Compiler Metrics를 알게 되어 이에 대해 설명해보고자 한다.
Compose Compiler Metrics
컴포즈 컴파일러는 composable 함수를 컴파일할 때 function(함수)과 type(타입)에 대해 몇몇 태그를 작성한다.
이 태그를 통해 우리는 컴포즈가 함수와 타입을 어떻게 처리하는지 알 수 있다.
이러한 데이터를 수집하고 분석해서 보고서로 나타내게 해주는 것이 Compose Compiler Metrics Report이다.
📍상세 설명: https://github.com/JetBrains/kotlin/blob/master/plugins/compose/design/compiler-metrics.md
kotlin/plugins/compose/design/compiler-metrics.md at master · JetBrains/kotlin
The Kotlin Programming Language. . Contribute to JetBrains/kotlin development by creating an account on GitHub.
github.com
우선, 이러한 보고서를 만드는 방법에 대해 알아보자.
📍공식문서 :https://developer.android.com/develop/ui/compose/performance/stability/diagnose?hl=ko
안정성 문제 진단 | Jetpack Compose | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 안정성 문제 진단 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 불필요하거나 과도한 리컴포지션이
developer.android.com
먼저 데이터를 확인하고 싶은 모듈의 build.gradle.kts 파일에 아래와 같이 작성한다.
아래에서 작성한 루트에 따라 보고서의 생성 위치가 결정되는데, 이는 취향에 맞게 적으면 된다.
android {
kotlinOptions {
freeCompilerArgs += listOf(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=${
projectDir.resolve(
"."
).absolutePath
}/compose-reports",
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=${
projectDir.resolve(
"."
).absolutePath
}/compose-reports",
)
}
}
- reportsDestination은 클래스의 안정성에 관한 보고서(classes.txt), 컴포저블 함수에 대한 보고서(composables.txt), CSV 버전의 컴포저블 보고서(composable.csv)를 생성한다.
- metricsDestination은 특정 구성 요소에 해당하는 지표(module.json)를 생성한다.
그리고 확인하고 싶은 모듈의 이름을 넣어 Gradle 명령을 실행한다.
나는 :feature:home 모듈을 넣어주었다.
./gradlew :feature:home:assembleDebug
그러면 원하는 위치에 보고서 파일이 생긴 것을 확인할 수 있다.
만약 멀티모듈을 사용하고 있다면 이를 확장함수로 만들어주어 간편하게 사용할 수도 있다.
fun Project.configureComposeMetrics() {
extensions.configure<BaseExtension> {
(this as ExtensionAware).extensions.configure<KotlinJvmOptions> {
freeCompilerArgs += listOf(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=${
projectDir.resolve("compose-reports").absolutePath
}",
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=${
projectDir.resolve("compose-reports").absolutePath
}"
)
}
}
}
이 함수를 build.gradle.kts 파일에 그대로 적용하기만 하면 된다.
android {
configureComposeMetrics()
}
보고서 알아보기
이제 생성된 보고서를 파악해보자.
위에서 언급했다시피, 컴포즈 컴파일러는 함수에 대해 태그를 작성한다.
- Restartable: Composable 함수에 대해 리컴포지션을 트리거할 수 있음을 의미한다. 대부분의 함수는 restartable하다.
- Skippable: 리컴포지션을 하지 않고 건너뜀을 의미한다. 모든 인자가 이전 값과 같으면 리컴포지션 중에 해당 함수를 건너뛸 수 있다.
이는 composables.txt 파일로 확인해 볼 수 있다.
restartable scheme("[androidx.compose.ui.UiComposable]") fun RecommendInternItem(
unstable intern: HomeRecommendInternDetail
stable navigateToIntern: Function1<Long, Unit>
stable onScrapButtonClicked: Function1<Long, Unit>
)
restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun ShowRecommendTitle(
stable userName: String
)
위의 RecommendInternItem 함수에서 intern은 List 타입이다.
List는 값이 변경될 수 있기 때문에 unstable로 측정이 됨으로써 restartable 태그만 붙은 것을 확인할 수 있다.
반면, ShowRecommendTitle 함수의 매개변수는 모두 stable하다.
따라서 restartable과 skippable 태그가 붙은 것이다.
이처럼 Composable 함수는 동시에 restartable과 skippable이 될 수 있음을 명심하자.
'Develop > Android' 카테고리의 다른 글
[Android] SnackBar 디자인시스템 구현기 (Material 뜯어보기) (0) | 2025.01.30 |
---|---|
[Android] BottomSheet 디자인시스템 구현기 (Material 뜯어보기) (0) | 2025.01.29 |
[Android] 단어 단위의 개행하기 (Compose) (0) | 2024.11.22 |
[Android] LineBreak 속성 알아보기 (0) | 2024.11.08 |
[Android] 스와이프 이벤트 AnchoredDraggable로 처리하기 (Compose) (0) | 2024.10.31 |