구성요소가 원하는 상태(예: 켜짐, 활성, 스캔 중)일 때 기기에서 사용하는 전류와 구성요소가 꺼졌을 때 사용되는 전류를 비교하여 구성요소별 전력 소모를 파악할 수 있습니다. 벤치 전력원 또는 특수 배터리 모니터링 도구(예: Monsoon Solution Inc. Power Monitor 및 Power Tool 소프트웨어와 같은 외부 전력 모니터를 사용하여 공칭 전압 시에 기기에서 사용하는 평균 순간 전류를 측정하세요.
제조업체가 개별 구성요소에 의해 소비되는 전류에 관한 정보를 제공하는 경우가 많습니다. 실제로 기기 배터리에서 사용하는 전류를 정확히 나타내는 경우에는 이 정보를 사용하세요. 하지만 기기 전력 프로필에 사용하기 전에 제조업체에서 제공한 값을 검증해야 합니다.
전력 소모 제어
측정 시에는 기기에 외부 충전원에 대한 연결 기능이 없는지 확인해야 합니다(예: Android 디버그 브리지(adb)를 실행할 때 사용되는 개발 호스트에 대한 USB 연결). 테스트 중인 기기는 호스트에서 전류를 가져올 수 있으므로 배터리의 측정값이 감소합니다. OTG(On-The-Go) 기기는 테스트 중인 기기에서 전류를 끌어올 수 있으므로 USB OTG는 피하는 것이 좋습니다.
측정 중인 구성요소를 제외하면 시스템은 다른 구성요소의 변화로 인한 부정확한 측정을 피할 수 있도록 일관적인 배터리 소모 수준에서 실행되어야 합니다. 전력 측정에 원치 않는 변화를 가져올 수 있는 활동은 다음과 같습니다.
- 모바일, Wi-Fi 및 블루투스 수신, 송신 또는 스캔 활동. 무선 라디오 전력을 측정하는 경우가 아니라면 기기를 비행기 모드로 설정하고 적절히 Wi-Fi 또는 블루투스를 사용 설정합니다.
- 화면 켜기/끄기. 화면이 켜진 상태에서 표시되는 색상은 일부 화면 기술의 전력 사용에 영향을 미칠 수 있습니다. 화면 외 구성요소의 값을 측정할 때는 화면을 끄세요.
- 시스템 정지/재개. 화면 꺼짐 상태는 시스템 정지를 야기하여 기기의 일부를 저전력 또는 꺼짐 상태로 전환시킬 수 있습니다. 이는 측정 중인 구성요소의 전력 소비에 영향을 미치고 시스템이 주기적으로 알람 전송을 재개하는 등의 과정에서 전력 판독값의 상당한 편차를 가져올 수 있습니다. 자세한 내용은 시스템 정지 제어를 참고하세요.
- CPU 변경 속도 및 입력/기존 저전력 스케줄러 유휴 상태.
일반 작업 도중 시스템은 CPU 속도, 온라인 CPU 코어 수 및 기타 시스템 코어 상태를 자주 조정합니다(예: 메모리 버스 속도, CPU 및 메모리와 관련된 파워 레일의 전압). 테스트 도중에는 이러한 조정이 전력 측정에 영향을 미칩니다.
- CPU 속도 조정 작업으로 클록 및 메모리 버스의 전압 스케일링 양과 기타 시스템 코어 구성요소 수를 줄일 수 있습니다.
- 스케줄링 활동은 CPU가 저전력 유휴 상태에서 소비하는 시간의 비율에 영향을 미칠 수 있습니다. 테스트 도중 이러한 조정이 이루어지지 않도록 방지하는 자세한 방법은 CPU 속도 제어를 참고하세요.
예를 들어 누군가 기기의 screen.on
값을 계산하고 싶어한다고 가정해 보겠습니다. 이를 위해 기기에 비행기 모드를 사용 설정하고, 안정적인 전류 상태에서 기기를 실행하고, CPU 속도를 일관성 있게 유지하고 부분 wake lock을 사용하여 시스템 정지를 방지합니다. 그런 다음에는 기기 화면을 끄고 측정(200mA)을 수행합니다. 이어서 기기 화면을 최소 밝기로 설정하고 또 다른 측정(300mA)을 수행합니다. screen.on
값은 100mA(300 - 200)입니다.
참고: 활성 상태에서 전류 소모의 평평한 파형을 취하지 않는 구성요소의 경우(예: 무선 라디오 또는 Wi-Fi) 전력 모니터링 도구를 사용하여 시간 경과에 따른 평균 전류를 측정하세요.
기기 배터리 대신 외부 전력원을 사용 중인 경우 시스템은 연결되지 않은 배터리 서미스터 또는 통합된 연료계 핀으로 인한 문제를 경험할 수 있습니다. 즉, 배터리 온도 또는 배터리 잔량의 잘못된 판독값으로 인해 커널 또는 Android 시스템이 종료될 수 있습니다. 페이크 배터리는 정상적인 시스템의 온도 및 충전 상태 판독값을 모방하는 서미스터 또는 연료계의 신호를 제공할 수 있으며, 외부 전력원 연결을 위한 편리한 리드를 제공할 수도 있습니다. 또한 시스템을 수정하여 누락된 배터리의 잘못된 값을 무시할 수도 있습니다.
시스템 정지 제어
이 섹션에서는 시스템 정지 상태를 방지하고(다른 측정이 시스템 정지에 의해 방해받지 않기를 원하는 경우) 시스템 정지 상태의 전력 사용량을 측정하는 법(측정을 원하는 경우)에 관해 설명합니다.
시스템 정지 방지
시스템 정지 시 원치 않는 전력 측정 편차가 발생하고 활성 전력 사용 측정에 부적절한 저전력 상태로 시스템 구성요소가 전환될 수 있습니다. 화면이 꺼진 상태에서 시스템이 정지되지 않도록 하려면 일시적인 부분 wakelock을 사용합니다. USB 케이블을 사용하여 기기를 개발 호스트에 연결한 후 다음 명령어를 실행합니다.
adb shell "echo temporary > /sys/power/wake_lock"
wake_lock
상태에서는 화면 꺼짐 상태가 시스템 정지를 트리거하지 않습니다.
전력 소모를 측정하기 전에 기기에서 USB 케이블을 분리하세요.
wakelock 제거 방법:
adb shell "echo temporary > /sys/power/wake_unlock"
시스템 정지 측정
시스템 정지 상태에서 사용되는 전력을 측정하려면 전력 프로필의 cpu.idle
값을 측정해야 합니다. 측정 전에 다음을 수행합니다.
- 위의 설명처럼 기존 wakelock을 제거합니다.
- 기기를 비행기 모드로 전환하여 무선 라디오에 의한 동시 활동을 방지합니다. 이는 시스템 정지에 의해 제어되는 SoC 부분과 별도의 프로세서에서 실행될 수 있습니다.
- 다음을 수행하여 시스템이 정지 상태인지 확인합니다.
- 전류 판독값이 안정적인 값으로 고정되는지 확인합니다. 판독값은 SoC 정지 상태의 전력 소모량과 계속해서 전력이 공급되는 시스템 구성요소(예: USB PHY)의 전력 소모를 더한 값의 예상 범위 내에 위치해야 합니다.
- 시스템 콘솔 출력을 확인합니다.
- 시스템 상태의 외부 지표를 관찰합니다(정지 상태가 아닌 경우의 LED 꺼짐 등).
CPU 속도 제어
활성 CPU는 온라인 또는 오프라인으로 전환할 수 있고, 클록 속도와 관련 전압을 변경할 수 있으며(또한 메모리 버스 속도와 기타 시스템 코어 전력 상태에도 영향을 미칠 수 있음), 커널 유휴 루프에서는 저전력 유휴 상태에 돌입할 수 있습니다. 전력 프로필의 여러 CPU 전력 상태를 측정할 때는 다른 매개변수 측정 시의 전력 사용 편차를 방지해야 합니다. 전력 프로필은 모든 CPU의 가용한 속도와 전력 특성이 같다고 가정합니다.
CPU 전력을 측정하거나 CPU 전력을 일관적으로 유지하여 다른 측정을 수행하는 동안에는 온라인 상태로 전환된 CPU 수를 일정하게 유지해야 합니다(예: 한 개의 CPU를 온라인으로 전환하고 나머지는 오프라인/핫플러그드 아웃 상태로 전환). 유휴 예약 시 하나를 제외한 모든 CPU를 유지할 경우 괜찮은 결과가 생성될 수 있습니다. adb shell stop
으로 Android 프레임워크를 중단하면 시스템 예약 활동이 감소할 수 있습니다.
전력 프로필 cpu.speeds
항목에서 기기의 가용한 CPU 속도를 지정해야 합니다. 가용한 CPU 속도 목록을 가져오려면 다음을 실행합니다.
adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
이러한 속도는 값 cpu.active
의 상응하는 전력 측정값과 일치합니다.
온라인으로 전환된 여러 개의 코어가 전력 소모에 영향을 미치는 플랫폼의 경우 플랫폼의 cpufreq 드라이버 또는 거버너를 수정해야 할 수도 있습니다. 대부분의 플랫폼은 사용자 공간 cpufreq 거버너를 사용하여 CPU 속도 제어를 지원하고 sysfs 인터페이스를 사용하여 속도를 설정합니다. 예를 들어 CPU가 1개뿐이거나 모든 CPU가 공통 cpufreq 정책을 공유하는 시스템에 200MHz의 속도를 설정하려면 시스템 콘솔 또는 adb 셸을 사용하여 다음 명령어를 실행하세요.
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
참고: 정확한 명령어는 플랫폼 cpufreq 구현에 따라 다릅니다.
이러한 명령어는 허용되는 선을 벗어나지 않는 새로운 속도를 설정한 다음 CPU가 실제로 실행되는 속도를 출력하여 검증을 실행합니다. 실행 이전의 전류 최소 속도가 200,000보다 높은 경우 최초 2행의 순서를 반대로 바꾸거나 최초 행을 다시 실행하여 최대 속도 설정 전에 최소 속도를 떨어뜨려야 할 수도 있습니다.
다양한 속도에서 실행 중인 CPU에서 소모하는 전류를 측정하려면 시스템 콘솔을 사용하여 CPU를 CPU 귀속 루프에 배치하고 이때 다음 명령어를 사용하세요.
# while true; do true; done
루프 실행 도중에 측정을 실행하세요.
일부 기기는 고온 측정으로 인한 온도 제한 수행 도중(계속해서 높은 속도로 CPU를 실행한 후) 최대 CPU 속도를 제한할 수 있습니다. 측정 시 시스템 콘솔 출력을 사용하거나 측정 후에 커널 로그를 확인하여 이러한 제한에 주의하세요.
cpu.awake
값의 경우 시스템이 정지되지 않은 상태에서 작업을 실행하지 않을 때 소모되는 전력을 측정하세요. CPU는 저전력 스케줄러 유휴 루프 상태여야 하며, 이벤트 지침의 ARM 대기를 실행 중이거나 유휴 사용에 적합한 빠른 종료 지연 시간이 적용된 SoC 관련 저전력 상태일 수 있습니다.
cpu.active
값의 경우 시스템이 정지되지 않은 상태에서 작업을 실행하지 않을 때의 전력을 측정하세요. 1개의 CPU(보통 기본 CPU)가 작업을 실행해야 하며 다른 모든 CPU는 유휴 상태여야 합니다.
화면 전력 측정
화면 전력을 측정할 때는 화면이 켜졌을 때 일반적으로 켜지는 다른 기기도 켜지도록 해야 합니다. 예를 들어 화면이 켜진 상태에서 터치스크린과 디스플레이 백라이트도 켜지는 경우가 일반적이라면, 화면 전력 사용에 관한 실질적인 예시를 얻기 위한 측정을 수행할 때 이러한 기기가 켜져 있도록 해야 합니다.
일부 디스플레이 기술은 표시된 색상에 따라 전력 소모가 다르며, 이는 측정 시점에 화면에 표시된 콘텐츠에 따라 전력 측정에 상당한 차이가 발생하는 원인이 됩니다. 측정 시에는 화면에 실질적인 화면의 전력 특성을 지닌 뭔가가 표시되고 있는지 확인해야 합니다. 전체가 검은 화면(일부 기술의 경우 가장 낮은 전력 소모)과 전체가 흰색인 화면 간의 극값 사이를 조준하세요. 일반적인 방법은 흰색 백그라운드와 흰색 외 요소가 혼합된 캘린더 앱의 일정을 보는 것입니다.
최소 및 최대 디스플레이/백라이트 밝기로 화면 전력을 측정하세요. 최소 밝기를 설정하는 방법은 다음과 같습니다.
- Android UI 사용(비권장). 설정 > 디스플레이 밝기 슬라이더를 최소 디스플레이 밝기로 설정합니다. 하지만 Android UI에서는 밝기를 가능한 패널/백라이트 밝기의 최소 10~20%로만 설정할 수 있도록 허용하며, 화면을 쉽게 볼 수 없을 정도로 낮은 밝기로는 설정할 수 없습니다.
- sysfs 파일 사용(권장). 가능한 경우 sysfs 파일을 사용하여 패널 밝기를 하드웨어에서 지원하는 최소 밝기까지 내립니다.
또한 플랫폼 sysfs 파일에서 LCD 패널, 백라이트 및 터치스크린을 켜고 끌 수 있도록 지원하는 경우에는 파일을 사용하여 화면이 켜지고 꺼진 상태에서 측정할 수도 있습니다. 아니면 시스템이 정지되지 않도록 부분 wake lock을 설정한 다음 전원 버튼으로 화면을 켜고 끕니다.
Wi-Fi 전력 측정
Wi-Fi 측정은 비교적 한적한 네트워크에서 이루어져야 합니다. 측정 중인 활동과 상관없는 대용량 브로드캐스트 트래픽을 처리하는 추가 작업이 유입되지 않도록 하세요.
wifi.on
값은 Wi-Fi가 사용 설정되었지만 송수신이 적극적으로 이루어지지 않고 있는 경우에 소모된 전력을 측정합니다. 주로 Wi-Fi 사용 설정 및 사용 중지 시, 시스템 정지(절전 모드) 상태에서 사용된 전류 간의 델타로 측정됩니다.
wifi.scan
값은 액세스 포인트의 Wi-Fi 검색 도중에 소모된 전력을 측정합니다. 애플리케이션은 WifiManager 클래스 startScan()
API를 사용하여 Wi-Fi 검색을 트리거할 수 있습니다. 또한 명백하고 급작스러운 전력 소모로 몇 초마다 액세스 포인트 검색을 실행하는 설정 > Wi-Fi를 열 수도 있지만 이러한 측정값에서 화면 전력을 차감해야 합니다.
참고: 제어된 설정(예: iperf)을 사용하여 네트워크 송수신 트래픽을 생성하세요.