안드로이드 9부터는 App Standby Bucket이라는 전원 관리 기능이 추가되었다.
(https://developer.android.com/about/versions/pie/power)
App Standby Bucket이란 안드로이드 시스템이 앱을 처리하는 우선순위를 아래와 같이 크게 다섯 가지로 분류하는 기능이다.
- Active
- Working set
- Frequent
- Rare
- Never
사용자가 앱을 얼마나 자주 사용하는지에 따라 각 버킷으로 이동하게 되며 정확한 기준은 (어뷰징을 생각한다면 당연히) 알려져있지 않다.
한 가지 주의할 부분은 앱이 어느 버킷에 있느냐에 따라 FCM 수신 시의 동작이 달라진다는 점이다.
보통 도즈 모드에 진입 시 우선순위가 high로 지정된 FCM을 받으면 앱이 깨어나는 것으로 알려져있으나, 앱이 어느 버킷에 있느냐에 따라 하루에 받을 수 있는 high priority FCM 개수가 달라지게 된다.
- Active: 제한 없음
- Working set: 제한 없음
- Frequent: 하루 10개
- Rare: 하루 5개
(https://developer.android.com/topic/performance/power/power-details.html)
그러나 FCM으로 인해 사용자와 상호작용이 발생하는 경우(Notification 등)는 쿼터를 소모하지 않는다.
(https://firebase.google.com/docs/cloud-messaging/concept-options?hl=en#setting-the-priority-of-a-message)
ADB로 테스트하기
아래와 같은 ADB 명령으로 버킷을 지정하거나 현재 어느 버킷에 있는지를 읽어올 수 있다.
(https://developer.android.com/about/versions/pie/power#adb-commands)
$ 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]
숫자의 의미
get-standby-bucket을 실행하면 Active, Working set 이런 식으로 나오는게 아니고 숫자만 하나 띡 나오고 끝난다.
숫자들의 의미는 다음과 같다.
- 10: Active
- 20: Working set
- 30: Frequent
- 40: Rare
공식 문서에는 여기까지만 나와있지만 두 가지가 더 있다.
- 5: Exempted
- 화이트리스트에 추가되어 전원 관리의 영향을 받지 않음
- 50: Never
- 사용자가 한 번도 사용한 적이 없음