이 글의 원문은 여기서 확인 가능하며 블로그 리뷰에는 노현석(GDE)가 참여해주셨습니다.
Hilt에 대한 MAD Skills 게시물 시리즈입니다! 이번 게시물에서는 종속성 주입(DI)이 앱과 Hilt에 중요한 이유를 살펴보겠습니다. Hilt는 Android에서 DI를 구현하기 위한 Jetpack의 권장 솔루션입니다.
이 콘텐츠를 동영상으로 보려면 아래를 클릭하세요.
Android 앱에서 종속성 주입 원칙을 따르면 좋은 앱 아키텍처에 필요한 기초를 마련할 수 있습니다. 코드 재사용성과 리팩터링 용이성, 테스트 용이성에 도움이 되죠! 여기에서 DI의 이점에 대해 자세히 알아보세요.
프로젝트에서 클래스의 인스턴스를 만들 때, 클래스에 필요한 종속성과 전이 종속성을 충족하여 종속성 그래프를 수동으로 실행할 수 있습니다.
하지만 이 작업을 매번 수동으로하면 일부 상용구 코드가 포함되어 오류가 쉽게 발생할 수 있습니다. 예를 들어 오픈소스 Google I/O 앱인 iosched에 있는 ViewModel 중 하나를 생각해 봅시다. 종속성과 전이 종속성이 있는 FeedViewModel을 만드는 데 얼마나 많은 코드가 필요한지 상상이 가시나요?
어렵고 반복적인 일인 데다 종속성을 잘못 이해하기도 쉽습니다. 종속성 주입 라이브러리를 사용하면, 라이브러리에서 필요한 코드가 전부 자동으로 생성되므로 종속성을 수동으로 제공할 필요 없이 DI의 이점을 얻을 수 있습니다. 여기에서 Hilt가 역할을 합니다.
Hilt는 Google에서 개발한 종속성 주입 라이브러리로, 힘든 작업을 수행하고 개발자가 일일이 작성해야 했을 모든 상용구를 대신 생성해 줌으로써 앱에서 DI 모범 사례를 최대한 구현하는 데 도움을 줍니다.
Hilt는 Annotation을 사용하여 컴파일 시간에 해당 코드를 생성함으로써 런타임에 매우 빠르게 합니다. 이 작업에는 Hilt를 빌드할 때 기초가 된 JVM DI 라이브러리인 Dagger가 활용됩니다.
Hilt는 Android 앱을 위한 Jetpack의 권장 DI 솔루션으로, 도구 및 기타 Jetpack 라이브러리 지원이 함께 제공됩니다.
Hilt를 사용하는 모든 앱은 컴파일 시간에 Hilt의 코드 생성을 트리거해야 하므로 @HiltAndroidApp으로 Annotation이 달린 Application 클래스를 포함해야 합니다. Hilt가 Activity에 종속성을 주입하려면 Activity에 @AndroidEntryPoint로 Annotation을 달아야 합니다.
종속성을 주입하려면 Hilt가 @Inject로 주입할 변수에 Annotation을 답니다. 모든 Hilt 주입 변수는 super.onCreate가 호출될 때 사용할 수 있습니다.
이 예제에서는 MusicPlayer를 PlayActivity에 주입합니다. 그런데 Hilt는 MusicPlayer 타입의 인스턴스 제공 방법을 어떻게 아는 걸까요? 지금은 Hilt가 그 방법을 모릅니다. 그래서 Hilt에 그 방법을 알려줘야 하죠. 물론 Annotation을 사용해서 말이죠!
@Inject로 클래스의 생성자에 Annotation을 달아 Hilt에 해당 클래스의 인스턴스 생성 방법을 알려줍니다.
Activity에 종속성을 주입하기 위해서는 이 정도만 하면 됩니다. 꽤 쉽죠! MusicPlayer가 다른 타입에 의존하지 않으므로, 간단한 예제로 시작해 보았습니다. 하지만 매개변수로 전달된 다른 종속성이 있다면, Hilt가 MusicPlayer의 인스턴스를 제공할 때 그 매개변수를 처리하여 종속성을 충족할 것입니다.
이건 사실 매우 간단하고 기본적인 예제였습니다. 하지만 지금까지 수행한 작업을 수동으로 해야 한다면 어떻게 해야 할까요?
DI를 수동으로 수행할 때는 종속성 컨테이너 클래스를 가질 수 있는데, 이는 타입을 제공하고 인스턴스의 수명 주기를 관리하는 역할을 합니다. 간단히 얘기하자면, 이게 바로 Hilt가 내부적으로 수행하는 일이죠.
@AndroidEntryPoint로 Activity에 Annotation을 달면, 종속성 컨테이너가 자동으로 생성 및 관리되고 PlayActivity에 연결됩니다. 그 작업을 수동으로 구현한 것을 PlayActivityContainer로 합니다. @Inject로 MusicPlayer에 Annotation을 달면 컨테이너에 MusicPlayer 타입의 인스턴스 제공 방법을 기본적으로 알려주는 셈입니다.
그리고 Activity에서 컨테이너의 인스턴스를 만들고 그걸 사용해 Activity의 종속성을 채워야 합니다. @AndroidEntryPoint로 Activity에 Annotation을 달 때도 Hilt가 그 작업을 수행합니다.
지금까지 @Inject를 사용하여 클래스 생성자에 Annotation을 달면 Hilt에 해당 클래스의 인스턴스 제공 방법을 알려주게 된다는 점을 살펴보았습니다. @AndroidEntryPoint Annotation이 달린 클래스의 변수에 Annotation을 달면 Hilt가 해당 타입의 인스턴스를 클래스에 주입합니다.
Activity뿐만 아니라 대부분의 Android 프레임워크 클래스에 Annotation을 달 수 있는 @AndroidEntryPoint는 해당 클래스에 대한 종속성 컨테이너의 인스턴스를 생성하고 @Inject Annotation이 달린 모든 변수를 채웁니다.
@HiltAndroidApp은 Application 클래스에 Annotation을 달고, Hilt의 코드 생성을 트리거하는 것과는 별개로 Application 클래스와 연결된 종속성 컨테이너도 만듭니다.
이제 Hilt의 기초 사항을 다루었으므로 좀 더 복잡한 예제를 살펴봅시다. 이번에는 MusicPlayer가 생성자인 MusicDatabase에서 종속성을 사용합니다.
따라서 우리는 Hilt에 MusicDatabase의 인스턴스 제공 방법을 알려줘야 합니다. 예를 들어 타입이 인터페이스이거나, 클래스를 라이브러리에서 가져온 탓에 소유하지 않은 경우, 생성자에 @Inject로 Annotation을 달 수 없습니다.
앱에서 Room을 지속성 라이브러리로 사용한다고 생각해봅시다. PlayActivityContainer의 수동 구현을 다시 떠올려 보자면, MusicDatabase를 제공할 때 Room 사용 시 이는 추상 클래스가 되며, 개발자는 종속성을 제공할 때 어떤 코드를 실행하고 싶을 것입니다. 그러면 MusicPlayer의 인스턴스를 제공할 때 MusicDatabase 종속성을 제공하거나 충족하는 메서드를 호출해야 합니다.
Hilt는 모든 전이 종속성을 자동으로 연결하므로, Hilt의 전이 종속성에 대해서는 걱정할 필요가 없습니다. 그러나 MusicDatabase 타입의 인스턴스 제공 방법은 Hilt에 알려줘야 합니다. 그 목적으로 사용하는 것이 Hilt 모듈입니다.
Hilt 모듈은 @Module Annotation이 달린 클래스입니다. 그리고 클래스 내에서 Hilt에 특정 타입의 인스턴스 제공 방법을 알려주는 함수를 가질 수 있습니다. Hilt에 의해 알려진 이 정보를 Hilt 전문 용어로 바인딩 이라고도 합니다.
@Provides로 Annotation이 달린 함수가 Hilt에 MusicDatabase 타입의 인스턴스 제공 방법을 알려줍니다. 본문에는 Hilt가 실행해야 하는 코드 블록이 포함되는데, 이는 수동 구현에 있었던 것과 정확히 똑같습니다.
반환 타입인 MusicDatabase는 이 함수가 어떤 타입을 제공하는지 Hilt에 알립니다. 그리고 함수 매개변수는 해당 타입의 종속성(이 경우에는 Hilt에서 이미 사용할 수 있는 ApplicationContext)을 Hilt에 알려줍니다. 이 코드는 MusicDatabase 타입의 인스턴스 제공 방법을 Hilt에 알려줍니다. 즉 개발자는 MusicDatabase에 대한 바인딩을 가지게 됩니다.
Hilt 모듈에는 어떤 종속성 컨테이너 또는 구성 요소에서 이 정보를 사용할 수 있는지를 나타내는 @InstallIn Annotation도 있습니다. 그런데 구성 요소란 무엇일까요? 이에 대해 더 자세히 살펴봅시다.
구성요소 Hilt에 의해 생성되며, 우리가 수동으로 프로그래밍한 컨테이너와 같은 타입의 인스턴스를 제공하는 역할을 하는 클래스입니다. 컴파일 시간에 Hilt는 애플리케이션의 종속성 그래프를 탐색하고 모든 타입에 전이 종속성을 제공하는 코드를 생성합니다.
구성요소는 Hilt에 의해 생성되며, 타입의 인스턴스를 제공하는 역할을 하는 클래스입니다.
Hilt는 대부분의 Android 프레임워크 클래스에 대한 구성요소 또는 종속성 컨테이너를 생성합니다. 각 구성 요소의 정보 또는 바인딩은 구성 요소 계층 구조를 통해 전파됩니다.
Hilt의 구성 요소 계층 구조
MusicDatabase 바인딩이 Application 클래스에 해당하는 SingletonComponent에서 사용 가능한 경우, 나머지 구성 요소에서도 사용할 수 있습니다.
이러한 구성 요소는 컴파일 시간에 Hilt에 의해 자동으로 생성되며 클래스에 @AndroidEntryPoint Annotation을 추가할 때 생성 및 관리되고 해당 Android 프레임워크 클래스와 연결됩니다.
모듈에 대한 @InstallIn Annotation은 이러한 바인딩을 어디서 사용할 수 있는지, 사용할 수 있는 다른 바인딩은 무엇인지 제어하는 데 유용합니다.
수동으로 생성한 PlayActivityContainer 코드로 돌아가보면, 우리가 알아차리지 못하더라도 MusicDatabase 종속성이 필요할 때마다 각각 다른 인스턴스가 생성되고 있습니다.
앱 전체에서 MusicDatabase의 똑같은 인스턴스를 재사용하고 싶을 수도 있으므로, 이렇게 다른 인스턴스가 생성되는 상황은 바람직하지 않습니다. 함수 대신 변수에 그 모든 것을 포함하면 똑같은 인스턴스를 공유할 수 있습니다.
기본적으로, 우리는 항상 동일한 인스턴스를 종속성으로 제공하므로 MusicDatabase 타입의 범위를 이 컨테이너에 맞춰 지정합니다. 어떻게 Hilt로 이 작업을 수행할 수 있을까요? 별다른 건 없습니다. 또 다른 Annotation을 사용하면 되죠!
@Provides 메서드에서 @Singleton Annotation을 사용하여 항상 해당 구성 요소에서 이 타입의 동일한 인스턴스를 공유하도록 Hilt에 알려줍니다.
@Singleton은 범위 Annotation입니다. 그리고 각 Hilt 구성 요소에는 범위 Annotation이 연결되어 있습니다.
각 Hilt 구성 요소에 대한 범위 Annotation
타입의 범위를 ActivityComponent로 지정하려면 ActivityScoped Annotation을 사용합니다. 이런 Annotation은 모듈에서 사용할 수 있지만, 생성자에 @Inject Annotation이 달린 클래스에 Annotation을 달 수도 있습니다.
두 가지 타입의 바인딩이 있습니다.
범위 Annotation이 달리지 않은 바인딩은 범위가 지정되지 않은 바인딩(예: MusicPlayer)이라고 하며, 이런 바인딩은 모듈에 설치되지 않은 경우에 모든 구성 요소에서 사용할 수 있습니다.
범위 Annotation이 달린 범위가 지정된 바인딩(예: MusicDatabase) 또는 모듈에 설치되고 범위가 지정되지 않은 바인딩은 해당 구성 요소와 계층 구조상 그 아래에 있는 구성 요소에서 사용할 수 있습니다.
Hilt는 가장 인기있는 Jetpack 라이브러리인 ViewModel, Navigation, Compose, WorkManager와의 통합을 제공합니다.
ViewModel 외에도, 각각의 통합에는 프로젝트에 추가할 다른 라이브러리가 필요합니다. 이에 대한 자세한 내용은 문서를 참조하세요. 이 블로그 게시물의 시작 부분에서 봤던 iosched의 FeedViewModel 코드를 기억하세요? Hilt 지원으로 어떻게 보이는지 살펴보고 싶으세요?
@Inject로 생성자에 Annotation을 다는 것 외에도, 이 ViewModel의 인스턴스 제공 방법을 Hilt에 알려주려면 @HiltViewModel로 클래스에 Annotation을 달아야 합니다.
이렇게만 하면 됩니다! Hilt가 자동으로 처리해주므로, ViewModel 공급자를 수동으로 만들 필요가 없습니다.
Hilt는 널리 쓰이는 또 다른 종속성 주입 라이브러리인 Dagger를 기반으로 만들어졌습니다. 앞으로 업로드 될 게시물에서 Dagger가 자주 언급될 것입니다. Dagger를 쓰신다면 Hilt와 함께 사용할 수도 있습니다. 이 가이드에서 마이그레이션 API에 대해 자세한 내용을 읽어보세요.
Hilt에 대한 자세한 내용은 가장 자주 쓰이는 Annotation과 이 Annotation들의 역할 및 사용 방법을 담은 요약본에서 살펴보세요. Hilt에 대한 문서 외에도, 보다 실무적인 경험을 통해 배울 수 있는 코드랩도 있습니다.
이것으로 이번 게시물을 마치겠습니다. 하지만 이게 끝이 아닙니다! 앞으로 MAD 기술 관련 포스트가 더 많이 게시될 예정이니 Android 개발자 Medium 게시물을 팔로우하여 게시 일정을 살펴보세요.
작성자: Sameer Samat (Vice President, Product Management)
이 글의 원문은 여기에서 확인하실 수 있습니다.
10여 년 전 Android 및 Google Play 서비스를 시작했을 때 저희는 자유롭고 개방된 모바일 생태계가 폐쇄형 시스템과 대등하게 경쟁할 수 있을 것이라는 가능성에 모험을 걸었습니다. 당시로서는 어떤 산업이 모바일로 옮겨올 것인지, 어떤 앱이 모바일에서 성공을 거둘지 확실하지 않았기에, 저희는 단순하게 접근해 누구나 이해하기 쉬운 비즈니스 모델을 만들었습니다. 대다수의 개발자들이 Google Play에서 무료로 앱을 배포할 수 있도록 하였고 (현재 97%의 개발자들이 무료로 Google Play 플랫폼을 이용하고 있습니다), 유료 앱이나 앱 내에서 디지털 재화를 판매하는 개발자들에게 30%의 단일 서비스 수수료를 적용하였습니다 (현재 3%의 개발자들이 이에 해당합니다). 이 모델로 말미암아 앱 비즈니스는 소프트웨어 산업 내에서도 가장 빠르게 성장하는 분야가 되었습니다. 또한 운영체제(OS) 이용에 대한 라이선스 수수료를 청구하는 대신, 서비스 수수료라는 수익원을 통해 Android와 Google Play에 꾸준히 재투자할 수 있었고 전 세계의 기기 제조사들은 Android와 Google Play를 무료로 이용하고 있습니다.
전 세계 개발자들의 창의성과 혁신은 Android가 세상에 처음 등장했을 때에는 상상할 수 없었던 놀랍고도 새로운 앱 경험을 만들어 냈습니다. 모바일 생태계가 진화하면서 이러한 다양한 앱들을 지원하기 위해 여러가지 형태의 비즈니스 모델이 생겨났습니다. 이런 다양한 형태의 비즈니스가 성공할 수 있도록 돕기 위해, 일률적인 서비스 수수료에 대한 변경을 포함해 저희는 몇 가지 중요한 변경사항을 도입해 왔습니다. 단일 요율의 서비스 수수료를 부과하는 대신, 다양한 앱 생태계를 지원하고 장려하기 위한 다수의 프로그램들을 갖췄습니다.
그 결과 99%의 개발자가 15% 이하의 서비스 수수료를 적용받을 수 있습니다. 그리고 Anghami, AWA, Bumble, Calm, Duolingo, Kadokawa, KKBOX, PicsArt, Smule과 같은 개발자를 비롯해 전 세계 곳곳의 다양한 산업에서 활약하고 있는 개발자들의 의견을 경청하였고 이 배움을 기반으로 몇 가지 추가 변경 사항을 공유드리려 합니다. 이는 Google Play가 파트너 생태계를 더욱 두텁게 지원하고 개발자들이 지속 가능한 비즈니스를 구축할 수 있도록, 그래서 Google Play가 모바일 앱 생태계를 계속 선도하기 위해 내린 결정입니다.
디지털 재화에 대한 정기 결제 비즈니스는 가장 빠르게 성장하는 모델 중 하나로 개발자들에게 자리매김하였지만, 고객 확보 및 유지와 관련된 특별한 고민이 수반되는 것으로 알고 있습니다. 이러한 정기 결제 비즈니스 고유의 특징을 더 잘 이해하고자 Google Play는 데이팅, 피트니스, 교육 등의 분야에서 활약하고 있는 많은 파트너와 협업해 왔습니다. 그 과정에서 기존의 방식, 즉 정기 결제 후 12개월 후에야 서비스 수수료를 30%에서 15%로 인하하는 모델은 고객 이탈로 인해 현실적으로 비용절감의 혜택이 크지 않다는 의견을 들었습니다. 그래서 저희는 개발자들이 할인된 서비스 수수료 혜택을 실질적으로 받을 수 있도록, 이를 단순화하기로 했습니다.
정기 결제 모델을 제공하는 개발자들의 요청에 따라, 2022년 1월 1일부터 Google Play에 등재된 모든 서비스의 정기 결제 서비스 수수료를 기존 30%에서 15%로 낮춥니다. 그리고 이 서비스 수수료는 첫날부터 바로 적용됩니다.
이제 정기 결제 모델을 채택한 개발자가 첫 해 지불하는 서비스 수수료는 절반으로 줄어듭니다. 이러한 변경에 대해 개발자 파트너들은 긍정적인 피드백을 보내주었습니다.
“Google과의 파트너십은 Bumble이 전 세계 여성의 권한을 강화하기 위한 저희의 사명으로 한 발 더 나아가게 하는 데에 매우 중요하고 강력한 역할을 해왔습니다. Google이 발표한 수수료 변경을 통해 저희는 제품에 대한 투자를 보다 강화하여 Bumble의 사용자가 더 안전하게 온라인에서 연결되도록 지원할 수 있게 될 것입니다.”– Whitney Wolfe Herd, Bumble Inc의 창업자이자 CEO
"사람마다 학습하는 방식이 다른 것처럼 개발자들도 저마다 다릅니다. Google이 개발자와 플랫폼 모두에게 적합한 모델을 찾기 위해 생태계와 계속해서 협력하는 것을 보게 되어 기쁩니다. 정기 구독 결제에 대한 수수료를 낮춘 것은 Duolingo에게 큰 도움이 되며, 모든 사람을 위한 언어 학습이라는 Duoling의 사명을 더욱 빠르게 달성하게 해 줄 것입니다."- Luis von Ahn, Duolingo의 공동 창업자이자 CEO
서비스 분야 간 차이를 더 잘 포용하기 위해 이 미디어 경험 프로그램(Media Experience Program)의 서비스 수수료에도 변화를 주고자 합니다. 콘텐츠 비용이 매출의 대부분을 차지하는 전자책 및 음악 스트리밍 서비스들은 이제 최저 10%까지 낮아진 서비스 수수료 적용을 신청할 수 있습니다. 새로운 요율은 미디어 콘텐츠 카테고리의 산업적 특성을 더 잘 반영하고, Google Play가 개발자와 아티스트, 음악가 및 작가 커뮤니티와 더 밀접하게 일할 수 있도록 해줄 것입니다. 자세한 내용은 여기를 참조하세요.
저희는 앞으로도 계속 개발자들이 직면한 도전과 기회를 더 깊이 이해하기 위해서 노력하고 개발자들과 협력하며, 개발자들이 지속 가능한 비즈니스를 구축할 수 있도록 지원할 것입니다. 이는 10월 27일부터 28일까지 진행되는 Android Developer Summit에서 가장 주요하게 다뤄질 주제이기도 합니다. 개발자의 생산성을 높이고 더 나은 앱을 만드는 데 도움이 되도록 설계된 최신 도구, API(애플리케이션 프로그래밍 인터페이스) 및 기술에 대해 Android Developer Summit에서 자세히 들으실 수 있습니다.
Google Play 및 서비스 수수료 관련된 추가 정보는 이 곳에서 자주 묻는 질문들에 대한 답변과 함께 확인할 수 있습니다.
작성자: Dave Burke (VP of Engineering)
이 글의 원문은 여기서 확인하실 수 있으며 블로그 리뷰에는 양찬석(Google)님이 참여해주셨습니다.
오늘(태평양 표준시 기준 10월 4일) AOSP(Android 오픈소스 프로젝트)에 소스를 제공하고 Android 최신 버전을 공식 출시했습니다. Pixel을 시작으로, 여러분 가까이에 있는 Samsung Galaxy, OnePlus, Oppo, Realme, Tecno, Vivo, Xiaomi 기기에도 올해 중에 Android 12가 제공될 예정입니다.
매번 Android 12 베타 단계에서 의견을 보내주신 여러분께 감사드립니다! 225,000여 명의 개발자께서 Pixel과 당사 파트너 기기로 초기 릴리스를 테스트하고 거의 50,000건에 달하는 문제를 신고해 주셔서 품질 개선에 큰 도움이 되었습니다. 또한, 여러분의 생각을 들려주신 수많은 글, 토론, 설문조사 및 직접 대면 회의뿐 아니라, 오늘 출시에 맞춰 개발하신 앱이 호환되도록 애써 주신 노력에도 감사드립니다. 개발자 여러분의 지원과 공헌 덕분에 Android를 모두를 위한 훌륭한 플랫폼으로 만들 수 있었습니다.
또한, 태평양 표준시 기준 10월 27~28일(한국 시간으로 10월 28~29일)로 다가온 올해 Android Dev Summit에서 Android 12에 대해 더 자세한 이야기를 나눌 예정입니다. Android 기술 세션 등 이번 행사에 대한 더 많은 정보가 공개되었으며, 게시물 후반부에서 자세한 내용을 확인할 수 있습니다.
Android 12에 개발자를 위해 새로 준비한 기능 중 몇 가지를 소개해 드리겠습니다. 모든 새로운 기능에 대한 자세한 내용은 Android 12 개발자 사이트를 확인해보세요.
Material You - Android 12에는 Material You라는 새로운 디자인 언어가 도입돼 더욱 고도로 맞춤화되고 멋진 앱을 빌드하는 데 도움이 될 것입니다. 최신 머티리얼 디자인 3 업데이트를 앱에 적용하려면 머티리얼 디자인 구성 요소의 알파 버전을 사용해보고 곧 제공해드릴 Jetpack Compose에 대한 지원도 확인해보세요.
새로운 디자인의 위젯 - 더 유용하고 보기 좋으며 탐색하기 쉽도록 앱 위젯을 새로 디자인했습니다. 새로운 대화형 컨트롤, 모든 기기에 적합한 반응형 레이아웃, 역동적인 색상으로 자유롭게 맞춤설정할 수 있으면서도 일관된 모양을 유지하는 위젯을 사용해보세요. 자세히 살펴보세요.
알림 UI 업데이트 - 알림 디자인도 새롭게 단장해 더욱 세련된 느낌을 주고 유용성도 높였습니다. 또한, Android 12에서는 다른 모든 알림과의 일관성 유지를 위해 표준 어포던스(standard affordances)로 맞춤 알림을 장식했습니다. 자세히 알아보세요.
스트레치 오버스크롤 - Android 12는 앱 콘텐츠를 보다 부드럽게 스크롤할 수 있도록 모든 스크롤 컨테이너에 새로운 '스트레치' 오버스크롤 효과를 더했습니다. 시스템과 앱 전체에 공통적으로 나타나는 자연스러운 스크롤-중지 표시기(scroll-stop indicator)입니다. 자세히 확인해보세요.
앱 시작 스플래시 화면 - Android 12에는 모든 앱의 스플래시 화면도 도입됩니다. 앱이 고유의 브랜딩 요구사항에 맞춰 다양한 방법으로 스플래시 화면을 사용자 설정할 수 있습니다. 자세히 알아보세요.
더 빠르고 효율적인 시스템 성능 - 코어 시스템 서비스가 사용하는 CPU 시간을 22%, 빅 코어 사용을 15% 줄였습니다. 또한, 앱이 더 빠르게 열리도록 앱 시작 시간을 줄이고 I/O를 최적화했으며, 윈도우 크기가 큰 데이터베이스 쿼리에 대해 CursorWindow의 성능이 최대 49배 개선되었습니다.
최적화된 포그라운드 서비스 - Android 12는 더 나은 사용자 경험을 위해 앱이 백그라운드에 있는 동안에는 포그라운드 서비스를 시작하지 못하는 대신 JobScheduler에서 새로운 신속 처리 작업을 사용하게 할 수 있습니다. 자세히 살펴보세요.
더욱 반응성이 뛰어난 알림 - Android 12는 알림 트램펄린을 제한하여 알림에서 시작되는 앱 지연 시간을 단축시킵니다. 예를 들어 Google 포토 앱은 알림 트램펄린을 제한한 이후부터 시작 속도가 34% 빨라졌습니다. 자세히 확인해보세요.
성능 등급 - 성능 등급은 Android 12 기기에서 까다로운 사용 사례와 더 높은 품질의 콘텐츠를 함께 지원하는 일련의 기기 기능입니다. 앱은 런타임에서 기기의 성능 등급을 확인하고 기기의 성능을 최대한 활용할 수 있습니다. 자세히 알아보세요.
더욱 빠른 머신러닝 - Android 12는 개발자가 Neural Networks API를 통해 ML 가속기를 최대한 활용하고 항상 가능한 한 최고의 성능을 발휘할 수 있도록 지원합니다. ML 가속기 드라이버는 이제 Google Play 서비스를 통해 플랫폼 릴리스 이외의 방법으로도 업데이트할 수 있으므로, 호환되는 모든 기기에서 최신 드라이버를 활용할 수 있습니다.
개인정보 보호 대시보드 - 앱이 마이크, 카메라, 위치 데이터에 액세스할 때 시스템 설정의 새로운 대시보드를 통해 사용자는 해당 사항을 더욱 명확하게 확인할 수 있습니다. 자세히 알아보세요.
대략적인 위치 - 사용자에게 자신의 위치 데이터에 대한 더 많은 제어 권한을 부여하여, 앱에서 사용자의 정확한 위치 정보를 요청하더라도 대략적인 위치 정보에만 액세스할 수 있록 설정할 수 있습니다. 자세히 살펴보세요.
마이크 및 카메라 표시기 - 상태 표시줄의 표시기를 통해 앱이 기기 카메라나 마이크를 사용 중일 때, 이를 사용자에게 알려줍니다. 자세히 확인해보세요.
마이크 및 카메라 전환 - 지원되는 기기에서 사용자는 빠른 설정(Quick Settings)의 새 전환 기능을 통해 마이크와 카메라에 대한 앱 권한을 즉시 비활성화할 수 있습니다. 자세히 알아보세요.
근처 기기 권한 - 앱이 위치 권한이 없어도 새 권한을 사용하여 근처에 있는 기기를 검색하고 페어링할 수 있습니다. 자세히 알아보세요.
리치 콘텐츠 삽입 - 새로운 통합 API를 사용하여 클립보드, 키보드 또는 드래그 앤 드롭 등 어떤 소스에서든 UI의 다양한 콘텐츠를 받을 수 있습니다. 이전 버전과의 호환성을 위해 AndroidX에 통합 API를 추가했습니다. 자세히 알아보세요.
모서리가 둥근 화면 지원 - 많은 최신 기기에 모서리가 둥근 화면이 사용됩니다. 이러한 기기에서 훌륭한 UX를 제공하려면 새로운 API를 사용하여 모서리 세부 정보를 쿼리한 다음, 필요에 따라 UI 요소를 관리할 수 있습니다. 자세히 살펴보세요.
AVIF 이미지 지원 - Android 12는 AVIF(AV1 이미지 파일 형식)를 위한 플랫폼 지원을 추가합니다. AVIF는 동영상 압축을 통해 프레임 내에 인코딩된 콘텐츠를 이용하여, JPEG 등의 이전 이미지 형식과 비교할 때 동일한 파일 크기 대비 이미지 화질이 대폭 개선됩니다.
호환 가능한 미디어 트랜스코딩 - 동영상의 경우, HEVC 형식은 품질과 압축 성능을 크게 높여주므로 모든 앱에서 이 형식을 지원할 것을 권장합니다. 이 형식을 지원할 수 없는 앱의 경우, 호환 가능한 미디어 트랜스코딩 기능을 통해 앱에서 AVC의 파일을 요청하고 시스템에서 트랜스코딩을 처리하도록 할 수 있습니다. 자세히 알아보세요.
더 쉬운 블러, 컬러 필터 및 기타 효과 - 새 API를 사용해 View와 렌더링 계층 구조에 일반적인 그래픽 효과를 더 쉽게 적용할 수 있습니다. RenderEffect를 사용하여 블러, 컬러 필터 등을 RenderNode 또는 Views에 적용할 수 있습니다. 새 Window.setBackgroundBlurRadius() API를 사용하여 창 배경에 성에가 낀 유리 효과를 만들거나 blurBehindRadius를 사용하여 창 뒤에 있는 모든 콘텐츠를 흐리게 만들 수도 있습니다.
향상된 햅틱 경험 - Android 12는 UI 이벤트에 대한 유용한 정보를 주는 햅틱 반응, 보다 몰입감 있고 즐거운 게임 경험을 위한 효과, 생산성을 위해 주의를 끄는 햅틱을 만드는 데 사용할 수 있는 폭 넓은 도구를 제공합니다. 자세히 확인해보세요.
새로운 카메라 효과 및 센서 기능 - 새로운 벤더 확장 프로그램을 통해 앱에서 보케, HDR, 야간 모드 등, 기기 제조업체에서 빌드한 사용자 설정 카메라 효과를 활용할 수 있습니다. 또한, 새로운 API를 사용하여 Quad/Nona Bayer 패턴을 사용하는 초고해상도 카메라 센서도 다양하게 활용 가능합니다. 자세히 살펴보세요.
네이티브 충돌에 대한 디버깅 개선 - Android 12는 NDK 관련 충돌을 더 쉽게 디버깅할 수 있도록 보다 실행 가능한 진단 정보를 제공합니다. 이제 앱이 App Exit Reasons API를 통해 Tombstone이라는 자세한 크래시 덤프 파일에 액세스할 수 있습니다.
게임용 Android 12 - Game Mode API를 사용하면 긴 출퇴근 시간 동안 배터리 수명 향상 또는 최고 프레임 속도를 얻기 위한 성능 모드와 같은 플레이어의 성능 프로필을 확인하고 이에 맞추어 대응할 수 있습니다. 다운로드하면서 플레이 기능을 이용하여 설치 중에 게임 애셋을 백그라운드에서 가져올 수 있으므로, 플레이어가 더 빠르게 게임을 플레이할 수 있습니다.
오늘 Android 12를 일반 대중에 출시하므로 모든 Android 개발자께서는 호환성 테스트를 완료하고 가능한 한 빠르게 업데이트를 게시하여 사용자가 Android 12로 원활히 전환할 수 있도록 조치하시기 바랍니다.
앱 호환성을 테스트하려면 Android 12를 사용하는 기기에 앱을 설치하고 앱 플로우를 따라 기능이나 UI 문제가 있는지 살펴보기만 하면 됩니다. Android 12에서 모든 앱의 동작 변경 사항을 검토하여 앱이 영향을 받을 수 있는 영역을 집중적으로 살펴보세요. 테스트해봐야 할 주요 변경 사항은 아래와 같습니다.
개인정보 보호 대시보드 — 시스템 설정에서 이 새로운 대시보드를 사용하여 마이크, 위치, 기타 민감한 데이터에 대한 앱의 액세스를 확인하고 사용자에게 앱이 해당 데이터에 액세스하려는 근거에 대한 세부 정보를 제공하세요. 자세히 알아보세요.
마이크 및 카메라 표시기 — Android 12에서는 앱이 카메라나 마이크를 사용 중일 때 상태 표시줄에 표시기가 나타나므로 이것이 앱의 UI에 영향을 미치지 않도록 하세요. 자세히 살펴보세요.
마이크 및 카메라 전환 — 빠른 설정(Quick Settings)의 새로운 전환 기능을 사용해 앱에 대한 마이크 및 카메라 액세스를 비활성화하고 앱이 변경 사항을 올바르게 처리하도록 하세요. 자세히 확인해보세요.
클립보드 읽기 알림 — 앱이 예기치 않게 클립보드에서 데이터를 읽을 때 토스트 메시지 알림을 살펴보고 의도하지 않은 액세스를 제거하세요. 자세히 알아보세요.
스트레치 오버스크롤 — 새로운 "스트레치" 오버스크롤 효과로 콘텐츠를 스크롤해보고 예상한 대로 표시되는지 확인하세요. 자세히 살펴보세요.
앱 스플래시 화면 — 다양한 플로우에서 앱을 시작하여 새로운 스플래시 화면 애니메이션을 테스트하세요. 필요한 경우 이를 사용자 설정할 수 있습니다. 자세히 알아보세요.
키 생성기 변경 사항 — Conscrypt 버전을 사용하기 위하여 지원이 중단된 여러 BouncyCastle 암호화 알고리즘이 삭제되었습니다. 앱이 AES와 함께 512비트 키를 사용하는 경우 Conscrypt에서 지원하는 표준 크기 중 하나를 사용해야 합니다. 자세히 알아보세요.
앱에서 라이브러리와 SDK의 호환성을 테스트하는 것을 잊지 마세요. SDK 문제를 발견하면 최신 SDK 버전으로 업데이트하거나 개발자에게 연락하여 도움을 받으세요.
현재 앱의 호환 버전을 게시하면 앱의 targetSdkVersion을 업데이트하는 프로세스를 시작할 수 있습니다. Android 12 앱의 동작 변경 사항을 검토하고 문제를 빠르게 감지할 수 있도록 호환성 프레임워크를 사용하세요.
#AndroidDevSummit이 곧 여러분을 찾아갑니다! 몇 주 뒤인 10월 27~28일(한국시간으로 10월 28~29일)에 참여하셔서 최신 Android 개발 정보를 살펴보세요. 올해는 다양한 기기에서 지원되는 우수한 앱을 테마로 진행되며 태블릿, 웨어러블 등 온갖 기기를 대상으로 더 좋은 앱을 제작하고 생산성을 높이는 데 도움이 되는 개발 툴, API 및 각종 기술에 대해 알아볼 수 있습니다.
30여 개의 Android 기술 세션 개요를 포함하여, 이벤트에 대한 추가 정보도 함께 업데이트되었습니다. 여기에서 이 세션 정보를 확인하시고 어떤 강연을 들을지 미리 살펴보세요. 여러분이 가장 궁금해하시는 질문을 #AskAndroid 해시태그와 함께 트윗으로 보내주시면, 행사 기간에 실시간으로 답변해 드리겠습니다.