오늘 Jetpack Compose 2026년 8월 버전이 안정화되었습니다. 이 출시에서는 핵심 Compose 모듈 전반에 버전 1.12를 도입하여 (전체 BOM 매핑 참고) 메시 그라데이션, 넓은 색 영역 (WCG) 지원과 같은 풍부한 시각적 API, Grid의 명명된 영역과 같은 구조적 레이아웃 기능, Android의 사용자 인증 정보 관리자와의 원활한 통합, 상당한 테스트 및 성능 개선사항을 도입합니다.
오늘 출시된 버전으로 프로젝트를 업데이트하려면 Compose BOM 버전을 2026.08.00로 업그레이드하세요.
implementation(platform("androidx.compose:compose-bom:2026.08.00"))
브레이킹 체인지
- AGP 및 컴파일 SDK: Compose 1.12에서는 compileSdk를 API 37로 업데이트하므로 최소 AGP 9.1.2가 필요합니다. 참고로 Compose는 항상 최신 compileSdk를 타겟팅합니다. 여기에서 변경사항에 대해 자세히 알아보세요.
Modifier.onFirstVisible()가 지원 중단됨: 더 정확한 표시 상태 기준점 추적을 제공하는 Modifier.onVisibilityChanged()로 이전하세요.
그래픽
메시 그라데이션
Compose 1.12에서는 MeshGradientPainter를 도입하여 다중 포인트의 유기적인 색상 그라데이션을 만들 수 있습니다.
val rows = 1 val columns = 1 val gradientPainter = remember { MeshGradientPainter(rows, columns) { // Parameters: row, column, position, color setVertex(0, 0, Offset(0f, 0f), Color.Red) // Top-Left setVertex(0, 1, Offset(1f, 0f), Color.Blue) // Top-Right setVertex(1, 0, Offset(0f, 1f), Color.Green) // Bottom-Left setVertex(1, 1, Offset(1f, 1f), Color.Yellow) // Bottom-Right } } Box( modifier = modifier .aspectRatio(16/9f) .fillMaxWidth() .paint(gradientPainter) )
자세한 내용과 예시는 문서를 참고하세요.
와이드 컬러 Gamut 및 HDR 지원
최신 디스플레이는 확장된 색상 충실도와 더 높은 동적 범위를 제공합니다. Compose 1.12에서는 넓은 색 영역 (P3) 및 HDR 렌더링을 위한 전체 파이프라인 지원이 Compose 그래픽, 페인트, 셰이더 전반에 걸쳐 사용 설정되었습니다. sRGB가 아닌 색상 공간 (예: Display P3)에 정의된 색상은 색상 클램핑 없이 플랫폼 렌더링을 통해 유지됩니다. 지원되지 않는 색상 공간 (예: CieXyz, CieLab, Oklab)을 사용하거나, 지원되지 않는 Android 버전의 색상 공간 (예: Android 13 이하의 Bt2020Hlg)을 사용하거나, 앱이 Android 9 (API 28) 이하에서 실행되는 경우 색상이 sRGB로 안전하게 대체됩니다.
기타 주요 변경사항:
LayerOutsets이GraphicsLayer및Modifier.graphicsLayer에 추가되었으며, 이를 사용하여 측정된 크기를 넘어 레이어의 시각적 경계를 늘릴 수 있습니다. 레이어가 오프스크린 버퍼로 승격될 때 암시적clipToBounds동작을 방지하기 위해LayerOutsets를 적용합니다.
스타일
Google I/O에서 구성요소의 스타일을 지정하는 통합되고 성능이 우수한 방법인 Compose 스타일 API의 초기 비전을 공유했습니다. 그 이후로 엄격한 유형 안전성과 예측 가능한 정확성을 보장하고 맞춤 디자인 시스템을 빌드할 수 있도록 기본 아키텍처를 계속 빌드해 왔습니다.
기본 레이어를 올바르게 설정하기 위해 API는 실험 단계로 유지되며 호환성이 깨지는 변경사항이 발생할 수 있습니다.
런타임 최적화
키가 지정된 SideEffect 오버로드
이제 SideEffect가 키 인수를 지원하므로 특정 키가 변경될 때마다 일회성 부작용을 발생시킬 수 있습니다. 코루틴이나 dispose 블록이 필요하지 않은 경우 LaunchedEffect 또는 DisposableEffect 을 사용하는 것보다 성능이 더 나을 수 있습니다. SideEffect는 LaunchedEffect보다 최대 90% 빠르고 DisposableEffect보다 약 20% 빠릅니다. SideEffect는 DisposableEffect 및 LaunchedEffect 전에 효과를 실행하므로 기존 효과를 이 API로 이전하는 경우, 특히 현재 프레임이 완료된 후에 디스패치되는 데 의존하는 LaunchedEffects의 경우 주의하세요.
@Composable fun AnalyticsTracker(userId: String, screenName: String) { SideEffect(key1 = userId, key2 = screenName) { analytics.logScreenView(userId, screenName) } }
애니메이션
DeferredTargetAnimation이 실험 상태에서 졸업했습니다.
양방향 2단계 전환
- 새 컴포저블:
DeferredAnimatedContent및DeferredAnimatedVisibility를 사용하면 뒤로 탐색 예측 동작 추적과 같은 유쾌한 2단계 전환을 만들 수 있습니다. - 수동 애니메이션 제어: 전환의 지연된 단계에서 이제 애니메이션 속성 (예: 스케일 또는 오프셋)을 실시간으로 수동으로 조작할 수 있습니다 (예: 스와이프 동작 추적).
- 원활한 인계: 지연된 단계가 끝나면 전환 엔진이 인계받아 속도 전송을 비롯한 원활한 인계를 자동 전환으로 실행합니다.
- 공유 요소 지원:
SharedContentConfig의 새로운permitTransformDuringDeferredTransition플래그는 지연된 전환 단계에서 공유 요소가 상위 컨테이너와 함께 시각적으로 변환되는지 여부를 제어합니다.
val state = remember { DeferredTransitionState(initialScreen) } val transition = rememberDeferredTransition(state) if (predictiveBackInProgress) { state.defer(targetScreen) } else { state.animateTo(targetScreen) } transition.DeferredAnimatedContent( targetState = targetScreen, mutableTransformSpec = { MutableContentTransform { // Manually manipulate properties during the deferred phase initialContentTransform { scale = swipeProgress } } } ) { screen -> ScreenContent(screen) }
아래는 동작 기반 애니메이션이 트리거된 애니메이션에 전달되는 사용 사례의 두 데모입니다.
텍스트, 입력, 플랫폼 통합
수정 가능한 텍스트 형식 지정
새 API는 BasicTextField의 수정 가능한 텍스트에 서식 있는 텍스트 형식을 제공합니다. 이제 TextFieldBuffer 범위 (예: textFieldState.edit { ... } 또는 InputTransformation 내부) 내에서 새로운 addStyle() 메서드를 통해 SpanStyle 및 ParagraphStyle를 사용하여 인라인 문자 및 단락 서식을 프로그래매틱 방식으로 적용하고 조작할 수 있습니다. 또한 TextFieldBuffer는 TrackedRange 객체를 반환하는 getSpanStyles() 및 getParagraphStyles() API를 제공하므로 적용된 스타일을 읽거나, 업데이트하거나, 삭제할 수 있습니다. 서식 생성 기능을 보완하기 위해 이제 TextFieldState는 범위에서 활성 스타일을 쿼리하는 읽기 전용 textStyles 속성을 노출하고 TextFieldBuffer는 수정 전에 서식 상태를 검사하는 originalTextStyles를 제공합니다. 텍스트 서식과 맞춤 주석은 구성 변경 시 유지됩니다.
val state = rememberTextFieldState("Formatted text in Compose 1.12") // Apply bold and color styles to a range of text state.edit { addStyle( SpanStyle(fontWeight = FontWeight.Bold, color = Color.Blue), start = 0, end = 9 ) } // Query active styles from TextFieldState val currentStyles = state.textStyles
텍스트 선택
새로운 SelectionState API는 SelectionContainer 내에서 텍스트 선택에 대한 프로그래매틱 제어 및 관측 가능성을 제공합니다. rememberSelectionState()을 통해 SelectionState 객체를 호이스팅하고 SelectionContainer에 전달하면 selectedTexts이 AnnotatedStrings의 반응형 목록으로 노출되고 selectAll(), clear(), select(TextRange), extendSelectionByWord()과 같은 메서드가 제공됩니다.
또한 getSelectableTexts()를 사용하여 레이아웃 순서대로 선택 가능한 모든 텍스트 항목을 검색하고 전역 범위를 사용하여 SelectionContainer의 컴포저블 전체에서 텍스트를 선택합니다.
@Composable fun ProgrammaticSelectionExample() { val selectionState = rememberSelectionState() Column { Button( onClick = { selectionState.selectAll() }, modifier = Modifier.disableSelectionClearOnTap() ) { Text("Select All") } SelectionContainer(state = selectionState) { Text("Text content to be selected programmatically.") } } }
인증 관리자 통합
이제 Compose 텍스트 필드가 자동 완성 프레임워크를 통해 Android의 인증 관리자 (API 34 이상)와 기본적으로 통합됩니다 (API 34 미만은 androidx.credentials library에서 처리). 새로운 credentialRequest 시맨틱 속성을 CredentialRequestData와 함께 연결하면 텍스트 입력이 사용자 입력 흐름 내에서 직접 패스키, 저장된 사용자 인증 정보 또는 로그인 요청을 표시할 수 있습니다.
@Composable fun LoginField(textFieldState: TextFieldState) { val credentialData = remember { CredentialRequestData( // Specify Credential Manager request options ) } BasicTextField( state = textFieldState, modifier = Modifier.semantics { credentialRequest = credentialData } ) }
기타 주요 변경사항:
- 다운로드 가능한 글꼴에서 글꼴 변형 설정 지원
SelectionContainer에서 텍스트 선택을 뷰포트 너머로 드래그할 때 자동 스크롤이 사용 설정되었습니다.- 선택 해제를 허용하는 새로운
SoundEffectOnInteraction컴포저블을 사용하여 Compose 구성요소에 자동 상호작용 사운드 (클릭 및 포커스 탐색) 지원이 추가되었습니다. 이 변경사항의 결과로 이제 시맨틱 클릭 리스너를 기본 스레드에서 호출해야 하며, 이는 일부 테스트 사례에 영향을 미칠 수 있습니다. KeyboardType에 이제Date,Time,DateTime,SignedDecimal가 포함됩니다.- 이제
BasicSecureTextField는 기본적으로TextObfuscationMode.System를 사용하고RevealLastTyped는 절대 재정의로 사용됩니다.
레이아웃 개선사항
그리드 레이아웃의 명명된 영역
이제 @Experimental Grid 구성요소의 명명된 영역을 사용하여 복잡한 2D 레이아웃을 더 쉽게 빌드할 수 있습니다. 항목 전체에서 숫자 열 및 행 색인을 관리하는 대신 GridConfigurationScope에서 시맨틱 영역을 정의하고 영역 이름으로 컴포저블을 배치할 수 있습니다.
@OptIn(ExperimentalGridApi::class) @Composable fun DashboardLayout() { Grid( config = { area("header", row = 0, column = 0, rowSpan = 1, columnSpan = 2) area("sidebar", row = 1, column = 0) area("content", row = 1, column = 1) gap(16.dp) } ) { HeaderSection(modifier = Modifier.gridItem(areaId = "header")) NavigationSidebar(modifier = Modifier.gridItem(areaId = "sidebar")) MainContentView(modifier = Modifier.gridItem(areaId = "content")) } }
자세한 내용은 문서를 참고하세요.
성능
모든 출시와 마찬가지로 프레임워크를 통해 아름답고 성능이 우수한 앱을 빌드할 수 있도록 Compose의 성능에 계속 투자하고 있습니다. 이번 출시에서는 시작 성능 개선에 중점을 두었으며 이제 벤치마크에서 뷰와 비슷한 처음 표시하는 데 걸린 시간 (앱이 첫 번째 프레임을 생성하는 데 걸리는 시간)을 확인할 수 있습니다.
테스트 및 도구 업그레이드
동기화 테스트
Compose 1.12에서는 테스트 실행 시간을 줄이고 상태 샘플링 중 불안정성을 없애도록 설계된 새로운 테스트 API를 도입합니다.
hasPendingWork: 시계를 진행하지 않고 UI에 대기 중인 작업이 있는지 수동으로 확인합니다. 수동 애니메이션 루프에 적합합니다.runWithoutImplicitWait: 수동 시계 프레임 (예: 애니메이션 테스트)을 단계별로 실행할 때 암시적 동기화를 일시적으로 사용 중지합니다.
@Test fun testAnimationStateFast() { composeTestRule.mainClock.autoAdvance = false while (composeTestRule.hasPendingWork()) { composeTestRule.mainClock.advanceTimeByFrame() composeTestRule.waitForIdle() composeTestRule.runOnUiThread { composeTestRule.runWithoutImplicitWait { // This is most effective when querying multiple nodes in a single frame. // It prevents the redundant synchronization overhead that would // otherwise occur on every individual query. val box1 = composeTestRule.onNodeWithTag("Box1").fetchSemanticsNode() val box2 = composeTestRule.onNodeWithTag("Box2").fetchSemanticsNode() assertThat(box1.boundsInRoot.right).isAtMost(box2.boundsInRoot.left) } } } }
기타 주요 변경사항:
- 이제
captureToImageAPI를 사용하면 팝업 또는 대화상자를 앵커와 함께 단일 비트맵으로 캡처할 수 있습니다. - Compose 시맨틱 검색의 범위를 특정 Android 뷰로 지정하기 위해
onRootWithViewInteraction가 추가되었습니다. 이렇게 하면 프로덕션 코드에 고유한 테스트 태그가 필요하지 않으므로RecyclerViews와 같은 하이브리드 UI를 간편하게 테스트할 수 있습니다. - 이제
@PreviewWrapper주석을 맞춤@MultiPreview클래스에 적용하여 여러 구성요소에서 재사용 가능한 미리보기 설정 (예: 맞춤 테마)을 사용할 수 있습니다.
즐겁게 작성해 보세요.
Compose 1.12를 사용하면 메시 그라데이션, 넓은 색상 범위 지원, 다운로드 가능한 가변 글꼴, 인증 관리자 통합, 더 빠른 테스트 도구를 통해 그 어느 때보다 쉽고 표현력 있게 앱을 개발할 수 있습니다. 언제나 그렇듯이 Google은 여러분의 의견을 소중히 생각합니다. 이러한 변경사항에 대한 의견이나 다음에 보고 싶은 기능을 문제 추적기에 공유해 주세요. 즐겁게 작성해 보세요.
-
제품 뉴스Googlebook은 공유 Android 기반으로 빌드된 새로운 카테고리의 노트북을 도입합니다. HP, Dell, Lenovo, Acer, Asus와 같은 파트너의 고성능 하드웨어는 모바일의 편리함과 데스크톱의 성능을 결합합니다.
Fahd Imtiaz, Loryn Hairston • 읽는 데 4분 소요 -
제품 뉴스Pixel 11 Pro Fold, Pixel Watch 5, 전체 Pixel 제품군이 출시되면서 사용자는 다양한 화면 크기, 고유한 자세, 지능형 환경을 원활하게 이동할 수 있습니다.
-
제품 뉴스오늘 Jetpack Compose 1.0 출시 5주년을 공식적으로 기념합니다. 2021년 7월 28일에 발표된 버전 1.0부터 최신 1.11 버전에 이르기까지 API는 수년에 걸쳐 크게 발전해 왔으며, 이를 기념하고자 합니다.
Rebecca Franks, Nick Butcher, Loryn Hairston • 읽는 데 4분 소요
Android 개발 관련 최신 정보를 이메일로 받아 보세요.