작성자: Florina Muntenescu, Android Developer Advocate
이 글의 원문은 여기서 확인할 수 있으며 블로그 리뷰에는 이승민(GDE)님이 참여해주셨습니다.
Android Jetpack은 개발자가 모범 사례를 따르고 중복코드를 줄이는 한편, 여러 Android 버전 및 기기에서 일관되게 작동하는 코드를 작성하도록 돕는 라이브러리, 도구, 가이드 모음입니다. 현재 Google Play의 상위 1,000개 앱 중 84%가 Jetpack을 사용하고 있습니다.
Jetpack 최신 업데이트를 간략하게 설명해드리겠습니다. 앞서 공개된 아래의 I/O 영상세션의 확장판이라고도 할 수 있습니다.
안정화 관련 최신 소식
CameraX
CameraX 라이브러리는 기기별 호환성 수정 및 우회 방법 등, 여러 OS 버전에서 카메라 기능에 액세스할 수 있는 통합 API 화면을 제공합니다. 라이브러리의 몇 가지 최신 개선 사항에서는 노출 보정 지원, 카메라 상태 및 기능의 상세한 정보에 대한 액세스 등을 비롯한 일반적인 기능 요청을 해결하였습니다. 아울러 FPS 범위 등의 카메라 설정도 카메라 실행 중 Camera2Interop을 통해 변경할 수 있습니다. 이 라이브러리에는 HDR 미리보기, 확대/축소 비율 제어, Android의 방해 금지 모드에 대한 지원 등을 포함하여 최신 기기 및 OS 기능에 대한 지원도 포함됩니다. 그러나 무엇보다 가장 중요한 것은 라이브러리가 계속해서 성능을 개선함으로써 구형 기기에서 더욱 빠른 이미지 캡처 및 초기화가 가능해진 부분입니다.
Hilt
Hilt는 Dagger를 기반으로 빌드된 Jetpack의 권장 종속 항목 삽입 솔루션입니다. 안정화 전환의 일환으로 Hilt의 ViewModel 지원이 코어 Hilt Android API로 이동되었으며 SaveStateHandle이 ViewModelComponent에서 이용할 수 있는 기본 종속 항목으로 추가되었습니다. 게다가 이제 Hilt가 Navigation 및 Compose와 통합됩니다. 목적지 또는 내비게이션 그래프 자체에 범위가 지정된 주석이 있는 Hilt ViewModel을 확보할 수 있습니다. 개발자들은 이미 앱에 Hilt를 사용하고 있습니다. 이 블로그 게시물에서 그들의 경험을 읽어보세요.
Paging 3.0
Paging 라이브러리는 작은 단위의 데이터를 로드 및 표시하여 네트워크 및 시스템 리소스 소비를 개선합니다. 이번 출시에서는 Kotlin으로 재작성을 완료하면서, 코루틴 및 Flow를 최고 수준으로 지원하고, RxJava 및 Guava 프리미티브 비동기 로드, 저장소 및 프레젠테이션 계층에 대해 전반적인 개선이 이루어졌습니다.
3.0 버전은 Paging 2에 비해 사용성을 크게 개선하였으며, 개발자가 원하는 일정에 맞춰 전환할 수 있도록 부분적 및 단계적 마이그레이션을 염두에 두고 재작성을 계획하였습니다. Paging 3.0 문서와 Paging 3.0 Codelab을 참조하여 자세한 내용과 경험 사례를 확인해보세요.
ConstraintLayout 및 MotionLayout
레이아웃 디자인을 위한 Jetpack의 유연한 시스템인 ConstraintLayout 및 모션과 위젯 애니메이션에 초점을 맞춘 API인 MotionLayout이 안정화되었습니다. MotionLayout에는 이제 폴더블 기기, 이미지 필터, 모션 효과에 대한 지원도 포함됩니다. 디자인 도구의 새로운 기능에 대해 더 알아보려면 이 Google I/O 세션 영상을 확인하세요.
Security Crypto
Security Crypto 라이브러리를 이용하면 파일과 SharedPreferences를 쉽고 안전하게 암호화할 수 있습니다. SharedPreferences를 암호화하려면 EncryptedSharedPreferences 객체와 적절한 키 및 스킴을 생성하고 표준 SharedPreferences 객체처럼 사용하면 됩니다.
val prefs: SharedPreferences = EncryptedSharedPreferences.create( context, "prefs_file_name", mainKey, prefKeyEncryptionScheme = AES256_SIV, prefValueEncryptionScheme = AES256_GCM, ) // Use the resulting SharedPreferences object as usual. prefs.edit() .putBoolean("show_completed", true) .apply() |
Fragment
최근 수년간 Fragment 라이브러리는 개발자가 앱에서 쉽게 모범 사례를 따르고 안정적인 테스트를 작성할 수 있도록 내부 구현을 정리하고 문서화되지 않은 동작을 감소시키는 대규모 작업을 거쳤습니다. 이를 통해 Navigation의 다중 백 스택 지원과 같은 라이브러리의 향후 개선의 기반을 다졌으나, API 규약의 엄밀한 실행을 수용하려면 다소 노력이 필요할 수 있습니다. 실제로 라이브러리를 업데이트한 후에는 테스트에 주의를 기울여야 합니다. Fragment 출시 노트에서 해당 사례를 알아보세요.
최근 출시에는 ActivityResult 통합도 도입하였습니다. 이에 따라 Fragment에서 도출된 Activity 결과를 등록할 수 있게 되었습니다. 유연성이 부족하던 onAttachFragment 메서드를 대체하기 위해 Fragment에 새로운 FragmentOnAttachListener 인터페이스도 추가하였습니다. Fragment 또는 FragmentActivity에서 이 메서드를 덮어쓰는 기존 코드는 계속 작동하지만, 새로운 코드가 실수로 유연성이 떨어지는 접근 방식을 수용하지 못하도록 onAttachFragment를 지원 중단했습니다.
// Obtain the fragment manager. May be a childFragmentManager, // if in a fragment, to observe child attachment. val fm = supportFragmentManager
val listener = FragmentOnAttachListener { fragmentManager, fragment -> // Respond to the fragment being attached. }
fm.addFragmentOnAttachListener(listener) |
베타 관련 새로운 소식
라이브러리 기능이 모두 갖춰진 후에는 안정화를 위해 베타로 이전됩니다. 현재로서 API 변경은 심각한 이슈나 커뮤니티 피드백에 대해서만 이루어집니다.
DataStore
DataStore는 SharedPreferences의 단점을 보완하면서도 단순하고 사용이 간편한 API 화면을 유지하기 위해 확실한 데이터 저장소 솔루션을 제공합니다. DataStore는 Kotlin 코루틴 Flow와 RxJava 같은 모범 사례를 지원합니다. DataStore를 이용하면 Preference DataStore를 통해 주요 값 쌍을 저장하거나 Proto DataStore를 통해 프로토콜 버퍼로 뒷받침된 입력 객체를 저장할 수 있습니다. 또한 Kotlin Serialization과 같은 자체 직렬화 솔루션을 플러그인해도 됩니다.
알파 관련 새로운 소식
알파 라이브러리는 개발 중인 라이브러리입니다. API가 추가, 변경 또는 삭제될 수 있지만 라이브러리의 내용물은 테스트된 것이므로 충분히 기능을 다 합니다.
AppSearch
AppSearch는 새로운 온디바이스 검색 라이브러리로, 높은 성능과 다양한 기능을 갖춘 전체 텍스트 검색 기능을 제공합니다. SQLite와 달리 AppSearch는 전 세계의 여러 언어를 지원하고 랭킹 쿼리 결과를 단순화하며 대규모 데이터 세트의 색인 및 검색의 지연 시간을 낮춥니다.
AppSearch 1.0.0-alpha01 출시와 함께 LocalStorage가 지원됩니다. 이를 통해 애플리케이션이 'documents'라고 불리는 구조화 데이터를 관리하고 이에 대해 쿼리를 생성할 수 있습니다. 애플리케이션은 'schema types'를 사용하여 구조의 형태를 정의합니다. 예를 들어 메시지를 제목, 본문, 보낸 사람과 같은 데이터 스키마 유형으로 모델링할 수 있습니다.
빌더로 스키마 유형의 문서를 생성한 후 저장소에 추가합니다. 'body:fruit' 쿼리는 해당 메시지 본문에서 'fruit'라는 용어가 있는 모든 문서를 가져옵니다.
Android S에서 AppSearch는 PlatformStorage도 제공합니다. 이를 통해 애플리케이션의 데이터를 다른 애플리케이션과 안전하게 공유하고 추가적인 네이티브 라이브러리를 링크하지 않도록 하여 애플리케이션의 바이너리 크기를 줄일 수 있습니다. 라이브러리가 아직 Android S SDK를 타깃으로 하지 않기 때문에 Jetpack에서는 현재 이용할 수 없습니다.
기기 전역 검색 통합을 위한 Android S+의 중앙 저장소
Room
Room은 권장 데이터 영속 계층으로, 플랫폼에 더 나은 사용성과 안전성을 제공합니다.
Room 2.4.0-alpha는 자동 마이그레이션을 지원합니다. 데이터베이스 스키마가 변경된 경우, 이제 @AutoMigration을 선언하고 마이그레이션하려는 이전 버전과 새 버전을 기재하면 Room이 마이그레이션을 생성해줍니다. 더 복잡한 마이그레이션의 경우에는 계속해서 Migration 클래스를 사용할 수 있습니다.
@Database( - version = 1, + version = 2, entities = { Doggos.class }, + autoMigrations = { + @AutoMigration (from = 1, to = 2) + } ) public abstract class DoggosDatabase extends RoomDatabase { } |
Room 2.3.0 안정화 버전은 Kotlin Symbol Processing에 대한 실험적 지원을 제공합니다. Kotlin 코드의 벤치마크에서 KAPT와 더불어 enums 및 RxJava3 자체 지원보다 속도가 두 배 개선되었습니다.
Room은 SQLite 구문이 실행될 때 콜백을 제공하여 로깅과 같은 작업을 단순화하는 QueryCallback 클래스와, 타입컨버터를 생성할 때 더 나은 유연성을 제공하는 새로운 @ProvidedTypeConverter 주석도 도입했습니다.
WorkManager
WorkManager 라이브러리는 앱이 종료되거나 기기가 다시 시작되더라도 실행되는 지연 가능한 비동기 작업을 예약하는 Android의 권장 방식입니다. 이 라이브러리는 모든 작업이 제대로 실행되도록 작업 회복 신뢰도와 특정 Android OS 버전의 여러 우회로를 개선했습니다.
WorkManager의 최신 버전에서 작업 요청 예약을 단일 프로세스로 통합하고 여러 요청 예약을 생성할 때 데이터베이스 성장을 제한하여 발생하는 성능 이점 등 다목적 앱에 대한 지원이 개선되었습니다.
현재 알파 단계에서 Android S SDK를 타깃으로 개발하고 있는 버전 2.7은 플랫폼의 새로운 포그라운드 제한에 추가적인 지원을 제공합니다. Android의 효과적인 백그라운드 작업 발표에서 자세한 내용을 확인하세요.
Android Studio Arctic Fox에서 백그라운드 작업 인스펙터를 이용할 수 있습니다. 이를 통해 최신 버전의 라이브러리를 사용할 때 WorkManager를 간편하게 확인하고 디버깅할 수 있습니다.
백그라운드 작업 인스펙터
Navigation
Navigation 라이브러리는 앱 내 목적지 간 이동을 위한 Jetpack의 프레임워크로서, 이제 다중 백 스택을 지원하고 목적지가 하단 내비게이션 바와 같은 수준에 위치하는 경우를 단순화합니다.
Macrobenchmark
Macrobenchmark 라이브러리는 Jetpack의 벤치마킹 범위를 앱 시작 및 스크롤 성능 등의 통합 동작까지 확장합니다. 이 라이브러리는 지속적 통합 테스트의 측정값을 추적하기 위해 원격으로 사용하거나 Android 스튜디오에서 표시되는 프로파일링 결과에 대해 로컬에서 사용할 수 있습니다. 자세한 내용은 Google I/O 세션 영상에서 확인하세요.
Google 어시스턴트의 더 밀접한 통합을 이루려는 개발자를 위해 Google Shortcuts 라이브러리에서 기존의 ShortcutInfo 클래스를 통해 동작을 Google 어시스턴트 및 기타 Google 서비스에 노출하는 방법을 제공합니다.
ShortcutManager를 통해 Google 어시스턴트 및 기타 서비스에 표시하여 음성 및 기타 상호작용에 이용할 수 있는 최대 15개의 단축키를 한 번에 보낼 수 있습니다.
Intent 및 capability binding으로 단축키를 정의합니다. 이 바인딩은 Google 서비스가 사용자에게 가장 적절하게 표시할 방법을 찾는 데 도움이 되는 의미 있는 시맨틱 정보를 제공합니다.
// expose a "Cappuccino" action to Google Assistant and other services ShortcutInfoCompat siCompat = ShortcutInfoCompat.Builder(ctx, "id_cappuccino") .setShortLabel("Cappuccino") .setIntent(Intent(ctx, OrderCappuccino::class.java)) .addCapabilityBinding( "actions.intent.ORDER_MENU_ITEM", "menuItem.name", asList("cappuccino") ) .build()
ShortcutManagerCompat.pushDynamicShortcut(ctx, siCompat) |
EmojiCompat
여러분의 앱에서 사용자가 생성한 모든 콘텐츠에는 🎉가 있습니다. 최신 이모티콘 지원은 앱을 ✨하기 위해 중요한 부분입니다. EmojiCompat 라이브러리는 API 19 이상에서 최신 이모티콘을 지원합니다. 이 라이브러리는 이전 :emoji:emoji 아티팩트를 대체하는 신규 아티팩트 :emoji2:emoji2로 이전되었습니다. 새로운 emoji2 라이브러리는 AppStartup 라이브러리로 🪄 자동 구성을 추가합니다(🐻❄️를 표시하기 위해 코드 👩🏿💻를 입력할 필요 없음).
AppCompat 1.4부터 AppCompat에 emoji2가 추가됩니다. 앱이 AppCompat을 사용하고 있다면 사용자는 별도로 설정하지 않고도 최신 이모티콘 ⭐을 볼 수 있습니다. AppCompat을 사용하지 않는 앱은 :emoji2:emoji2-views를 추가하면 됩니다. 커스텀 TextViews의 경우 :emoji2:emoji2-views-helpers의 헬퍼를 사용하거나 AppCompat 뷰를 서브클래스 처리하여 최신 이모티콘을 지원할 수 있습니다.
Jetpack Compose
Jetpack Compose는 네이티브 UI 빌드를 위한 Android의 최신 도구 키트로, Android에서 UI를 빠르고 간편하게 개발할 수 있게 합니다. 현재는 베타 단계이며 7월에 안정화를 목표로 하고 있습니다. 여기에 나열된 대부분의 라이브러리와 현재 여러분이 사용하고 있는 라이브러리에는 Jetpack Compose 통합을 위한 기능이 도입되었습니다. Activity부터 ViewModel, Navigation, Hilt까지 이러한 모든 라이브러리는 앱에 Compose를 쉽게 적용할 수 있도록 지원합니다. 아래 Google I/O 세션 영상에서 사용 방법에 대해 자세히 알아보세요.
폼 팩터
Jetpack을 이용하면 폴더블, 대형 화면, Wear 기기 등의 다양한 폼 팩터와 쉽게 작업할 수 있습니다. WindowManager 및 SlidingPaneLayout 등의 Jetpack 라이브러리의 개선과 더불어 대형 화면 개발의 새로운 가이드라인을 도입했습니다. 이 블로그 게시물에서 자세한 내용을 읽어보세요.
결론
Jetpack 최신 업데이트에 대해 (비교적) 짧게 요약하여 알려드렸습니다. AndroidX 출시 노트에서 모든 라이브러리의 업데이트 정보를 알아보고, 일부 업데이트에 대한 더 자세한 내용은 Google I/O 세션 영상에서 확인해주세요.