전원 관리

Android 9(API 레벨 28)에서는 기기 전원 관리를 개선하기 위한 새로운 기능이 도입됩니다. 이러한 변경사항은, 이전 버전에 이미 있는 기능들과 더불어, 시스템 리소스를 가장 필요로 하는 앱에 해당 리소스가 분배되도록 보장합니다.

전원 관리 기능은 다음과 같은 두 가지 범주로 구분됩니다.

앱 대기 버킷
시스템은 CPU 또는 배터리와 같은 기기 리소스에 대한 앱 액세스를 사용자의 사용 패턴에 따라 제한합니다. 이것은 Android 9의 새로운 기능입니다.
배터리 세이버 개선
배터리 세이버가 켜지면 시스템이 모든 앱에 제한을 적용합니다. 이것은 Android 9에서 개선된 기존 기능입니다.

참고: 이러한 변경사항은 Android 9 대상 여부에 상관없이 모든 앱에 적용됩니다.

앱 대기 버킷

Android 9에서는 앱 대기 버킷이라는 새로운 배터리 관리 기능을 소개합니다. 앱 대기 버킷의 경우, 시스템은 얼마나 최근에 그리고 얼마나 자주 앱이 사용되는지에 따라 앱의 리소스 요청에 우선순위를 부여합니다. 앱 사용 패턴에 따라 각 앱은 5개의 우선순위 버킷 중 하나에 배치됩니다. 시스템은 앱이 어떤 버킷에 있는지에 따라 각 앱에 사용 가능한 기기 리소스를 제한합니다.

5개의 버킷은 다음과 같은 특성에 따라 앱에 우선순위 그룹을 지정합니다.

Active

사용자가 앱을 현재 사용 중이면 앱이 Active 버킷에 배치됩니다. 예:

  • 앱이 액티비티를 시작했습니다.
  • 앱이 포그라운드 서비스를 실행 중입니다.
  • 앱에 포그라운드 앱이 사용하는 콘텐츠 제공자와 연결된 동기화 어댑터가 있습니다.
  • 사용자가 앱에서 알림을 클릭합니다.

앱이 Active 버킷에 있는 경우 시스템은 앱의 작업, 알람 또는 FCM 메시지에 어떤 제한도 적용하지 않습니다.

Working Set

앱이 자주 실행되지만 현재는 활성이 아닌 경우 Working Set 버킷에 배치됩니다. 예를 들어, 사용자가 거의 매일 실행하는 소셜 미디어 앱은 Working Set에 있을 가능성이 높습니다. 또한 앱이 간접적으로 사용될 경우에도 Working Set 버킷으로 승격됩니다.

앱이 Working Set에 있는 경우 시스템은 작업을 실행하고 알람을 트리거하는 앱의 기능에 가벼운 제한을 적용합니다. 자세한 내용은 전원 관리 제한을 참조하세요.

Frequent

앱이 매일은 아니지만 정기적으로 사용되는 경우 Frequent 버킷에 배치됩니다. 예를 들어, 사용자가 체육관에서 실행하는 운동 추적 앱은 Frequent 버킷에 있을 수 있습니다.

앱이 Frequent 버킷에 있는 경우 시스템은 작업을 실행하고 알람을 트리거하는 앱의 기능에 좀더 강한 제한을 적용하며, 또한 우선순위가 높은 FCM 메시지에 제한을 적용합니다. 자세한 내용은 전원 관리 제한을 참조하세요.

Rare

앱이 자주 사용되지 않으면 Rare 버킷에 배치됩니다. 예를 들어, 사용자가 해당 호텔에 머무는 동안에만 실행되는 호텔 앱은 Rare 버킷에 있을 수 있습니다.

앱이 Rare 버킷에 있는 경우 시스템은 작업을 실행하고 알람을 트리거하고 우선순위가 높은 FCM 메시지를 수신하는 앱의 기능에 엄격한 제한을 적용합니다. 시스템은 또한 앱의 인터넷 연결 기능도 제한합니다. 자세한 내용은 전원 관리 제한을 참조하세요.

Never

설치되었지만 한 번도 실행되지 않은 앱은 Never 버킷에 할당됩니다. 시스템은 이러한 앱에 매우 엄격한 제한을 적용합니다.

시스템은 각 앱을 우선순위 버킷에 동적으로 할당하며, 필요한 경우 앱을 재할당합니다. 시스템은 각 앱이 얼마나 자주 사용될지 판별하여 적절한 버킷에 할당하기 위해 머신러닝을 사용하는 사전 로드된 앱을 사용할 수도 있습니다. 시스템 앱이 기기에 없는 경우, 기본적으로 시스템은 얼마나 최근에 앱이 사용되었는지에 따라 앱을 정렬합니다. 더 자주 활성화되는 앱은 더 높은 우선순위를 부여하는 버킷에 할당되어, 더 많은 시스템 리소스를 사용할 수 있습니다. 특히, 버킷은 앱 작업이 얼마나 자주 실행되는지, 앱이 얼마나 자주 알람을 트리거하는지 그리고 우선순위가 높은 Firebase Cloud Messaging (FCM) 메시지를 앱이 얼마나 자주 수신할 수 있는지 판별합니다. 이러한 제한은 기기가 배터리 전원을 사용 중인 동안에만 적용되며, 기기가 충전 중일 때는 시스템이 이러한 제한을 적용하지 않습니다.

모든 제조업체는 비활성 앱이 버킷에 할당되는 방식에 대해 자체적인 기준을 설정할 수 있습니다. 자신의 앱이 특정 버킷에 할당되도록 영향을 주려고 해서는 안 됩니다. 그 대신, 앱이 어떤 버킷에 있더라도 잘 동작하도록 앱을 만드는 데 집중하세요. 앱은 새로운 메서드인 UsageStatsManager.getAppStandbyBucket()을 호출하여 현재 어떤 버킷에 있는지 알아낼 수 있습니다.

참고: 잠자기 허용 목록에 있는 앱은 앱 대기 버킷 기반의 제한을 받지 않습니다.

모범 사례

앱이 잠자기 및 앱 대기 모드의 모범 사례를 이미 준수하고 있다면, 새로운 전원 관리 기능을 다루는 것이 어렵지 않을 것입니다. 그러나 이전에는 잘 작동했던 일부 앱 동작이 이제는 문제가 될 수도 있습니다.

  • 자신의 앱을 특정 버킷에 넣기 위해 시스템을 조작하려고 시도하지 마십시오. 시스템의 버킷 지정 방식은 바뀔 수 있으며, 모든 기기 제조업체는 자사만의 알고리즘으로 자체적인 버킷 지정 앱을 작성하도록 선택할 수 있습니다. 그 대신, 앱이 어떤 버킷에 있더라도 적절히 동작하도록 만드세요.
  • 앱에 시작 관리자 액티비티가 없는 경우에는 앱이 Active 버킷으로 승격되지 않을 수 있습니다. 이 경우 이러한 액티비티를 갖도록 앱을 다시 디자인하는 것이 좋습니다.
  • 앱의 알림이 실행되지 않을 경우, 사용자가 알림과의 상호작용을 통해 Active 버킷으로 앱 승격을 트리거할 수 없습니다. 이 경우 , 사용자로부터 응답을 허용하도록 적절한 알림을 다시 디자인하는 것이 좋습니다. 몇몇 가이드라인에 대해서는 머티리얼 디자인알림 디자인 패턴을 참조하세요.
  • 마찬가지로, 우선순위가 높은 FCM 메시지를 수신할 때 앱이 알림을 표시하지 않는다면, 사용자에게 이 앱과 상호작용하여 앱을 Active 버킷으로 승격시킬 수 있는 기회가 부여되지 않을 것입니다. 실제로, 우선순위가 높은 FCM 메시지의 정해진 유일한 용도는 이러한 상황이 절대 발생하지 않도록 사용자에게 알림을 푸시하는 것입니다. 사용자 상호작용을 트리거하지 않을 때 FCM 메시지를 우선순위가 높은 메시지로 부적절하게 표시하는 경우, 다른 부정적인 결과를 일으킬 수 있습니다. 예를 들어, 앱이 할당량을 소진하는 결과를 초래할 수 있으며, 진짜 긴급한 FCM 메시지가 일반 우선순위 메시지로 처리될 수 있습니다.

    참고: 사용자가 반복해서 알림을 해제하는 경우 시스템은 향후에 알림을 차단하는 옵션을 사용자에게 제공합니다. 자신의 앱을 Active 버킷에 유지하기 위한 목적으로 사용자에게 스팸을 보내지는 마세요!

  • 앱이 여러 패키지에 분할된 경우 이들 패키지가 다른 버킷에 있을 수 있으며, 그 결과 액세스 레벨이 달라질 수 있습니다. 이러한 앱이 올바로 동작하는지 확인하려면 다양한 버킷에 할당된 패키지로 앱을 테스트해야 합니다.

배터리 세이버 개선

Android 9에서는 배터리 세이버 모드가 여러 가지로 개선되었습니다. 기기 제조업체는 적용되는 정확한 제한사항을 결정합니다. 예를 들어, AOSP 빌드에서 시스템은 다음과 같은 제한을 적용합니다.

  • 시스템은 앱이 유휴 상태가 되기를 기다리는 대신 보다 적극적으로 앱을 앱 대기 모드에 둡니다.
  • 백그라운드 실행 제한은 대상 API 레벨에 상관없이 모든 앱에 적용됩니다.
  • 화면이 꺼지면 위치 서비스가 비활성화될 수도 있습니다.
  • 백그라운드 앱에는 네트워크 액세스 권한이 없습니다.

또한, 다른 기기별 전원 최적화 기능들이 있습니다. 자세한 내용은 부록: 전원 관리 제한을 참조하세요.

항상 그렇듯이, 배터리 세이버가 활성화된 동안 앱을 테스트하는 것이 좋은 방법입니다. 기기의 Settings > Battery Saver 화면을 통해 배터리 세이버를 수동으로 켤 수 있습니다.

테스트 및 문제해결

새로운 전원 관리 기능은 Android 9 기기에서 실행되는 모든 앱에 영향을 미치며, 앱이 Android 9을 대상으로 하는지는 상관 없습니다. 중요한 점은 앱이 기기에서 올바로 동작하도록 보장하는 것입니다.

다양한 조건 하에서 앱의 주요 사용 사례를 테스트하여 전원 관리 기능이 서로 어떻게 상호작용하는지 확인하세요. Android 디버그 브리지 명령을 사용하여 일부 기능을 켜고 끌 수 있습니다.

Android 디버그 브리지 명령

Android 디버그 브리지 셸 명령을 사용하여 여러 가지 전원 관리 기능을 테스트할 수 있습니다.

ADB를 사용하여 기기를 잠자기 모드로 전환하는 방법은 잠자기 및 앱 대기 모드로 테스트를 참조하세요.

앱 대기 버킷

ADB를 사용하면 앱을 수동으로 앱 대기 버킷에 할당할 수 있습니다. 앱의 버킷을 변경하려면 다음 명령을 사용하세요.

$ adb shell am set-standby-bucket packagename active|working_set|frequent|rare

또한 이 명령을 사용하여 여러 패키지를 동시에 설정할 수 있습니다.

$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...

앱이 어떤 버킷에 있는지 확인하려면 다음을 실행하세요.

$ adb shell am get-standby-bucket [packagename]

packagename 매개변수를 전달하지 않을 경우 이 명령은 모든 앱의 버킷을 나열합니다. 또한 앱이 새로운 메서드인 UsageStatsManager.getAppStandbyBucket()을 호출하여 런타임에 버킷을 찾을 수도 있습니다.

배터리 세이버

저전력 조건 하에서 앱이 어떻게 동작하는지 테스트하기 위한 여러 명령이 있습니다.

참고: 또한 기기의 Settings > Battery saver 화면을 사용하여 기기를 배터리 세이버 모드로 전환할 수도 있습니다.

기기의 플러그를 뽑고 시뮬레이션하려면, 다음 명령을 사용하세요.

$ adb shell dumpsys battery unplug

저전력 조건 하에서 기기가 어떻게 동작하는지 테스트하려면, 이 명령을 사용하세요.

$ adb shell settings put global low_power 1

테스트를 마쳤다면, 이 명령을 사용하여 수동 기기 설정을 실행취소할 수 있습니다.

$ adb shell dumpsys battery reset