앱 대기 버킷

Android 9(API 수준 28) 이상에서는 앱 대기 버킷을 지원합니다. 앱 대기 버킷을 사용하면 앱이 얼마나 최근에 얼마나 자주 사용되었는지에 기반해 시스템이 앱의 리소스 요청에 우선순위를 정할 수 있습니다. 앱 사용 패턴에 따라 각 앱은 5개의 우선순위 버킷 중 하나에 배치됩니다. 시스템은 앱이 어떤 버킷에 있는지에 기반해 각 앱에서 사용 가능한 기기 리소스를 제한합니다.

우선순위 버킷

시스템은 각 앱을 우선순위 버킷에 동적으로 할당하여 필요에 따라 앱을 재할당합니다. 시스템은 머신러닝을 사용하여 각 앱이 사용될 가능성을 판단하고 적절한 버킷에 앱을 할당하는 미리 로드된 앱에 의존할 수 있습니다.

시스템 앱이 기기에 없다면 시스템은 기본적으로 앱이 얼마나 최근에 사용되었는지에 따라 앱을 정렬합니다. 더 많이 활성화되는 앱이 앱에 높은 우선순위가 부여되는 버킷에 할당되므로 앱에서 더 많은 시스템 리소스를 사용할 수 있습니다. 특히 버킷은 앱의 작업이 실행되는 빈도와 앱이 알람을 트리거할 수 있는 빈도를 결정합니다. 이러한 제한은 기기가 배터리 전원을 사용하는 동안에만 적용됩니다. 시스템은 기기가 충전 중일 때는 앱에 이러한 제한을 적용하지 않습니다.

우선순위 버킷은 다음과 같습니다.

  • 활성: 앱이 사용 중이거나 매우 최근에 사용되었습니다.
  • 작업 세트: 앱이 정기적으로 사용됩니다.
  • 자주 사용: 앱이 매일은 아니지만 자주 사용됩니다.
  • 드물게 사용: 앱이 자주 사용되지 않습니다.
  • 제한됨: 앱이 시스템 리소스를 많이 사용하거나 원하지 않는 동작을 보일 수 있습니다.

이러한 우선순위 버킷 외에도 설치되어 있지만 한 번도 실행되지 않은 앱에는 특별히 사용한 적 없음 버킷이 있습니다. 시스템은 이러한 앱에 엄격한 제한을 가합니다.

다음은 예측할 수 없는 사례를 설명합니다. 반대로 예측이 머신러닝을 사용하여 동작을 예측할 때 최근 사용 순에 기반하기보다는 사용자의 다음 작업을 예상하여 버킷이 선택됩니다. 예를 들어 최근에 사용한 앱이 드물게 사용 버킷으로 최종 분류될 수 있습니다. 머신러닝에서 몇 시간 동안 앱이 사용되지 않을 것으로 예측하기 때문입니다.

사용 중

앱이 사용 중이거나 매우 최근에 사용되었거나 다음 중 하나를 실행하는 동안 활성 버킷에 있습니다.

  • 활동을 시작합니다.
  • 오랫동안 실행되는 포그라운드 서비스를 실행합니다.
  • 사용자가 알림에서 탭합니다.

앱이 활성 버킷에 있으면 시스템은 앱의 작업이나 알람에 제한을 두지 않습니다.

사용자 상호작용은 앱을 활성 상태로 할당

Android 9(API 수준 28) 이상에서는 사용자가 특정 방식으로 앱과 상호작용할 때 시스템이 일시적으로 앱을 활성 버킷에 배치합니다. 사용자가 앱과의 상호작용을 중지한 후 시스템은 사용 기록에 따라 앱을 버킷에 배치합니다.

다음은 이 시스템 동작을 트리거하는 상호작용의 예입니다.

  • 사용자가 앱이 보낸 알림을 탭합니다.

  • 사용자가 미디어 버튼을 탭하여 앱의 포그라운드 서비스와 상호작용합니다.

  • 사용자가 Android Automotive OS와 상호작용하는 중에 이 OS의 포그라운드 서비스 또는 CONNECTION_TYPE_PROJECTION을 사용하는 앱에 연결합니다.

작업 세트

자주 실행되지만 활성 상태가 아닌 경우 앱은 작업 세트 버킷에 있습니다. 예를 들어 사용자가 거의 매일 실행하는 소셜 미디어 앱은 작업 세트에 배치될 가능성이 높습니다. 앱이 간접적으로 사용될 때에도 작업 세트 버킷으로 승격됩니다.

앱이 작업 세트에 있다면 시스템은 앱의 작업 실행 및 알람 트리거 기능에 가벼운 제한을 적용합니다. 자세한 내용은 전력 관리 제한사항을 참고하세요.

자주 사용

정기적으로 사용되나 매일 사용되지 않는 경우 앱은 자주 사용 버킷에 있습니다. 예를 들어 사용자가 헬스장에서 실행하는 운동 추적 앱은 자주 사용 버킷에 있을 수 있습니다.

앱이 자주 사용 버킷에 있다면 시스템은 작업을 실행하고 알람을 트리거하는 앱의 기능에 더 강력한 제한을 적용합니다. 자세한 내용은 전력 관리 제한사항을 참고하세요.

드물게 사용

자주 사용되지 않는 앱은 드물게 사용 버킷에 있습니다. 예를 들어 사용자가 호텔에 머무는 동안만 실행하는 호텔 앱은 드물게 사용 버킷에 있을 수 있습니다.

앱이 드물게 사용 버킷에 있다면 시스템은 작업을 실행하고 알람을 트리거하는 앱의 기능에 엄격한 제한을 적용합니다. 시스템은 앱의 인터넷 연결 기능도 제한합니다. 자세한 내용은 전력 관리 제한사항을 참고하세요.

제한됨

Android 12(API 수준 31)에서 추가된 이 버킷은 모든 버킷 중에서 우선순위가 가장 낮습니다(제한사항은 가장 많음). 시스템은 사용자가 상호작용하는 빈도와 같은 앱의 동작을 고려하여 앱을 제한됨 버킷에 배치할지 결정합니다.

Android 13(API 수준 33) 이상에서는 앱이 예외 요건을 충족하지 않는 한, 다음과 같은 경우에 시스템이 앱을 제한됨 버킷에 배치합니다.

  • 사용자가 특정 기간 동안 앱과 상호작용하지 않습니다. Android 12(API 수준 31) 및 12L(API 수준 32)에서 기준은 45일입니다. Android 13에서는 8일을 줄입니다.

  • 앱이 24시간 동안 과도한 개수의 브로드캐스트 또는 바인딩을 호출합니다.

시스템이 앱을 제한됨 버킷에 배치하면 다음 제한사항이 적용됩니다.

  • 하루에 한 번 10분 일괄 세션으로 작업을 실행할 수 있습니다. 이 세션 동안 시스템은 앱의 작업을 다른 앱의 작업과 그룹화합니다.
    • 제한됨 작업은 단독으로 실행되지 않습니다. 동시에 실행 중이거나 대기 중인 다른 작업이 하나 이상 있어야 하며 이 작업은 다른 작업을 포함할 수 있습니다.
  • 앱은 시스템이 앱을 덜 제한적인 버킷에 배치할 때와 비교하여 신속 처리 작업을 더 적게 실행할 수 있습니다.
  • 앱에서는 하루에 한 개의 알람을 호출할 수 있습니다. 이 알람은 정확한 알람 또는 부정확한 알람일 수 있습니다.

제한됨 버킷의 예외

다음 유형의 앱은 Android 12 이상에서도 제한됨 버킷에 들어가지 않고 비활성 트리거를 우회합니다.

우선순위 버킷 평가

앱이 할당된 버킷을 확인하려면 다음 중 하나를 실행하세요.

  • getAppStandbyBucket()을 호출합니다.

  • 터미널 창에서 다음 명령어를 실행합니다.

    adb shell am get-standby-bucket PACKAGE_NAME

시스템은 값이 STANDBY_BUCKET_ACTIVE(10)보다 큰 앱 대기 버킷에 앱이 배치될 때마다 앱을 제한합니다.

권장사항

앱이 잠자기 및 앱 대기 관련 권장사항을 따르는 경우 이후 전력 관리 기능은 어렵지 않습니다. 그러나 이전에 잘 작동한 일부 앱 동작이 문제를 일으킬 수 있습니다.

  • 앱을 특정 버킷에 배치하기 위해 시스템을 조작하려고 하면 안 됩니다. 시스템의 우선순위 지정 방법은 변경될 수 있으며 모든 기기 제조업체는 자체 알고리즘으로 자체 버케팅 앱을 작성할 수도 있습니다. 그보다는 어느 버킷에 있든 앱이 적절히 동작하는지 확인하세요.
  • 앱에 런처 활동이 없다면 활성 버킷으로 승격되지 않을 수 있습니다. 이러한 활동을 포함하도록 앱을 다시 디자인해 보세요.
  • 사용자가 앱 알림과 상호작용할 수 없으면 앱의 활성 버킷 승격을 트리거할 수 없습니다. 이 경우 사용자가 상호작용할 수 있는 알림을 다시 설계하는 것이 좋습니다. 가이드라인은 Material Design 알림 디자인 패턴을 참고하세요.

  • 우선순위가 높은 Firebase 클라우드 메시징(FCM) 메시지를 수신할 때 앱에 알림이 표시되지 않으면 사용자가 앱과 상호작용할 수 없으므로 앱이 활성 버킷으로 승격되지 않습니다. 사실 높은 우선순위의 FCM 메시지의 유일한 용도는 알림을 사용자에게 푸시하는 것이므로 이러한 상황이 발생해서는 안 됩니다. 12L(API 수준 32) 이하에서는 사용자 상호작용을 트리거하지 않을 때 FCM 메시지를 높은 우선순위로 잘못 표시하는 경우 향후 메시지의 우선순위가 낮아질 수 있습니다.

  • 앱이 여러 패키지로 분할된 경우 이러한 패키지는 다양한 버킷에 있을 수 있으므로 액세스 수준도 다양합니다. 다양한 버킷에 할당된 패키지로 이러한 앱을 테스트하여 앱이 제대로 작동하는지 확인합니다.