Skip to content

Instantly share code, notes, and snippets.

@chitacan
Last active September 19, 2017 08:19
Show Gist options
  • Save chitacan/1c1ea98c65d65b7408ea to your computer and use it in GitHub Desktop.
Save chitacan/1c1ea98c65d65b7408ea to your computer and use it in GitHub Desktop.
How Android Inspect Battery

How Android Inspect Battery

최종 업데이트 : 2014-07-14 15:44:18

기본 정보 확인하기

Intent.ACTION_BATTERY_CHANGEDBroadcast receiver에 등록해 변경사항이 있을때마다, 정보를 수신할 수 있음

아니면, dumpsys 를 통해 바로 확인할 수 있음

$ adb shell dumpsys battery

BatteryStatService

안드로이드 시스템 서비스중 하나로 system_process 프로세스의 스레드로 실행. 현재 시스템의 배터리와 관련된 모든 작업들을 정리하여 기록. 시스템 설정 >> 배터리 에 표시되는 데이터가 바로 이 BatteryStatService 가 기록한 데이터.

이것과 관련해서는 시스템 설정의 코드 BatteryHistoryPreference.javaBatteryStatsHelper.java 를 참고

BatteryStatServicedumpsys 와 연결되어 있어 아래의 명령어로 서비스의 상태를 출력할 수 있음

$ 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 사용시간
  • 유저 사용시간

power_profile.xml

앱별 사용량을 계산할 때에는, 각 하드웨어(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) {
}

project volta

Introduction to Project Volta

시스템 변경사항

jobscheduler 시스템 서비스가 추가됨. jobscheduler 는 정확한 시간을 설정하는 Alarm 과는 달리 조건을 명시하고 그 조건에 맞는 job 을 한번에 실행해 단말이 불필요하게 깨어있는 상황을 줄이는데 도움을 줌

$ adb shell service list
Found 87 services:
...
20      jobscheduler: [android.app.job.IJobScheduler]
...

jobschedulerjob 을 등록할 수 있는 API JobInfoJobService 가 추가

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);

battery historian

https://github.com/google/battery-historian

$ adb shell dumpsys batterystats --checkin > dump
$ historian.py dump

아직 L-preview 버전의 dump 포맷만 지원하는 듯

samples

https://github.com/googlesamples/android-JobScheduler

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment