Android Jetpack은 Modern Android Development의 핵심 영역입니다. Jetpack은 100개 이상의 라이브러리, 도구 및 가이드라인 모음으로 개발자 여러분이 권장 사항을 준수하고 상용구 코드를 줄이도록 도우며, 모든 Android 버전 및 기기에서 일관되게 작동하는 코드를 작성하도록 지원하여 앱 고유 기능을 구축하는 데 집중할 수 있게 합니다.
Google Play의 대부분의 앱은 앱 아키텍처에 Jetpack을 사용합니다. 현재 상위 1,000개의 앱 중 90% 이상이 Jetpack을 사용합니다.
지금부터 I/O 세션 Jetpack에 관한 새로운 소식에서 다룬 Jetpack의 최신 업데이트 중 핵심 내용을 알려드리겠습니다.
Jetpack의 주요 영역 업데이트 세 가지는 다음과 같습니다.
아키텍처 라이브러리 및 가이드라인
애플리케이션 성능 최적화
사용자 인터페이스 라이브러리 및 가이드라인
그리고 기타 주요 업데이트 사항을 마지막으로 소개해드리겠습니다.
1. 아키텍처 라이브러리 및 가이드라인
앱 아키텍처 라이브러리 및 구성요소를 통해 견고하고 테스트 및 유지보수가 수월한 앱을 만들 수 있습니다.
데이터 지속성
Room은 권장 데이터 지속성 라이브러리로 SQLite에 추상화 계층을 제공하여 플랫폼의 사용성과 안정성을 증가시킵니다.
Room 2.4에서는 Kotlin Symbol Processing(KSP)이 정식으로 지원됩니다. KSP는 Kotlin 코드를 벤치마킹했을 때 KAPT보다 2배 향상된 속도를 보여주었습니다. Room 2.4는 기본적으로 Enum과 RxJava3, 그리고 Kotlin 1.6까지 완벽히 지원합니다.
Room 2.5에서는 완전한 Kotlin으로 재작성한 버전이 포함되어 있습니다. Java 프로그래밍 언어로 작성된 이전 버전과 바이너리 호환이 가능하며, 향후 Kotlin 관련 개선의 발판을 마련할 수 있습니다. Room 2.5는 Room 쿼리를 PagingSource 객체로 반환하게 하는 room-paging 아티팩트를 통해 Paging 3.0도 기본 지원 합니다. 또한, Room에서 멀티매핑(nested map, array) 반환 유형을 사용하는 관계형 쿼리 메서드를 지원하기 때문에 개발자는 추가 데이터 구조를 정의하지 않고도 JOIN 쿼리를 수행할 수 있습니다.
멀티매핑 반환 유형을 사용하는 관계형 쿼리 메서드
AutoMigrations 업데이트로 데이터베이스 마이그레이션을 단순화했고, 추가 Annotation과 속성도 지원합니다. @Database Annotation에 대한 새로운 AutoMigration 속성으로 자동 마이그레이션 전후 버전을 선언할 수 있습니다. Room에서 테이블과 열 수정에 관한 추가 정보가 필요하면 @AutoMigration Annotation으로 입력 데이터를 지정할 수 있습니다.
DataStore
DataStore 라이브러리는 SharedPreferences 관련 문제를 해결하는 강력한 데이터 저장소 솔루션입니다. 다양한 SharedPreferences 사용 사례를 대체할 이 강력한 솔루션 활용 방법을 자세히 확인하시려면 Modern Android Development 기술: DataStore에서 몇 가지 영상과 게시글을 참고하시기 바랍니다. 앱의 라이브러리 사용 테스트, 종속성 주입 사용, SharedPreference에서 Proto DataStore로 마이그레이션하는 방법에 관한 가이드라인까지 확인할 수 있습니다.
증분 데이터 가져오기
Paging 라이브러리로 작은 데이터 청크를 로드하고 표시하여, 네트워크와 시스템 리소스 소모를 줄일 수 있습니다. RecyclerViews나 Compose lazy list 내에서 앱 데이터를 점진적으로 매끄럽게 로드할 수 있습니다.
Paging 3.1에서는 Rx와 Guava 통합을 안정적으로 지원하여 Paging의 기본 Kotlin 코루틴 사용을 Java로 대체할 수 있습니다. 또한, 새로운 반환 유형인 LoadResult.Invalid로 무효화 경합 상태 처리를 향상하여 무효화됐거나 오래된 데이터를 대신하도록 했습니다. 새로운 onPagesPresented API와 addOnPagesUpdatedListener로 빈 페이지에서 노옵스(no-ops) 로드와 실행 처리도 개선했습니다.
Paging 3에 관한 자세한 내용은 Android 개발자 사이트에서 새롭게 간소화한 Paging Basics Codelab을 참고하시고, Paging 라이브러리를 목록화한 앱으로 통합하는 법도 확인하시기 바랍니다.
앱 Navigation 모델로 정의
Navigation 라이브러리는 앱 내 대상 간 이동을 위한 프레임워크입니다.
Composable 기능을 앱 내 대상으로 허용하는 새로운 navigation-compose 아티팩트로 Navigation 구성요소를 Jetpack Compose에 통합했습니다.
다중 백 스택 기능을 개선하여 상태를 더 쉽게 기억하도록 만들었습니다. NavigationUI가 표시된 대상의 상태를 자동으로 저장하고 복원하여 개발자는 코드를 바꾸지 않고도 다중 백 스택을 지원할 수 있습니다.
navigation-fragment 아티팩트로 AbstractListDetailFragment에서 사전에 구축한 2개의 Window 레이아웃 구현을 제공하여 대화면 지원을 강화했습니다. 이 프래그먼트는 SlidingPaneLayout으로 목록 창(서브클래스로 처리)과 NavHostFragment를 사용하는 세부정보 창을 관리합니다.
모든 Navigation 아티팩트를 Kotlin으로 재작성하여 제네릭을 사용하는 클래스(예: NavType 서브클래스)의 null 허용 여부를 개선했습니다.
꼼꼼한 아키텍처 가이드라인
주요 아키텍처 라이브러리가 함께 작동하는 방식은 Modern Android Development 기술: 아키텍처에서 Modern Android Development 권장사항을 다룬 영상과 개발자 문서를 통해 확인해 보세요.
2. 애플리케이션 성능 최적화
성능 라이브러리로 성능 기준에 적합한 앱을 구축하고, 고성능 유지를 위한 최적화 방식을 찾아 최종 사용자에게 더 나은 경험을 제공할 수 있습니다.
시작 시간 개선
앱 속도는 특히 앱 설치 직후 앱을 사용할 때 사용자 경험에 크게 영향을 미칩니다. 이 첫 경험을 개선하기 위해 Baseline Profiles을 만들었습니다. Baseline Profiles에서는 AOT 컴파일을 우선적으로 처리하는 코드 경로에 대한 메타데이터를 활용해, 앱과 라이브러리에서 Android 런타임을 확보합니다. 모든 라이브러리에서 집계된 프로필 데이터는 앱의 APK에 basline.prof 파일로 전달되고, 이 파일은 앱 설치 시 앱과 앱의 정적 라이브러리 코드를 부분적으로 사전 컴파일 하는 데 사용합니다. 이를 통해 앱 로딩이 빨라지고 사용자가 앱과 처음 상호 작용 할 때 마주하는 누락된 프레임을 줄일 수 있습니다.
저희는 이미 Google에 Baseline Profiles을 활용하기 시작했습니다. Play 스토어 앱에서는 Baseline Profiles을 적용한 이후 검색 결과 페이지에서 초기 페이지 렌더링 시간이 40% 감소했습니다. 또한, Baseline Profiles에 Fragments와 Compose처럼 자주 사용하는 라이브러리를 추가해 최종 사용자에게 더 나은 경험을 제공할 수 있습니다. 여러분만의 Baseline Profiles을 생성하려면 Macrobenchmark 라이브러리를 사용해 보세요.
애플리케이션 계측
Macrobenchmark 라이브러리는 개발자가 앱 성능을 잘 이해할 수 있도록 Jetpack의 벤치마킹 범위를 앱 시작, RecyclerView 스크롤이나 애니메이션 재생과 같은 통합된 UI 운영 등 더 복잡한 사용 사례까지 확장했습니다. Baseline Profiles을 생성하는 데도 Macrobenchmark를 사용할 수 있습니다.
Macrobenchmark의 테스트 속도를 향상하고 새로운 실험용 기능을 추가했습니다. TraceSectionMetric을 사용한 트레이스 기반의 타이밍 맞춤 측정도 지원하여 개발자는 코드의 특정 부분을 벤치마킹할 수 있습니다. 또한, AudioUnderrunMetric으로 오디오 버퍼 언더런을 감지하여 오디오의 버벅거림을 확인할 수 있습니다.
BaselineProfileRule로 런타임을 최적화에 도움이 되는 프로필을 생성합니다. BaselineProfileRule은 다른 매크로 벤치마크와 비슷하게 작동하여 람다 내 코드로 사용자 작업을 나타냅니다. 아래 예시에서 컴파일러가 AOT를 최적화해야 하는 중요한 사용자 여정은 런처에서 앱을 처음부터 시작하는 콜드 스타트입니다.
Macrobenchmark로 Baseline Profiles을 생성하고 만드는 방법은 Android 개발자 사이트에 게시된 사용자 가이드를 참고하시기 바랍니다.
UI 버벅거림 피하기
새로운 JankStats 라이브러리로 앱 UI의 성능 문제를 추적하고 분석하며 누락된 렌더링 프레임, 일명 “버벅거림"을 보고합니다. JankStats는 Android 플랫폼의 기존 API(예: FrameMetrics)를 기반으로 구축했지만 API 수준 16부터 사용할 수 있습니다.
이 라이브러리에는 플랫폼에 구축된 기본 기능 이외에도 추가 기능이 있습니다. 휴리스틱으로 누락된 프레임의 원인을 정확히 찾고, UI 상태로 보고서에 추가적인 맥락을 제공하며, 보고 콜백으로 분석용 데이터를 업로드할 수 있습니다.
JankStats의 주요 기능 세 가지를 자세히 살펴보겠습니다.
버벅거림 확인: 이 라이브러리는 내부 휴리스틱을 사용하여 버벅거림이 발생한 시점을 확인하고, 개발자가 문제를 분석하고 수정하는 데 필요한 정보를 얻을 수 있도록 버벅거림 보고서를 발행할 시점을 결정합니다.
UI 맥락 제공: 버벅거림 보고서가 더 유용하도록 라이브러리는 UI와 사용자의 현재 상태를 추적하는 메커니즘을 제공합니다. 보고서를 기록할 때마다 제공되는 정보로 문제가 발생한 시점과 그 시점에 사용자가 실행한 작업을 확인해 앱의 문제 영역을 찾을 수 있습니다. 일부 상태는 여러 가지 Jetpack 라이브러리를 통해 자동으로 제공되지만, 개발자도 자체 앱별 상태를 제출해야 합니다.
결과 보고: 매 프레임마다 리스너를 통해 JankStats 클라이언트에 프레임 정보와 프레임 완료에 걸리는 시간, 버벅거림으로 간주해야 하는지 여부, 프레임 중 맥락 정보를 통보합니다. 클라이언트는 전체 성능 문제를 디버깅하는 데 도움이 될 만한 분석이라면 데이터를 집계하고 업로드하는 것이 좋습니다.
앱에 로깅 추가
Tracing 라이브러리로 시스템 버퍼에 트레이스 이벤트를 작성하여 앱 성능을 프로파일링할 수 있습니다. Tracing 1.1은 API Level 29에 추가한 <profileable> 매니페스트 태그와 비슷하게 API Level 14부터 비 디버그 빌드 내에서 프로파일링을 지원합니다.
3. 사용자 인터페이스 라이브러리 및 가이드라인
UI 라이브러리에 몇 가지 변화를 주어 대화면 기기 호환성, 폴더블 기기, 그림 Emoji를 더 훌륭하게 지원합니다.
Jetpack Compose
Jetpack Compose는 네이티브 UI를 구축하는 최신 Android 툴킷으로 최근 출시된 1.2 베타 버전에 몇 가지 기능을 추가하여 다운로드 가능한 글꼴, 지연 레이아웃, 중첩 스크롤 상호 운용 등 고급 사용 사례를 지원합니다. 자세한 내용은 Jetpack Compose에 관한 새로운 소식에서 확인해 보세요.
Window 상태 이해
새로운 WindowManager 라이브러리에서는 API Level 14부터 공통 API 노출 영역을 제공하여 개발자는 멀티 윈도우 환경과 새로운 기기 폼 팩터를 앱에 지원할 수 있습니다.
초기 버전은 콘텐츠가 보이는 방식에 영향을 주는 물리적 속성 쿼리를 포함해 폴더블 기기 사용 사례에 초점을 두었습니다.
Jetpack의 SlidingPaneLayout 구성요소를 WindowManager의 깔끔한 레이아웃 API를 사용하도록 업데이트하여 콘텐츠가 물리적 힌지처럼 접힌 영역에는 놓이지 않습니다.
드래그 앤 드롭
새로운 DragAndDrop 라이브러리는 개발자가 앱 내부와 외부에서 드래그 앤 드롭 데이터를 허용하도록 하여 새 폼 팩터와 윈도잉 모드를 지원합니다. DragAndDrop은 일관된 드롭 타겟 어포던스를 포함하며 API Level 24부터 지원합니다.
새 API를 이전 API Level 수준으로 백포팅하기
AppCompat 라이브러리로 이전 API 버전의 플랫폼에서 어두운 모드와 같은 UI 기능의 백포트를 포함해 새 API에 접근합니다.
AppCompat 1.4는 Emoji2 라이브러리를 통합하여 API Level 14 이상의 AppCompat가 지원하는 텍스트 기반 뷰에서는 새로운 그림 이모티콘을 기본으로 지원합니다.
맞춤 로케일 모음은 API Level 14부터 지원합니다. 이 기능으로 앱을 시작하면서 로케일 설정을 수동으로 지속할 수 있고, 서비스 메타데이터 플래그를 통해 자동으로도 지속할 수 있습니다. 또한 로케일을 동기적으로 로드하고 필요한 경우 실행 중인 Activity를 재생성하도록 명령합니다. API Level 33 이상에서는 추가 오버헤드 없이 플랫폼에서 지속성을 관리합니다.
기타 주요 업데이트
Annotation
Annotation 라이브러리는 도구 및 다른 개발자가 앱 코드를 이해하는 데 도움이 되는 메타데이터를 표시합니다. 린트 검사와 쌍을 이루는 @NonNull과 같은 일반적인 Annotation을 제공하여 코드의 정확성과 유용성을 개선합니다.
Annotation을 Kotlin으로 마이그레이션하고 있어 Kotlin을 사용하는 개발자는 @file을 포함해 더 적절한 Annotation 타겟을 곧 확인할 수 있습니다.
요청이 많았던 몇 가지 Annotation을 해당 린트 검사와 함께 추가했습니다. 여기에는 메서드나 기능 재정의 관련 Annotation과 @RequiresAPI에 결과를 제공하고 특정 API Level부터는 사용하지 않는 @DeprecatedSinceAPI Annotation이 포함됩니다.
Github
현재 저희는 Github에 100개 이상의 프로젝트를 공유했습니다! 몇 가지 모듈은 일반적인 Github 기반 워크플로를 사용하는 개발자분들께 오픈소스 기여를 받고 있습니다.
Activity
AppCompat
Biometric
Collection
Compose Compiler
Compose Runtime
Core
DataStore
프래그먼트
Lifecycle
Navigation
Paging
Room
WorkManager
랜딩 페이지에서 저희가 pull request를 어떻게 처리하는지 더 자세히 확인하고, Jetpack 라이브러리로 앱을 구축해 보세요.
지금까지 지난 몇 달간 달라진 Jetpack을 간단히 살펴봤습니다. Jetpack의 각 라이브러리에 관한 자세한 내용은 AndroidX 출시 노트를 참고해주시고, 관련 라이브러리를 빠르게 검색하려면 API 검색 도구를 이용하시기 바랍니다. 추가적인 주요 사항은 Google I/O 세션 영상에서 확인하실 수 있습니다.
자바는 Oracle 및/또는 Oracle 계열사의 상표 혹은 등록 상표입니다.