Android에서는 사용자에게 더욱 안전한 환경을 제공할 수 있도록 사용자 개인정보 보호와 플랫폼 보안강화를 위한 변경 작업을 진행하고 있습니다. Android 11(API 레벨 30) 이상을 타깃하는 앱은 기기에 설치된 앱의 필터링된 목록만 확인할 수 있습니다. 필터링된 목록 이외의 앱에 액세스하려면 앱이 Android 매니페스트의 <queries> 요소를 사용하여 직접 상호 작용하기 위해 필요한 앱을 선언해야 합니다. 이 블로그 게시물에서는 이를 위한 몇 가지 모범 사례를 살펴보겠습니다.
앱 쿼리 및 상호 작용(Querying and interacting with apps):
앱을 쿼리하고 앱과 상호 작용하는 방법은 다양합니다.
<manifest package="com.example.game">
<queries>
<package android:name="com.example.store" />
<package android:name="com.example.services" />
</queries>
...
</manifest>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
<manifest package="com.example.suite.enterprise">
<provider android:authorities="com.example.settings.files" />
상호 작용해야 하는 패키지에 대해서만 쿼리하여 데이터를 최소화(data minimization)하는 것이 좋습니다. QUERY_ALL_PACKAGES 또는 똑같이 넓은 <intent> 요소는 이 수준의 정보가 필요한 앱에서만 사용해야 합니다. 새로운 패키지 가시성 정책에는 기기에 설치된 앱의 전체 목록에 대한 액세스를 제어하는 새로운 QUERY_ALL_PACKAGES 권한에 대한 승인 프로세스가 도입되었습니다.
액티비티 플래그(Activity flags):
대부분의 일반적인 사용 사례에서는 앱이 폭넓은 패키지 가시성을 가질 필요가 전혀 없습니다. 많은 상황에서는 startActivity()를 사용해 이 인텐트를 열 수 있는 앱이 없는 경우에 예외를 처리할 수 있습니다.
try {
val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {
addCategory(CATEGORY_BROWSABLE)
}
startActivity(intent)
} catch (e: ActivityNotFoundException) {
Snackbar.make(it,"Activity Not Found",Snackbar.LENGTH_LONG).show()
대상에 대한 가시성 없이도 Activity를 시작할 수 있습니다. 다만, 암시적 인텐트(implicit intent)가 사용됨으로, 어떤 앱이 실행될지, 암시적 인텐트를 처리할 수 있는 Activity가 있는지 사전에 확인할 수 없습니다. 대신, Activity가 시작되지 않으면 예외가 발생합니다. 아래와 같은 플래그를 사용하면 이 부분을 개선할 수 있습니다.
플래그를 사용하는 일반적인 예로 앱이 브라우저의 모양과 느낌을 맞춤 설정하도록 허용하는 맞춤 탭(Custom Tabs)을 사용하는 경우를 생각할 수 있습니다. 특정 웹 콘텐츠를 처리할 수 있는 네이티브 앱이 이미 설치되어 있는 경우에는 해당 앱으로 넘어가지만, 그렇지 않은 경우 앱 내에서 맞춤 탭을 이용해 웹 콘텐츠를 표시하도록 구현할 수 있습니다. 간단히 요약하면 이 플래그는 개발자가 폭넓은 패키지 가시성 없이도, 특정 웹 콘텐츠를 처리할 수 있는 네이티브 앱이 있는지 사전에 확인하고, 이 후, 거기에서 원하는 방식으로 처리할 수 있는지 확인하는데 도움이 됩니다.
FLAG_ACTIVITY_REQUIRE_NON_BROWSER
이 플래그는 브라우저(browser)가 아닌 결과로 확인될 경우에만 인텐트를 실행합니다. 그와 같은 결과가 없는 경우 ActivityNotFoundException이 발생합니다. 이 후, 앱의 맞춤 탭에서 해당 URL을 열 수 있습니다.
// The URL should either launch directly in a non-browser app (if it's
// the default), or in the disambiguation dialog.
flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER
인텐트에 이 플래그가 포함된 경우 startActivity() 호출로 인해 브라우저 앱을 직접 실행하게 되거나, 브라우저 앱만이 유일한 옵션인 상황에서 사용자가 실행할 앱을 고르는 대화상자(disambiguation dialong)가 표시되는 경우라면, ActivityNotFoundException이 발생합니다. 플래그에 대한 자세한 내용은 사용 사례 기반 패키지 가시성 구성(Configuring package visibility based on use cases)을 참조하세요.
공유 시트 맞춤 설정(Customizing a share sheet):
맞춤 공유 시트 대신 시스템 공유 시트(system share sheet)를 사용하는 것이 좋습니다. 앱 가시성(app visibility)을 사용할 필요 없이 시스템 공유 시트를 맞춤 설정할 수 있습니다. 자세한 내용은 이 문서를 참조하세요.
패키지 가시성 디버깅(Debugging Package Visibility):
손쉽게 매니페스트를 확인하면 포함된 모든 쿼리를 볼 수 있습니다. 이 작업을 수행하려면 안드로이드 스튜디오에서 매니페스트 파일을 열고 병합된 매니페스트(Merged Manifest) 탭을 선택하세요.
또한, 패키지 필터링에 대한 로그 메시지를 사용하여 기본 가시성(default visibility)이 앱에 미치는 영향을 확인할 수도 있습니다.
$ adb shell pm log-visibility -enable YOUR_PACKAGE_NAME
다음 단계
패키지 가시성에 대한 자세한 내용은 다음 자료를 확인해 보세요.
그럼 즐겁게 코딩해 보세요!
작성자: Chet Haase (Software Engineer)
Android 개발 분야의 새롭고 눈에 띄는 소식을 계속 안내해드리는 'Now in Android'에 오신 걸 환영합니다.
이번 회 Now in Android 역시 영상과 팟캐스트 형식으로 제공됩니다. 콘텐츠는 같지만 읽어야 할 내용은 더 적습니다. 이 콘텐츠의 문서 버전(계속 읽어주세요!)에 있는 링크로 세부 내용을 확인하실 수 있습니다.
아래 링크를 클릭하거나 즐겨 사용하시는 팟캐스트 앱에서 구독해주세요.
드디어 나왔습니다! Jetpack Compose 베타 릴리스가 나왔습니다! 이를 기념하여 저희 팀은 개요, Q&A 세션, 저희가 이 신세계를 학수고대하는 이유를 보여주는 데모를 담은 아래 영상을 제작했습니다.
Jetpack Compose는 네이티브 Android 앱을 더 빠르고 쉽게 빌드할 수 있도록 디자인된 Android용 미래형 UI 도구 키트입니다. 저희는 2019년 Google I/O에서 Compose를 발표한 이후로 한동안은 오픈소스 라이브러리 관련 작업을 했습니다. 그러다가 작년 8월에 알파 단계를 지나 마침내 지난주에 베타 단계에 이르렀습니다.
(계속해서 제품을 확실히 다져 나가면서 API가 안정적임을 나타내는) 베타도 주요 성과이므로, 저희 팀은 개발자 여러분이 그 사용법을 배우고 저희가 올해 말에 Jetpack Compose 1.0을 선보일 때 애플리케이션에 채택할 준비를 하시도록 Compose에 관한 많은 정보를 내놓았습니다.
먼저, Jetpack Compose에 관한 온갖 종류의 정보뿐 아니라 더 자세히 알아볼 수 있는 리소스로 연결되는 링크가 포함된 이 블로그를 확인해 보세요.
Jetpack Compose Beta 발표!
다음으로, Jetpack Compose의 다양한 기능을 사용하는 방법을 보여주는 영상과 스크린캐스트 시리즈를 전부 모아 놓은 곳이 있습니다.
물론, 코드를 실습해보고 싶으실 겁니다. 새로운 학습 경로의 코드랩은 물론이고, 업데이트된 샘플도 꼭 확인해 보세요.
마지막으로, 개발자 사이트를 방문해 Jetpack Compose를 시작하는 방법에 관한 추가 정보로 연결되는 링크가 포함된 최신 업데이트 문서를 읽어보세요.
올해도 다시 때가 되었나 봅니다. 밖을 보니 벚꽃이 피고, 날씨도 조금씩 따뜻해지고 있고, 캘리포니아에 내렸던 비는 11월까지 다 말라버린 지금, Android의 다음 버전을 위한 첫 번째 프리뷰 릴리스가 드디어 나왔습니다!
개인정보 보호 및 보안 개선 사항부터 미디어 트랜스코딩과 AVIF 이미지 지원 같은 그래픽 기능까지, 릴리스에 포함된 다양한 기능의 개요를 보려면 이 블로그를 읽어보세요.
또한, 동작 변경 사항, 새로운 기능과 API 등에 관한 자세한 내용은 Android 12 Preview 사이트를 살펴보세요. 그리고 가장 중요한 점! 새 릴리스에서 앱을 사용해보고 혹시 어떤 문제가 발견되면 꼭 피드백을 보내주세요. 바로 이 부분 때문에 프리뷰를 일찍 발표하고 있습니다. 조기에 다양한 문제를 찾아내 바로잡고, 잘 다듬어 완성품을 정식 출시할 수 있도록요.
물론, 이번 릴리스는 첫걸음에 불과하고 최종 릴리스를 향해 갈 길이 아직도 멉니다. 각종 기능, 수정 사항 등이 계속 늘어나면서 더 많은 릴리스가 곧 출시될 예정입니다.
Android 12의 최종 출시를 목표로 작업하면서 앞으로 나올 릴리스를 잘 살펴보시기 바랍니다.
최신 Android 개발에 대한 기술 콘텐츠와 함께 MAD Skills 시리즈를 계속 선보이고 있습니다.
MAD Skills에서 다음번으로 예정되었던 최신 시리즈가 Ben Weiss의 시리즈 소개와 함께 이제 막 시작되었습니다.
WorkManager의 기초: Caren Chang이 WorkManager의 기초에 관해 설명하는 이번 에피소드로 기술 콘텐츠의 출발선을 끊었습니다. Caren은 WorkManager를 사용해 이미지를 흐리게 하는 예제를 설명합니다. WorkManager 코드랩에서 코드를 확인하세요.
YouTube의 MAD Skills 재생목록, Medium의 문서 또는 이 모든 정보가 담긴 간편 방문 페이지에서 계속 이어질 콘텐츠를 확인하는 걸 잊지 마세요.
이제 막 새롭게 등장한 API, 자동차용 Android 앱 라이브러리입니다. 이 베타 라이브러리는 초창기의 비공개 소스 com.google.android.libraries.car.app의 기능을 기반으로 하지만, 지금은 오픈소스로 공개되어 AndroidX에서 사용할 수 있습니다.
이 API를 사용하면 Android Auto에서 실행되는 내비게이션, 주차 및 충전 앱을 개발할 수 있으며, 운전자 주의 산만 기준에 부합하는 템플릿을 제공하고 다양한 화면 폼 팩터 및 입력 차이와 같은 세부 사항을 처리함으로써 개발을 단순화할 수 있습니다.
블로그를 읽고, 가이드를 확인하고, 라이브러리를 사용하고, 새로운 앱 사용 경험을 주도해보세요.
Meghan Mehta가 RecyclerView에 관해 진행한 시리즈의 마지막 에피소드에서 ConcatAdapter를 사용하여 RecyclerView의 헤더를 구현하는 방법을 보여줍니다.
RecyclerView에서 헤더를 사용하여 앞서가기
다중 스레드 프로그래밍은 까다로울 수 있지만, 올바로 이해하는 것이 중요합니다. Kotlin 개발자들에게는 동시 실행 코드를 더 쉽게 작성할 수 있는 방법으로 코루틴 사용을 권장합니다. 하지만 코루틴을 처음 접하거나 코루틴을 정확하고 효과적으로 사용하는 방법에 관한 조언을 구하는 분이라면, 확인해 보실 만한 새 문서가 있습니다.
저희는 새 가이드에서 Kotlin 코루틴으로 개발하는 방법에 관한 모범 사례를 수집해서 정리했습니다.
Android 개발자 백스테이지 에피소드 두 편이 지난번 지금 Android에서는 이후로 새로 게시되었습니다. 아래 링크를 클릭하거나 즐겨 이용하시는 팟캐스트 클라이언트에서 해당 방송분을 확인해보세요.
필자는 ADB에 관한 지나간 에피소드를 하나씩 살펴보기를 좋아하는데, 어떤 이유와 방법으로 그런 모습과 특징을 갖추게 되었는지에 관한 깊숙하고도 은밀한 비밀을 캐내는 재미가 쏠쏠하기 때문이죠. 이번에는 Tor, Romain 그리고 필자가 Android 1.0이 나오기 오래전부터 Android 팀에서 일했던 초창기 엔지니어 중 한 명인 Dan Bornstein과 이야기를 나누었습니다. Dan은 오늘날 ART(Android Runtime)의 전신인 Dalvik 런타임을 만든 분입니다. 저희는 Dalvik에서 이루어진 디자인 결정과 런타임, 가비지 수집기, 성능과 관련된 온갖 기술적인 사항에 관해 이야기 했습니다.
156화: Android Runtime Classic(Dalvik)
여러분의 의견을 듣고 싶습니다! 이번 회에서는 Tor Norbye, Romain Guy 그리고 필자가 Android 개발자 백스테이지를 개선하기 위해 저희가 할 수 있는 일과 없는 일에 관한 이야기를 나눕니다.
157화: 오디오 피드백
꼭 설문조사의 문항에 답변해 여러분의 생각을 알려주세요!