-
Android 13 - Battery Resource Utilization프로그래밍/Android 2022. 8. 11. 18:28반응형
앱별 배터리 리소스 제한
- When?
- Android 9부터
- Android 13에서는 규칙 수정이 생김
- What?
- 앱이 백그라운드에서 시스템 리소스를 무한으로 사용하지 않도록 제한
- Android 9부터 Battery optimization이나 Background restriction으로 관리
- 앱이 백그라운드에서 시스템 리소스를 무한으로 사용하지 않도록 제한
- Why?
- 앱의 과도한 백그라운드 작업으로 사용자의 배터리가 빠르게 닳지 않도록 한다.
- How?
- 현재 사용 중인 앱에 대해서는 제한하지 않는다.
- Battery optimization
- App Standby Bucket
- 앱이 백그라운드로 내려갔을 때 여러 작업을 제한한다.
- 앱을 얼마나 최근에 자주 사용했는지 패턴을 파악하여 각 5가지의 앱 버킷에 위치시킨다.
- 앱 버킷의 중요도에 따라 시스템 리소스를 사용할 수 있도록 한다.
- Setting > Battery > Adaptive Battery
- Pixel 디바이스에서는 Adaptive Battery가 Enable 되어있어야 App bucket이 동작했다.
- Galaxy S10 디바이스는 Adaptive Battery 상관 없이 App bucket이 동작했다.
- App Standby Bucket
- Background restriction
- 앱이 백그라운드로 내려갔을 때 App Standby Bucket보다 강력하게 여러 작업을 제한한다.
Android 9~ From Android 13 (maybe 12) Settings > Apps > Battery > Battery optimization Settings > Apps > Battery > Battery usage 왼쪽 두 화면이 하나의 화면으로 합쳐짐
- Unrestricted
- Battery Optimization X, Background restriction X
- Optimized
- Battery Optimization O, Background restriction X
- Restricted
- Battery Optimization (?), Background restriction O
Background restriction가 제일 강력한 제한이라 Battery Optimization로 제한되고 있는지 알기 어려움
- Battery Optimization (?), Background restriction O
Settings > Apps > Battery > Background restriction
Battery optimization
App Standby Buckets
- 앱 대기 버킷 (App Standby Buckets)은 Android 9 (API level 28) 이상부터 지원한다.
- 앱을 사용하면 사용기록 history가 쌓이고 그 history에 따라 버킷에 배치된다.
- 버킷은 5가지 종류가 있고 앱의 사용 패턴에 따라 우선순위가 달라진다.
- 앱이 위치한 각 버킷에 따라 사용 가능한 시스템 리소스를 제한한다.
- 우선순위가 높아질 수록 시스템 리소스를 더 많이 사용하도록 한다.
What will be Restricted?
- 앱 대기 버킷은 시스템이 최근/자주 사용하는 앱인지에 따라 리소스를 사용할 수 있도록 우선순위를 부여한다. 시스템이 앱이 사용되는 히스토리를 가지고 더 자주 사용되는 앱일 수록 더 많은 시스템 리소스를 사용할 수 있다.
- 특히, 버킷은 WorkManager, AlarmManager, FCM, 네트워크를 제한한다.
- 단, 배터리 충전 중에는 제한이 완화된다.
- 현재 내 앱이 어떤 버킷에 있는지 UsageStatsManager#getAppStandbyBucket()로 확인할 수 있다.
The buckets are:
- Active: 앱이 최근에 사용되었거나 현재 사용중일 때
- Working set: 자주 실행되지만 현재 활성 상태가 아닌 경우
- Frequent: 앱이 매일은 아니지만 자주 사용됨
- Rare: 앱이 자주 사용되지 않음
- Restricted: 앱이 몇일 동안이나 사용되지 않음. 혹은 앱이 시스템 리소스를 많이 소비하거나 원하지 않는 동작을 보임
1. Active
- 앱을 사용 중일 때는 Active 버킷에 잠시 배치된다.
- Ex) Activity/Foreground service 실행, Content resolver 사용, Notification으로 앱 진입
- 시스템으로부터 제한되지 않는다.
2. Working set
- 자주 실행되지만 현재 Active 상태가 아닌 버킷이다.
- 예를 들면 거의 매일 사용하는 소셜 미디어앱이 있다.
- WorkManager와 AlarmManager에 가벼운 제한이 들어간다.
3. Frequent
- 정기적으로 사용되지만 매일은 사용되지 않는 버킷이다.
- 예를 들어 운동할 때 사용하는 헬스앱이 있다.
- WorkManager와 AlaramManager에 더 강력한 제한이 들어간다.
- High priority Notification에 갯수 제한이 들어간다.
4. Rare
- 드물게 사용되는 버킷이다.
- 예를 들어 여행 중에 호텔에 머무는 동안에만 사용되는 여행앱이 있다.
- WorkManager와 AlramManager 제한뿐만 아니라 인터넷 연결도 제한된다.
- High priority Notification에 갯수 제한이 들어간다.
5. Restricted bucket
- Android 12부터 추가되었다.
- 우선순위가 가장 낮고 제한 사항이 가장 많다.
- 며칠 동안 사용되지 않았고, 앞으로도 사용될 것 같지 않을 때 사용되는 버킷이다.
- 시스템은 사용 패턴 뿐만아니라 앱이 시스템 리소스를 어뷰징하는지도 판단해 해당 버킷에 배치시킨다.
- Restricted bucket에 앱을 배치하는 조건
- 사용자가 몇일 동안이나 앱을 사용하지 않았다.
- Android 12와 12L에서는 45일, Android 13부터는 8일로 지정한다. (단말이 꺼져있는 시간은 포함되지 않는다.)
- 24시간동안 과도한 개수의 Broadcast와 Service Binding을 호출한다.
- 사용자가 몇일 동안이나 앱을 사용하지 않았다.
- Restrict bucket에 배치되면 다음 제한이 적용된다.
- 하루 한 번, 10분동안의 세션에 WorkManager job을 실행할 수 있다.
- 10분이 지나면 실행이 다음날로 연기된다.
- expedited jobs 도 실행에 제한을 받는다. 다른 버킷들보다 적게 실행된다.
- exact alarm 혹은 inexact alarm 하루에 하나의 알람만 실행할 수 있다.
- 하루 한 번, 10분동안의 세션에 WorkManager job을 실행할 수 있다.
- 다른 버킷들과 다르게 충전중일때에도 제한이 적용된다. 단, 충전 중일때는 제한이 느슨해진다.
Best practices
- 앱이 원하는 버킷에 들어가기 위해 시스템을 조작해서는 안된다.
- Notifiacation 등을 통해 사용자가 앱에 자주 진입하도록 한다.
Background restriction
Allowed state
- 앱이 백그라운드에 진입했을 때, Background 동작이 제한되지 않는다.
- 단, 사용자가 Battery optimization를 켜놨으면 App standby bucket의 제한이 있을 수도 있다.
Restricted state
- Android 9 부터 유저가 직접 앱을 "Restricted 상태"에 둘 수 있다. 아래 Background 동작이 제한된다.
- 포그라운드 서비스를 실행할 수 없다.
- 기존 포그라운드 서비스가 포그라운드에서 삭제된다.
- 알람이 트리거되지 않는다.
- 작업이 실행되지 않는다.
- Notification이 딜레이될 수 있다.
- 배터리 충전 중에도 제한될 수 있다.
- 확인할 수 있는 API ActivityManager#isBackgroundRestricted()
Android 9~ Android 13 (maybe 12) From Android 13
- Battery optimization - "Restricted" App Standby Bucket
- Background restriction - "Restricted" state
- Restricted 상태에 대한 새로운 제한사항이 생겼다.
- Android 13을 타겟한 앱들은 앱이 다시 시작되기 전까지 시스템이 아래 브로드캐스트를 전달하지 않는다.
- BOOT_COMPLETED
- LOCKED_BOOT_COMPLETED
- Android 13을 타겟한 앱들은 앱이 다시 시작되기 전까지 시스템이 아래 브로드캐스트를 전달하지 않는다.
- Restricted 상태에 대한 새로운 제한사항이 생겼다.
Restriction details
Battery optimization - App standby bucket
Active Working set Frequent Rare Restricted AlarmManager 제한 없음 최대 6분 연기됨 최대 30분 연기됨 최대 2시간 연기됨 exact alarm 혹은
inexact alarm 하루에 하나의 알람WorkManager 제한 없음 최대 2시간 연기됨 최대 8시간 연기됨 최대 24시간 연기됨 매일 1회 FCM 제한 없음 제한 없음 높은 우선순위 메시지
10회/일높은 우선순위 메시지
5회/일높은 우선순위 메시지
5회/일Network 제한 없음 제한 없음 제한없음 사용안함 사용안함 - Restricted bucket에서 테스트시, Foreground service에 대한 제한은 적용되지 않았다.
- WorkManager 제한은 지정된 간격으로 10분의 시간이 부여된다. 10분의 시간이 지나면 모든 작업이 다음 기간으로 연기된다.
- AlarmManager 제한은 모든 알람이 예약된 기간에 최대 10초 동안 실행된다.
- 최대 : 제한 없음 ~ 최대 시간 (테스트해보니 시스템 상황에 따라 다른 것 같음)
- exact alaram 퍼미션이 있으면 앱 >= working set으로 제한됨
- Restricted bucket에서 inexact alarm이 하나만 실행됐지만 앱이 Active 상태가 되니 지연됐던 것이 바로 실행됨
- FCM 높은 우선순위 메시지 한도가 넘으면 높은 우선순위 메시지도 일반 메시지로 처리된다. 높은 우선순위 메시지 한도는 Android 12 이하에만 적용된다.
https://developer.android.com/topic/performance/power/power-details
Background restriction - Restricted
Unrestricted Restricted AlarmManager LogActivity: onCreate
LogActivity: onStart:
LogActivity: onResume:
LogActivity: onPause:
LogActivity: onStop:
AlarmReceiver: alarm triggered.LogActivity: onCreate
LogActivity: onStart:
LogActivity: onResume:
LogActivity: onPause:
LogActivity: onStop:
// the exact alarm didn't trigger.Foreground service LogActivity: onCreate:
LogActivity: onStart:
LogActivity: onResume:
// foreground service started
MyService: onCreate:
MyService: onStartCommand:
LogActivity: onPause:
LogActivity: onStop:
// LogActivity가 백그라운드로 변경된 뒤
// MyService는 바로 종료되지 않음LogActivity: onCreate:
LogActivity: onStart:
LogActivity: onResume:
MyService: onCreate:
MyService: onStartCommand:
LogActivity: onPause:
MyService: onTrimMemory:
LogActivity: onStop:
// LogActivity가 백그라운드로 변경된 뒤
// onTrimMemory() 메모리 부족으로
// Service kill 할수도 있다는 경고 메시지
MyService: onTrimMemory:
// 1분 뒤 바로 시스템이 종료시킴
ActivityManager: Stopping service due to app idle: u0a174 -1m3s635ms com.example.examplefgs/.MyPlayerService
MyService: onDestroy:WorkManager
Network
FCM아직 테스트해보지 않음 Test limitation battery usage
The power management features released in Android 9 (API level 28) affect all apps running on this version, whether the apps target this version or not. It's important to make sure your app behaves properly on these devices.
Test "restrict state"
// restrict background work adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND deny // allow background work adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND allow
Test "restrict app bucket"
adb shell am set-standby-bucket PACKAGE_NAME restricted // check app bucket adb shell am get-standby-bucket PACKAGE_NAME
https://developer.android.com/topic/performance/power/power-details
https://developer.android.com/topic/performance/appstandby#restricted-bucket
https://developer.android.com/about/versions/pie/power
https://developer.android.com/topic/performance/background-optimization#bg-restrict
https://developer.android.com/about/versions/13/changes/battery
https://developer.android.com/about/versions/13/changes/battery#restricted-background-battery-usage
반응형'프로그래밍 > Android' 카테고리의 다른 글
Android 14 - Foreground Service types (0) 2023.05.30 Jetpack compose - Custom layout (0) 2022.12.12 Android 13 - Programmable shaders (0) 2022.06.03 Android 13 - Granular media permissions (0) 2022.05.23 Android 13 - FGS Task Manager (0) 2022.05.11 - When?