앱 최대 절전 모드

앱이 Android 11(API 수준 30) 및 이후 버전을 타겟팅하고 사용자가 몇 개월 동안 앱과 상호작용하지 않은 경우 시스템은 앱을 최대 절전 모드 상태로 전환합니다. 시스템은 성능이 아니라 저장공간을 최적화하며 사용자 데이터를 보호합니다. 이러한 시스템 동작은 사용자가 시스템 설정에서 앱을 수동으로 강제 종료하는 경우에 발생하는 동작과 비슷합니다.

최대 절전 모드의 영향

표 1에서 볼 수 있듯이 최대 절전 모드의 영향은 앱의 타겟 SDK 버전 및 앱이 실행되는 기기에 따라 다릅니다.

표 1. 최대 절전 모드가 앱에 미치는 영향
타겟 SDK 버전 기기 특성 최대 절전 모드 효과
Android 12 및 이후 버전 Android 12 및 이후 버전 실행

앱의 런타임 권한이 재설정됩니다. 이 작업은 사용자가 시스템 설정에서 권한을 확인하고 앱의 액세스 수준을 거부로 변경한 것과 동일한 효과를 갖습니다.

앱이 백그라운드에서 작업이나 알림을 실행할 수 없습니다.

앱이 Firebase 클라우드 메시징을 통해 전송되는 높은 우선순위의 메시지를 비롯한 푸시 알림을 수신할 수 없습니다.

앱 캐시에 있는 모든 파일이 삭제됩니다.

Android 11 Android 11 실행 앱의 런타임 권한이 재설정됩니다.
Android 11 Android 6.0(API 수준 23)~Android 10(API 수준 29)을 실행하며 Google Play 서비스를 기반으로 합니다.

앱의 런타임 권한이 재설정됩니다.

이 동작은 2021년 12월부터 적용됩니다. 블로그 게시물에서 수많은 기기에 권한 자동 초기화를 제공하는 방법을 자세히 알아보세요.

앱이 최대 절전 모드를 종료하는 경우의 시스템 동작

사용자가 다음번에 앱과 상호작용할 때 앱이 최대 절전 모드를 종료하므로 작업과 알림을 다시 만들 수 있습니다.

단, 시스템은 앱을 위해 다음 작업을 하지 않습니다.

  1. 앱의 런타임 권한을 다시 부여하지 않습니다.

    사용자가 앱에 권한을 다시 부여해야 합니다.

  2. 앱이 최대 절전 모드로 전환되기 전에 예약된 모든 작업과 알림을 다시 예약하지 않습니다.

    이 워크플로를 더 쉽게 지원하려면 WorkManager를 사용하세요. 앱이 최대 절전 모드를 종료할 때 그리고 기기가 부팅된 후 호출되는 ACTION_BOOT_COMPLETED broadcast receiver에 일정 변경 로직을 추가할 수도 있습니다.

앱 사용

이어지는 섹션에서는 앱 사용의 예와 시스템이 앱 사용으로 간주하지 않는 작업의 예를 제공합니다.

앱 사용의 예

앱의 활동이 재개되면 시스템은 이 이벤트를 사용자 상호작용으로 간주합니다. 따라서 시스템은 앱이 최대 절전 모드로 전환되기까지의 시간을 연장합니다.

Android 11 및 이후 버전에서는 다음 동작도 사용자 상호작용으로 간주됩니다.

  • 사용자가 위젯과 상호작용합니다.
  • 사용자가 알림과 상호작용합니다(알림을 닫는 경우 제외).

최대 절전 모드의 앱 사용에는 사용자 상호작용이 명시적으로 필요하지 않습니다. 패키지의 구성요소가 호출되는 한 앱 사용으로 간주됩니다. 이에 해당하는 예는 다음과 같습니다.

  • 기기 또는 OS에서 다른 앱에 바인딩된 서비스 또는 콘텐츠 제공자가 있는 앱. 예: 입력 방식 편집기(IME) 또는 비밀번호 관리자
  • 외부 패키지에서 명시적 브로드캐스트를 수신하는 패키지의 broadcast receiver

앱 사용이 아닌 예

앱이 다음 목록의 동작만 보이는 경우에는 몇 개월 후에 최대 절전 모드로 전환됩니다.

최대 절전 모드에 대한 시스템 예외

Android에서는 특정 사용 사례에서 앱 최대 절전 모드에 대한 시스템 수준의 예외를 부여합니다. 앱이 다음 카테고리 중 하나에 속하는 경우 앱 사용 표준에서 제외되며 최대 절전 모드로 전환되지 않습니다.

런처에 표시되지 않은 앱
런처에 활성 바로가기 타일이 없는 앱
직장 프로필 앱
사용자가 직장 프로필에 설치한 모든 앱. 동일한 앱이 개인 프로필에도 존재하는 경우 직장 프로필 앱만 제외됩니다.
기기 정책 컨트롤러
로컬 기기 정책 및 기기의 시스템 애플리케이션을 제어하는 앱
이동통신사 권한 앱
휴대전화 이동통신사가 기기에 미리 로드했으며 계약상 요구되는 서비스 의무(예: 음성사서함 및 고객 서비스 앱)에 필요하다고 간주하는 모든 앱
서드 파티 설치 프로그램 앱
서드 파티 앱 스토어(설치된 앱의 자동 업데이트를 위해)

최대 절전 모드에 대한 사용자 예외

앱의 핵심 사용 사례가 최대 절전 모드의 영향을 받을 것으로 예상된다면 사용자에게 앱 최대 절전 모드에 대한 예외를 요청할 수 있습니다. 이 예외는 앱이 다음 중 하나를 실행하는 경우와 같이 사용자가 앱과 상호작용하지 않아도 앱이 주로 백그라운드에서 작동한다고 예상하는 상황에 유용합니다.

  • 가족 구성원의 위치를 주기적으로 보고하여 가족의 안전을 제공합니다.
  • 기기와 앱 서버 간에 데이터를 동기화합니다.
  • TV와 같은 스마트 기기와 통신합니다.
  • 시계와 같은 호환 기기와 페어링합니다.

예외를 요청하려면 이어지는 섹션에 안내된 단계를 완료하세요.

사용자가 이미 앱의 최대 절전 모드를 사용 중지했는지 확인

사용자가 이미 앱의 최대 절전 모드를 사용 중지했는지 확인하려면 getUnusedAppRestrictionsStatus() API를 사용합니다.

앱에서 이 API를 사용하는 방법에 관한 자세한 내용은 이 페이지의 API 코드 예를 참고하세요.

사용자에게 앱의 최대 절전 모드 사용 중지 요청

사용자가 아직 앱의 최대 절전 모드를 사용 중지하지 않았다면 사용자에게 요청을 보낼 수 있습니다. 이렇게 하려면 다음 단계를 완료하세요.

  1. 사용자에게 앱의 최대 절전 모드를 사용 중지해야 하는 이유를 설명하는 UI를 표시합니다.
  2. API 코드 예시와 같이 createManageUnusedAppRestrictionsIntent() API를 호출합니다. 이 API는 설정에서 앱 정보 화면을 로드하는 인텐트를 만듭니다. 여기에서 사용자가 앱의 최대 절전 모드를 사용 중지할 수 있습니다.

    이 인텐트를 전송할 때 startActivity()가 아닌 startActivityForResult()를 호출하는 것이 중요합니다.

    표 2에서 볼 수 있듯이 옵션의 위치와 이름은 앱이 설치된 기기의 특성에 따라 다릅니다.

    표 2. 앱의 최대 절전 모드를 사용 중지하는 옵션
    기기 특성 옵션이 표시되는 페이지 사용 중지할 옵션 이름
    Android 13 및 이후 버전 실행 앱 정보 사용하지 않을 때 앱 활동 일시중지
    Android 12 실행 앱 정보 권한을 삭제하고 여유 공간 확보
    Android 11 실행 앱 정보 > 권한 앱이 사용되지 않는 경우 권한 삭제
    Android 6.0~Android 10을 실행하고 Google Play 서비스에서 제공 Play 앱 > 메뉴 > Play 프로텍트 > 사용하지 않는 앱의 권한 앱이 사용되지 않는 경우 권한 삭제

API 코드 예

이 코드 예는 앱의 최대 절전 모드가 사용 설정되었는지 확인하는 방법과 사용자에게 앱의 최대 절전 모드를 사용 중지하도록 요청하는 올바른 방법을 보여줍니다.

Kotlin

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. 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 or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

레거시 플랫폼 API

운영체제에는 최대 절전 모드 기능과 상호작용하는 API도 있습니다. 단, 이 API는 Android 11 및 이후 버전을 실행하는 기기에서만 작동하며 이전 Android 버전으로 백포팅된 최대 절전 모드 기능을 처리하지 않습니다. 따라서 이 API는 사용하지 않는 것이 좋습니다.

호환성 목적으로 이 API를 계속 사용해야 하는 경우 다음 목록에서 사용 방법을 확인하세요.

최대 절전 모드 동작 수동 호출

시스템이 앱을 최대 절전 모드 상태로 전환한 후에 앱이 어떻게 동작하는지 테스트하려면 다음 단계를 완료하세요.

  1. (Android 12 및 이후 버전만) 기기에서 최대 절전 모드 동작을 사용 설정합니다.

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. 시스템이 최대 절전 모드로 전환될 때까지 기다릴 시간의 기본값을 설정합니다. 이렇게 하면 테스트 후 복원할 수 있습니다.

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. 시스템이 기다리는 시간을 줄입니다. 다음 예에서는 사용자가 앱과의 상호작용을 중지한 시점으로부터 단 1초가 지난 후에 앱이 최대 절전 모드로 전환되도록 시스템을 수정합니다.

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. 다음 명령어를 실행하여 테스트 기기에서 부팅 시간 브로드캐스트가 끝날 때까지 기다립니다.

    adb shell am wait-for-broadcast-idle
    

    브로드캐스트가 끝나면 이 명령어가 All broadcast queues are idle! 메시지를 반환합니다.

  5. 앱 최대 절전 모드 프로세스를 수동으로 호출합니다.

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Android 12 및 이후 버전만) 다음 방법 중 하나를 사용하여 앱이 최대 절전 모드로 전환되었는지 확인합니다.

    • 테스트 기기에 사용되지 않는 앱이 최대 절전 모드로 전환되었음을 나타내는 알림이 표시되는지 확인합니다.
    • 다음 명령어를 실행합니다.

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. 시스템이 앱을 최대 절전 모드로 전환할 때까지 기다리는 시간의 기본값을 복원합니다.

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold