[번역]What’s new in the Jetpack Compose August ’23 release

개인 지성·2023년 8월 11일
0

번역

목록 보기
2/2
post-thumbnail

개요

곧 출시될 8월의 컴포즈 Bill of Materials의 일환으로 젯팩 컴포즈 1.5를 출시한다. 젯팩 컴포즈는 플레이 스토어, 드롭박스, 에어비앤비와 같은 앱에서 사용되는 안드로이드의 현대적이고 네이티브한 UI 툴이다. 이번 업데이트에는 주로 성능 개선에 중점을 두었으며, 2022년 10월 업데이트부터 시작한 모디파이어 리팩토링이 이번 업데이트에 적용됐다.

2021년 컴포즈 1.0에서는 올바른 표준 api 구축하여 안정적인 기반을 제공하는데 중점을 두었다. 구글은 더 강한 양질의 api를 필요로 했으며, 사용이 쉽고 안정적이어서 개발자들이 프로덕션 환경에서 사용할 수 있도록 했다. 지속적인 api 개선에서 성능 향상은 최우선이며, 이번 업데이트에서는 많은 성능 개선 사항이 도입됐다.

모디파이어 성능

상술한 바와 같이 이번 업데이트에서 대규모 성능 개선이 이루어졌는데 컴포지션(앱 ui를 설정하고 컴포저블을 실행하여 재생성하는 일련의 과정) 시간이 최대 80% 단축됐다. 이는 컴포즈 첫 출시에 표준 api가 올바르게 구축되어 나타난 결과이며, 컴포즈로 작성된 앱 대부분이 이러한 이점을 누릴 수 있다.

구글에서는 성능 회귀를 모니터링하고, 성능 향상 투자에 이용되는 벤치마크 스위트를 보유 중이다. 초기 1.0 배포 이후에는 무엇을 개선할 수 있는가에 중점을 두었고, 벤치마크를 예상보다 더 많은 시간을 투자해 모디파이어를 구체화하고 있음을 알 수 있었다. 모디파이어는 컴포즈 트리 대부분을 차지하며, 이로 인해 컴포즈의 컴포지션 시간에서 가장 많은 부분을 차지하게 됐다. 더 효율적인 디자인으로 모디파이어를 리팩토링한 작업은 2022년 10월에 출시됐다.

2022년 10월 업데이트에서는 최하위 모듈인 컴포즈 ui에서 신규 api 출시와 성능 개선이 이루어졌다. 모디파이어는 서로 빌드되기에 다음 배포(2023년 3월)애서는 컴포즈 파운데이션에서 최하위 모디파이어의 마이그레이션을 시작했다. 해당 작업에는 graphicsLayer, 최하위 포커스 모디파이어, paddingoffset이 포함되어 있다. 이러한 최하위 모디파이어들은 Clickable과 같은 많은 모디파이어들에 의해 사용되며, Text와 같이 프레임워크 컴포저블에서도 사용된다. 2023년 3월 업데이트에서 모디파이어를 이전하면 이러한 컴포넌트에 성능 개선이 이루어질 수 있지만, 실제로 큰 효과를 볼 수 있는 것은 고수준의 모디파이어들과 컴포저블 자체를 신규 모디파이어 시스템으로 이전할 때이다.

이번 업데이트에서는 Clickable 모디파이어를 신규 모디파이어 시스템으로 마이그레이션하기 시작하여 컴포지션 시간이 최대 80% 단축됐다. 특히 버튼과 같이 클릭 가능한 요소를 포함하는 지연 목록(lazy list)에서 유용하다. Clickable에서 사용되는 Modifier.indication은 아직 마이그레이션 단계에 있으며, 향후 업데이트에 추가적인 개선이 있을 것으로 예상된다.

이 작업의 일환으로 원래 리팩토링에서 다루지 않은 composed 모디파이어에 대한 사용 사례를 확인하고, CompositionLocal 인스턴스를 사용하는 Modifier.Node를 생성하기 위한 신규 api를 추가했다.

현재 자신의 모디파이어를 신규 Modifier.Node api로 마이그레이션 절차에 관한 문서는 미작성 상태이며, 마이그레이션을 하려면 샘플 코드를 참고하길 바란다.

변경 사항에 대한 자세한 내용은 Android Dev Summit '22의 Compose Modifiers deep dive를 확인하실 바란다.

메모리

이번 업데이트에는 메모리 사용에 대한 여러 개선 사항이 포함되어 있다. 다양한 컴포즈 api 간에 발생하는 할당을 조사하여 많은 영역, 특히 그래픽 스택과 벡터 리소스를 불러올 때 총 할당량을 감소시켰다. 이는 컴포즈의 메모리 풋프린트를 줄일 뿐만 아니라, 메모리 할당 시간을 줄이고 가비지 수집을 감소시켜 성능이 직접적으로 향상됐다.

또한, ComposeView를 사용할 때 발생하는 메모리 누수에 대해 개선을 진행했다. 이로 인해 모든 앱은 긍정적인 영향을 받을 것이며, 특히 멀티 액티비티 아키텍처나 대량의 view/compose 상호 운용을 사용하는 앱에 큰 이점으로 다가올 것이다.

Text

BasicText는 모디파이어 작업을 지원하는 신규 렌더링 시스템으로 이동됐으며, 이로 인해 초기 컴포지션 시간이 평균적으로 22% 감소했으며, 텍스트가 포함된 복잡한 레이아웃의 한 벤치마크에서는 최대 70%까지 감소되었다.

다음을 포함한 여러 텍스트 관련 api가 안정화됐다.

  • TextMeasurer와 그에 관한 api
  • LineHeightStyle.Alignment (topRatio)
  • Brush
  • DrawStyle
  • TextMotion
  • DrawScope.drawText
  • Paragraph.paint (brush, drawStyle, blendMode)
  • MultiParagraph.paint (brush, drawStyle, blendMode)
  • PlatformTextInput

핵심 기능에 대한 개선 및 수정

이번 업데이트에는 상술한 기능 외에도 핵심 api의 신규 기능과 개선점도 존재한다.

  • LazyStaggeredGrid 안정화
  • toComposePaint를 대체하는 asComposePaint api가 추가됐으며, 리턴된 객체는 원본 android.graphics.Paint를 래핑하기 위해 사용된다.
  • SubcomposeLayout에 선행 검사를 지원하는 IntermediateMeasurePolicy 추가
  • 소프트 키보드가 나타나기 전에 키 이벤트를 가로채는 onInterceptKeyBeforeSoftKeyboard 모디파이어 추가

원문

1개의 댓글

comment-user-thumbnail
2023년 8월 11일

좋은 정보 얻어갑니다, 감사합니다.

답글 달기