기여자: Inara Ramji (소프트웨어 엔지니어), Rodrigo Farell (상호 작용 디자이너), James Kelly (제품 관리자), Henry Chin (프로그램 관리자).
원문은 여기서 확인하실 수 있으며 블로그 리뷰에는 노현석(GDE)님이 참여해주셨습니다.
사용자들은 대부분 스마트폰을 사용하며 많은 시간을 보냅니다. 일 또는 게임을 하거나 친구와 연락할 때도, 디지털 생활을 하려면 일단 앱을 사용하기 마련입니다. 앱이 작동하려면 특정 권한을 요청해야 할 때가 많지만, 어떤 기기든 수십 개의 앱이 있으면 이전에 부여한 권한을 그대로 유지하기 어려울 수 있습니다. 특히 장기간 사용하지 않은 앱의 경우 더욱 그러합니다.
Android 11에서는 권한 자동 초기화 기능을 도입했습니다. 이 기능은 앱을 몇 달간 사용하지 않을 경우, 요청 시 사용자에게 프롬프트를 표시하는 권한인 앱의 런타임 권한을 자동으로 초기화하여 사용자의 개인정보를 보호합니다. 2021년 12월부터 이 기능을 더욱 많은 기기로 확장할 예정입니다. 이 기능은 Android 6.0(API 레벨 23) 이상을 실행하는 Google Play 서비스를 사용하는 기기에서 자동으로 활성화 될 예정입니다.
이 기능은 Android 11(API 레벨 30) 이상을 대상으로 하는 앱에서 기본적으로 활성화됩니다. 하지만 API 레벨 23부터 29까지를 대상으로 하는 앱에 대해 수동으로 권한 자동 초기화를 사용할 수 있습니다.
이 사실이 개발자 여러분에게 의미하는 바는 무엇일까요?
예외
기업에서 사용하는 활성 장치 관리자 앱, 기업 정책에 따라 수정된 권한 등 일부 앱과 권한은 자동으로 해지 대상에서 제외됩니다.
사용자에게 자동 초기화의 비활성화를 요청
필요한 경우 개발자 여러분은 시스템이 앱의 사용 권한을 초기화하지 못하도록 조치할 것을 사용자에게 요청할 수 있습니다. 이는 앱이 사용자와의 상호 작용 없이 주로 백그라운드에서 작동할 것으로 기대되는 상황에서 유용합니다. 주요 사용 사례가 여기에 있습니다.
현재 동작과 새로운 동작의 비교
현재 동작 | 새로운 동작 |
Android 11(API 레벨 30) 이상의 기기에서는 사용 권한이 자동으로 초기화됩니다. | 다음 기기에서 사용 권한이 자동으로 초기화됩니다. |
Android 11 이상을 대상으로 하는 앱의 경우 사용 권한이 기본적으로 초기화됩니다. 사용자는 Android 6.0(API 레벨 23) 이상을 대상으로 하는 앱에 대해 수동으로 자동 초기화를 사용할 수 있습니다. | 현재 동작이 유지됩니다. |
앱이 사용자에게 앱에 대한 자동 초기화 비활성화를 요청할 수 있습니다. | 현재 동작이 유지됩니다. |
코드 변경 필수 사항
앱이 API 30 이상을 대상으로 하고 사용자에게 권한 자동 초기화를 비활성화하도록 요청하는 경우에는, 개발자 여러분이 몇 가지 간단한 코드 변경을 하셔야 합니다. 앱이 자동 초기화를 비활성화하지 않으면 코드를 변경할 필요가 없습니다.
참고: 이 API는 targetSDK가 API 30 이상인 앱만을 대상으로 하는데, 이러한 앱에 대해서만 권한 자동 초기화가 기본적으로 적용되기 때문입니다. 앱의 targetSDK가 API 29 이하인 경우에는 개발자 여러분이 아무것도 변경할 필요가 없습니다.
아래 표에 새로운 크로스 플랫폼 API를 요약해 두었습니다(Android 11에 게시된 API와 비교).
작업 | Android 11 API (Android 11 이상의 기기에서만 작동) | 새로운 크로스 플랫폼 API (Android 11 이상의 기기를 포함한 Android 6.0 이상의 기기에서 작동) |
기기에서 권한 자동 초기화가 사용되는지 확인 | Build.VERSION.SDK_INT >= Build.VERSION_CODES.R인지 확인 | androidx.core.content.PackageManagerCompat.getUnusedAppRestrictionsStatus() 호출 |
앱에 대해 자동 초기화가 비활성화되어 있는지 확인 | PackageManager. isAutoRevokeWhitelisted() 호출 | androidx.core.content. PackageManagerCompat. getUnusedAppRestrictionsStatus() 호출 |
사용자가 앱에 대한 자동 초기화를 비활성화하도록 요청 | Action이 포함된 인텐트 보내기 Intent.ACTION_AUTO_REVOKE_PERMISSIONS | androidx.core.content. IntentCompat. createManageUnusedAppRestrictionsIntent()로 생성된 인텐트 보내기 |
이 크로스 플랫폼 API는 Jetpack Core 라이브러리의 일부로, Jetpack Core v1.7.0에 제공할 예정입니다. 이 API는 현재 베타 버전으로 제공됩니다.
사용자가 자동 초기화를 비활성화해야 하는 앱의 샘플 로직:
val future: ListenableFuture<Int> =
PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener(
{ onResult(future.get()) },
ContextCompat.getMainExecutor(context)
)
fun onResult(appRestrictionsStatus: Int) {
when (appRestrictionsStatus) {
// Status could not be fetched. Check logs for details.
ERROR -> { }
// Restrictions do not apply to your app on this device.
FEATURE_NOT_AVAILABLE -> { }
// Restrictions have been disabled by the user for your app.
DISABLED -> { }
// If the user doesn't start your app for months, its permissions
// will be revoked and/or it will be hibernated.
// See the API_* constants for details.
API_30_BACKPORT, API_30, API_31 ->
handleRestrictions(appRestrictionsStatus)
}
}
fun handleRestrictions(appRestrictionsStatus: Int) {
// If your app works primarily in the background, you can ask the user
// to disable these restrictions. Check if you have already asked the
// user to disable these restrictions. If not, you can show a message to
// the user explaining why permission auto-reset and Hibernation should be
// disabled. Tell them that they will now be redirected to a page where
// they can disable these features.
Intent intent = IntentCompat.createManageUnusedAppRestrictionsIntent
(context, packageName)
// Must use startActivityForResult(), not startActivity(), even if
// you don't use the result code returned in onActivityResult().
startActivityForResult(intent, REQUEST_CODE)
}
위의 로직은 Android 6.0부터 Android 10, 그리고 Android 11 이상의 기기에서도 작동합니다. 새 API를 사용하는 것만으로도 충분하며, 더 이상 Android 11 자동 초기화 API를 호출할 필요가 없습니다.
Android 12 앱 최대 절전 모드와의 호환성
새로운 API는 Android 12에 도입된 앱 최대 절전 모드와도 호환됩니다(API 레벨 31). 최대 절전 모드는 사용하지 않는 앱에 적용되는 새로운 제한 기능입니다. 이 기능은 Android 12 이전의 OS 버전에서는 제공되지 않습니다.
getUnusedAppRestrictionsStatus() API는 권한 자동 초기화와 앱 최대 절전 모드가 모두 앱에 적용되는 경우에 API_31을 반환합니다.
출시 일정
2021년 9월 15일 - 크로스 플랫폼 간 자동 초기화 API가 현재 베타 버전이므로(Jetpack Core 1.7.0 베타 라이브러리), 개발자 여러분은 지금 바로 이 API를 사용하실 수 있습니다. 권한 자동 초기화를 지원하지 않는 기기에서도 안전하게 사용할 수 있습니다(API는 이들 기기에서 FEATURE_NOT_AVAILABLE을 반환합니다).
2021년 10월 - 크로스 플랫폼 간 자동 초기화 API를 안정적인 API(Jetpack Core 1.7.0)로 사용할 수 있게 됩니다.
2021년 12월 - 권한 자동 초기화 기능은 Android 6.0부터 Android 10까지의 버전을 실행하는 Google Play 서비스를 사용하는 모든 기기를 위해 단계적으로 출시될 예정입니다. 이들 기기에서 사용자는 이제 자동 초기화 설정 페이지로 이동하여 특정 앱에 대해 자동 초기화를 활성화/비활성화할 수 있습니다. 기기에서 이 기능을 사용하기 시작한 지 몇 주 후에, 시스템은 사용되지 않는 앱의 사용 권한을 자동으로 초기화하기 시작합니다.
2022년 1분기 - Android 6.0부터 Android 10까지의 버전을 실행하는 모든 기기에 권한 자동 초기화 기능을 제공할 예정입니다.