오늘 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) )
자세한 내용과 예시는 문서를 참고하세요.
폭넓은 색상 영역 및 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에서 Google은 구성요소의 스타일을 지정하는 통합된 고성능 방법인 Compose 스타일 API에 관한 초기 비전을 공유했습니다. 그 이후로 엄격한 유형 안전성과 예측 가능한 정확성을 보장하고 맞춤 디자인 시스템 빌드를 지원하기 위해 기본 아키텍처를 계속 빌드해 왔습니다.
이 기본 레이어가 올바른지 확인하기 위해 API는 실험용으로 유지되며 브레이킹 체인지가 있을 수 있습니다.
런타임 최적화
키가 지정된 SideEffect 오버로드
SideEffect는 이제 특정 키가 변경될 때마다 일회성 부작용을 발생시킬 수 있는 키 인수를 지원합니다. 코루틴 또는 삭제 블록이 필요하지 않은 경우 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 범위 내의 새 addStyle() 메서드 (예: textFieldState.edit { ... } 또는 InputTransformation 내부)를 통해 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 이상은 androidx.credentials library에서 처리)와 기본적으로 통합됩니다. CredentialRequestData를 사용하여 새 credentialRequest 시맨틱스 속성을 연결하면 텍스트 입력이 사용자 입력 흐름 내에서 직접 패스키, 저장된 사용자 인증 정보 또는 로그인 요청을 표시할 수 있습니다.
@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")) } }
자세한 내용은 문서를 참고하세요.
성능
모든 출시와 마찬가지로 Google은 프레임워크가 아름답고 성능이 우수한 앱을 빌드하는 데 도움이 되도록 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은 여러분의 의견을 소중히 여기므로 이러한 변경사항 또는 문제 추적기에서 다음에 보고 싶은 사항에 관한 의견을 공유해 주세요. 즐겁게 작성해 보세요.
-
제품 소식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분 -
2026년 5월 19일2026년 5월 19일
제품 소식Jetpack Compose가 출시된 지 거의 5년이 지난 지금, Google은 다양한 Android 기기에서 멋진 UI를 빌드하는 데 필요한 모든 기능, 성능, 도구를 제공하는 데 투자해 왔습니다.
Nick Butcher • 전문 길이: 2분
Android 개발 관련 최신 정보를 이메일로 받아 보세요. 매주