전원 관리

Android 9(API 레벨 28)에서는 기기 전원 관리를 개선하기 위한 새로운 기능이 도입됩니다. 이러한 변경사항은 이전 버전에 이미 있는 기능과 함께 시스템 리소스가 가장 필요한 앱에 시스템 리소스를 제공하는 데 도움이 됩니다.

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

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

앱 대기 버킷

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

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

사용 중

사용자가 현재 앱을 사용 중이면 앱은 활성 버킷에 있습니다. 예를 들면 다음과 같습니다.

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

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

작업 세트

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

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

자주

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

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

드물게 사용

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

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

경험한 적 없음

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

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

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

권장사항

앱이 이미 잠자기 및 앱 대기 권장사항을 준수한다면 새로운 전력 관리 기능을 처리하는 것이 어렵지 않습니다. 그러나 이전에는 잘 작동했던 일부 앱 동작이 문제를 일으킬 수 있습니다.

  • 앱을 원하는 버킷에 배치하기 위해 시스템을 조작하려고 하면 안 됩니다. 시스템의 버케팅 메서드는 변경될 수 있으며 모든 기기 제조업체는 자체 알고리즘으로 자체 버케팅 앱을 작성할 수 있습니다. 그보다는 어느 버킷에 있든 앱이 적절히 동작하는지 확인하세요.
  • 앱에 런처 활동이 없다면 활성 버킷으로 승격되지 않을 수 있습니다. 이러한 활동을 포함하도록 앱을 다시 디자인하는 것이 좋습니다.
  • 앱의 알림을 실행할 수 없으면 사용자는 알림과 상호작용하여 앱의 활성 버킷 승격을 트리거할 수 없습니다. 이 경우 사용자의 응답을 허용하도록 적절한 알림을 다시 디자인하는 것이 좋습니다. 가이드라인은 Material Design 알림 디자인 패턴을 참고하세요.
  • 마찬가지로 앱이 우선순위가 높은 FCM 메시지를 수신할 때 알림을 표시하지 않으면 사용자가 앱과 상호작용할 수 없으므로 앱이 활성 버킷으로 승격되지 않습니다. 사실 높은 우선순위의 FCM 메시지의 유일한 용도는 알림을 사용자에게 푸시하는 것이므로 이러한 상황이 발생해서는 안 됩니다. 사용자 상호작용을 트리거하지 않을 때 FCM 메시지를 부적절하게 높은 우선순위로 표시하면 다른 부정적인 결과를 초래할 수 있습니다. 예를 들어 앱에서 할당량을 소진하여 진지하게 긴급한 FCM 메시지가 일반 우선순위로 처리될 수 있습니다.

    참고: 사용자가 알림을 반복적으로 닫으면 시스템은 나중에 알림을 차단할 수 있는 옵션을 사용자에게 제공합니다. 앱을 활성 버킷에 유지하려고 사용자에게 불필요한 알림을 보내지 마세요.

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

절전 모드 개선

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

  • 시스템은 앱이 유휴 상태가 될 때까지 기다리는 대신 앱을 더 적극적으로 앱 대기 모드로 전환합니다.
  • 백그라운드 실행 제한은 대상 API 수준과 관계없이 모든 앱에 적용됩니다.
  • 화면이 꺼져 있으면 위치 서비스가 사용 중지될 수 있습니다.
  • 백그라운드 앱에는 네트워크 액세스 권한이 없습니다.

또한, 다른 기기별 전원 최적화 기능들이 있습니다. 자세한 내용은 전력 관리 제한사항을 설명하는 페이지를 참고하세요.

절전 모드가 작동 중일 때 앱을 테스트하는 것이 좋습니다. 기기의 설정 > 절전 모드 화면을 통해 절전 모드를 수동으로 사용 설정할 수 있습니다.

테스트 및 문제 해결

새로운 전원 관리 기능은 앱이 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()를 호출하여 런타임에 버킷을 찾을 수도 있습니다.

절전 모드

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

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

$ adb shell dumpsys battery unplug

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

$ adb shell settings put global low_power 1

테스트를 마친 후에는 다음 명령어를 사용하여 수동 기기 설정을 실행취소할 수 있습니다.

$ adb shell dumpsys battery reset