곧 출시될 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
, 최하위 포커스 모디파이어, padding
과 offset
이 포함되어 있다. 이러한 최하위 모디파이어들은 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 상호 운용을 사용하는 앱에 큰 이점으로 다가올 것이다.
BasicText
는 모디파이어 작업을 지원하는 신규 렌더링 시스템으로 이동됐으며, 이로 인해 초기 컴포지션 시간이 평균적으로 22% 감소했으며, 텍스트가 포함된 복잡한 레이아웃의 한 벤치마크에서는 최대 70%까지 감소되었다.
다음을 포함한 여러 텍스트 관련 api가 안정화됐다.
TextMeasurer
와 그에 관한 apiLineHeightStyle.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 추가
좋은 정보 얻어갑니다, 감사합니다.