ComposeRuntimeFlags.isLinkBufferComposerEnabled는 Jetpack Compose 내부에서 UI 트리를 관리하는 데이터 구조인 SlotTable의 아키텍처를 혁신적으로 변경하는 실험적(Experimental) 기능 플래그입니다.
기존의 메모리 관리 방식인 GapBuffer 대신 새로운 LinkBuffer 구조를 사용하도록 활성화하는 역할을 합니다.
Jetpack Compose는 모든 컴포저블의 상태, ID, 트리 구조 정보를 SlotTable이라는 내부 데이터 구조에 저장합니다. Compose 출시 초기부터 지금까지 이 SlotTable은 Gap Buffer(갭 버퍼) 구조를 기반으로 작동해 왔습니다.
isLinkBufferComposerEnabled = true를 설정하면, 이 평면 배열 구조가 연결 리스트(Linked List) 형태의 LinkBuffer 구조로 대체됩니다.
이 플래그를 활성화했을 때 가장 드라마틱한 성능 향상이 일어나는 구간은 다음과 같습니다.
setContent { ... }가 호출되기 전(예: Application 클래스의 onCreate 등)에 플래그를 설정해야 합니다.
import androidx.compose.runtime.ComposeRuntimeFlags
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
// LinkBuffer 활성화
ComposeRuntimeFlags.isLinkBufferComposerEnabled = true
}
}
isLinkBufferComposerEnabled는 Jetpack Compose의 내부 런타임 클래스 구조와 필드를 직접 변경하고 접근하는 기능이므로 릴리즈 빌드 시 코드 난독화 및 최적화 도구인 R8(ProGuard)이 이 내부 플래그나 관련 클래스를 마음대로 지우거나 이름을 바꾸지 못하도록 프로가드 규칙(proguard-rules.pro)에 유지(Keep) 명령을 명시적으로 추가해 주어야 합니다.
규칙을 추가하지 않으면 릴리즈 빌드 앱이 구동되자마자 크래시(ClassNotFoundException 또는 NoSuchFieldError 등)가 발생할 수 있습니다.
# Jetpack Compose LinkBuffer 활성화를 위한 R8/ProGuard 규칙
-keep class androidx.compose.runtime.ComposeRuntimeFlags { *; }
-keep class androidx.compose.runtime.internal.** { *; }
# (선택) 만약 에러가 지속된다면 연관된 SlotTable 관련 내부 구조도 유지합니다.
-keep class androidx.compose.runtime.SlotTable { *; }
-keep class androidx.compose.runtime.Anchor { *; }