최종 업데이트 : 2014-07-14 15:44:18
Intent.ACTION_BATTERY_CHANGED
를 Broadcast receiver
에 등록해 변경사항이 있을때마다, 정보를 수신할 수 있음
아니면, dumpsys
를 통해 바로 확인할 수 있음
$ adb shell dumpsys battery
안드로이드 시스템 서비스중 하나로 system_process
프로세스의 스레드로 실행. 현재 시스템의 배터리와 관련된 모든 작업들을 정리하여 기록. 시스템 설정 >> 배터리
에 표시되는 데이터가 바로 이 BatteryStatService
가 기록한 데이터.
이것과 관련해서는 시스템 설정의 코드 BatteryHistoryPreference.java 와 BatteryStatsHelper.java 를 참고
BatteryStatService
도 dumpsys
와 연결되어 있어 아래의 명령어로 서비스의 상태를 출력할 수 있음
$ adb shell dumpsys batterystats
이 명령어가
BatteryStatService
의 어떤 값을 출력하는지는 BatteryStatsService.dump() 부터 살펴보면 됨
패키지별로 배터리 상태를 확인하기 위해서는 아래의 명령어들을 사용할 수 있다.
$ adb shell dumpsys batterystats <package_name>
$ adb shell pm dump <package_name>
BatteryStatService
가 배터리와 관련된 정보들을 기록하는데 사용하는 타입. 이 클래스와 이 클래스를 사용하는 놈들을 살펴보면 안드로이드가 배터리 사용량을 측정하기 위해 어떤 값들을 수집하는지 살펴볼 수 있음.
여기에 앱별로 배터리 사용량이 계산되어 있지는 않고, 배터리와 관련이 있는 시스템 작업들(wifi on / off, screen on / off 등등) 이 언제 어떻게 이루어 졌는지 기록되어 있고, 이 값을 시스템 설정
앱에서 가져가 가공한 다음 화면에 표시함.
즉, 구글이 생각한 배터리 계산법을 살펴보려면, 시스템 설정
앱이 BatteryStatService
에서 가져온 데이터를 어떻게 가공하는지 살펴보면 됨 (BatteryStatsHelper.java)
시스템 설정
앱은 다음의 값들을 바탕으로 앱별 배터리 사용량을 계산
- CPU
- kernel user time
- kernel system time
- foreground time (프로세스가 foreground로 실행된 시간)
- step 별 cpu 사용량 (power_profile.xml 참고)
- cpu wakelock
- network
- 전화 사용시간
- mobile data 사용량, 사용시간
- wifi 사용량, 사용시간
- bluetooth 사용시간
- 화면 밝기별 사용시간
- 유휴상태 시간
- 센서 사용시간
- GPS 사용시간
- DSP 사용시간
- 유저 사용시간
앱별 사용량을 계산할 때에는, 각 하드웨어(CPU, wifi, bluetooth 등등) 상태별로 시간당 필요한 파워에 대한 데이터가 필요한데, 이 데이터는 power_profile.xml 에 기술되어 있음. AOSP 를 지원하는 단말의 경우 https://android.googlesource.com/ 에서 확인할 수 있다. 예를 들어 Nexus 5(aka hammerhead
) 단말의 경우 여기 에서 확인할 수 있음. 시중의 일반 단말의 경우 이 사용량을 알기가 어려운데, 리플렉션과 PowerProfile.java 를 활용해 아래와 같이 읽어 볼 수 있음
try {
Class internalR = Class.forName("com.android.internal.R$xml");
int id = internalR.getField("power_profile").getInt(null);
XmlResourceParser parser = context.getResources().getXml(id);
// run parser
// ...
} catch (Exception e) {
}
jobscheduler
시스템 서비스가 추가됨. jobscheduler
는 정확한 시간을 설정하는 Alarm
과는 달리 조건을 명시하고 그 조건에 맞는 job
을 한번에 실행해 단말이 불필요하게 깨어있는 상황을 줄이는데 도움을 줌
$ adb shell service list
Found 87 services:
...
20 jobscheduler: [android.app.job.IJobScheduler]
...
jobscheduler
에 job
을 등록할 수 있는 API JobInfo
와 JobService
가 추가
JobService mJobService;
//...
JobInfo job = new JobInfo.Builder(mSomeJobId, mJobServiceComponent)
.setRequiredNetworksCapabilities(JobInfo.NetworkType.Any)
.setPeriodic(15 * DateUtils.HOURS_IN_MILLIS)
.setRequiresCharging(true)
.build();
mJobService.scheduleJob(job);
https://github.com/google/battery-historian
$ adb shell dumpsys batterystats --checkin > dump
$ historian.py dump
아직 L-preview
버전의 dump 포맷만 지원하는 듯