키워드: Wear OS, 전원, 배터리, 성능
전원 효율은 Wear OS에서 특히 중요합니다. Wear OS 설계 원칙은 시계가 짧은 상호작용을 위한 소형 폼 팩터이므로 기기 전원 사용량에 크게 중점을 둡니다.
Wear OS 기기는 대형 휴대기기에 비해 배터리가 작기 때문에 배터리 소모가 더 눈에 띕니다. 또한 휴대기기에 비해 Wear OS 기기를 충전하는 데 더 많은 노력이 필요합니다. 사용자는 하루 중 다양한 간격으로 휴대기기를 충전할 수 있지만 기기를 충전하기 전에 Wear OS 기기를 신체에서 분리해야 합니다.
앱의 전원 효율성을 개선하려면 다음 디자인 권장사항을 따르세요.
- 앱 디자인은 Wear OS 폼 팩터를 잘 활용해야 합니다. 모바일 앱을 직접 복사해서는 안 됩니다.
- 기존 모바일 앱을 사용하여 특정 사용 사례를 지원합니다. 예를 들어 시계의 인터넷 및 동기화는 비용이 많이 듭니다. 휴대기기에서 무거운 작업을 처리하고 Wear OS 기기에서 데이터 변경사항을 수신할 수 있는지 고려하세요.
- 상호작용이 짧은 사용 사례를 설계합니다.
- 사용하는 Wear OS 이벤트와 이러한 이벤트가 발생하는 빈도를 고려하세요.
가능하면 시계가 충전될 때까지 앱의 작업을 연기합니다. 이는 특히 데이터 동기화, 데이터베이스 정리와 같은 데이터 집약적인 작업에 적용됩니다.
기기가 충전 중이고 Wi-Fi에 연결되어 있으면 사용자가 앱에서 보려는 데이터, 이미지, 업데이트를 미리 가져오도록 작업을 예약합니다.
이 전원 가이드를 통해 시스템에서 앱을 실행하는 시점과 방법, 앱의 런타임과 배터리 소모를 제한하는 방법을 알아보세요. 앱을 로드하거나 목록을 스크롤하는 등 특정 작업이 실행되는 방식을 자세히 알아보려면 Wear OS의 Compose 성능 가이드와 같은 성능 관련 안내를 참고하세요.
시간 경과에 따른 배터리 사용량 모니터링
앱을 실행하는 Wear OS 기기의 배터리 통계를 분석하려면 개발 머신의 터미널 창에 다음 명령어를 입력합니다.
adb shell dumpsys batterystats
GitHub의 라이브러리에는 이 명령어와 함께 실행하는 데 유용한 배터리 통계 파서가 있습니다.
배터리 수명에 영향을 미치는 이벤트
앱을 구체적으로 생각하기 전에 Wear OS 기기에서 전력을 소비하는 이벤트를 더 일반적으로 생각해 보는 것이 좋습니다.
다음 표는 Wear OS 앱의 여러 일반적인 이벤트가 배터리 수명에 미치는 상대적 영향을 보여줍니다. 정확한 전원 소모량은 기기마다 다릅니다.
이벤트 | 배터리 수명에 미치는 영향 | 완화 방법 |
---|---|---|
LTE 및 Wi-Fi를 포함한 네트워크에 액세스 | 매우 높음 | 기기가 충전될 때까지 필수적이지 않은 네트워크 액세스를 연기합니다. |
화면을 켜고 대화형 모드를 시작합니다. | 높음 | 사용자가 필요 이상으로 화면을 켜두도록 유도하지 마세요. 대기 모드라고도 하는 상시 사용 설정 모드를 사용하는 환경을 제공합니다. |
GPS 센서에 액세스 | 높음 | 가능하면 사용자가 GPS 액세스를 요청할 때까지 기다립니다. |
CPU 사용량을 높게 유지 | 높음 | Jetpack Compose를 사용하여 흐름 소비 |
심박수 센서에 액세스 | 보통 | Wear OS의 건강 관리 서비스를 사용할 때와 같이 센서 API에서 콜백을 수신할 때 프로세서의 절전 모드 해제 시간을 사용합니다. |
블루투스를 통해 다른 기기에 액세스 | 보통 | 세션을 짧게 유지합니다. |
wake lock 유지 | 보통 | wakelock의 수동 생성을 줄이고
WorkManager 를 사용하세요. |
화면 켜짐 시간 최소화
Wear OS 앱에서는 다음과 같은 화면 사용 원칙을 따르세요.
- 화면 켜짐 잠금: 가능하면 사용하지 마세요. 테스트하려면 시스템 설정에서 항상 켜져 있는 화면을 사용 중지하고 제한 시간 내에 화면이 꺼지는지 확인합니다.
- 애니메이션: 정교한 애니메이션은 최소화하고 대신 간단한 전환에 집중하여 더 전문적인 느낌을 연출하세요. 특히 장기 실행 애니메이션과 루프는 피하세요. 루프가 필요한 경우 루프 사이에 애니메이션 자체만큼 긴 일시중지를 추가합니다.
대기 모드의 깨어 있는 시간: 피트니스 사용 사례와 같이 필요한 경우 상시 사용 설정을 지원합니다. 앱에 상시 사용 설정이 필요한 경우 기기가 대기 모드일 때 앱이 다음을 실행하는지 확인합니다.
- 기기 화면에서 밝게 빛나는 비율을 줄입니다.
- 애니메이션을 표시하지 않습니다.
onAmbientUpdate()
콜백 중에 한해 화면의 콘텐츠를 업데이트하지 않습니다.
CPU 사용량 최소화
Wear OS 앱에서는 다음 CPU 사용 원칙을 따르세요.
- 사용은 짧게 유지합니다.
- 관련 작업을 일괄 처리하여 앱 프로세스가 유휴 상태인 시간을 최대화합니다.
Wakelock 최소화
대부분의 경우 wakelock과 같이 앱이 절전 모드로 전환되지 않도록 하는 작업은 피하는 것이 좋습니다. 예를 들어 건강/피트니스 앱에서 장시간 운동하는 경우에는 웨이크락이 필요하지 않습니다. Wear OS의 Health Services를 사용할 때와 같이 센서 API에서 콜백을 수신할 때 프로세서의 절전 모드 해제 시간을 사용합니다.
앱이 다음 중 하나를 실행하는 경우와 같이 wakelock을 획득해도 되는 경우도 있습니다.
- 백그라운드에서 미디어를 재생합니다.
WorkManager
또는JobScheduler
를 사용합니다. (시스템은 백그라운드에서 작업을 실행할 때 대신 wakelock을 보유합니다.)
Battery Historian을 사용하면 긴 wakelock의 개별 발생 횟수와 보류 중인 wakelock의 총 개수 및 기간에 관한 요약을 확인할 수 있습니다. 앱이 보유한 wakelock의 수와 기간을 검사하고 이 정보를 앱의 양방향 사용 패턴과 비교합니다.
- 예상치 못한 wakelock이 있는지 확인합니다.
- 예상보다 시간이 오래 걸리는 경우 네트워크 가용성과 같은 일부 종속 항목에서 작업이 차단되었는지 고려해 보세요.
앱이 비활성화되는 방식 검사
다음과 같은 주요 기기 이벤트가 발생할 때 활성 앱이 실행 중인 작업을 고려하세요.
- 화면이 꺼지고 기기가 대기 모드로 전환됩니다.
앱이 스와이프하여 닫힘
앱 활동을 분석하려면 다음 섹션에 표시된 도구를 사용하세요.
전원 프로파일러
Android 스튜디오 메뉴에서 View > Tool Windows > Profiler를 선택하여 Power Profiler에 액세스할 수 있습니다.
- 화면이 꺼지고 기기가 대기 모드로 전환될 때 시스템 트레이스를 검사합니다.
- 계속되는 작업과 기기의 CPU 사용량 수준을 확인합니다.
Perfetto
Perfetto를 사용하면 트레이스를 기록한 다음 앱을 검사하여 화면이 꺼지거나 기기가 대기 모드로 전환되거나 사용자가 앱의 활동을 닫을 때 작업을 실행하는 스레드가 있는지 확인할 수 있습니다.
맞춤 이벤트를 정의하여 도메인별 이벤트를 비롯한 앱의 중요한 이벤트를 표시합니다. 미디어 앱의 경우 재생목록 가져오기, 특정 미디어 항목 다운로드, 재생 시작, 재생 중지와 같은 작업이 여기에 포함됩니다. 이러한 이벤트를 정의하면 Perfetto에서 이벤트를 확인하고 앱의 CPU 및 전원 사용량과 타이밍을 비교할 수 있습니다.
앱의 예약된 작업 분석
WorkManager를 사용하는 예약된 작업을 사용하면 앱에서 백그라운드 작업을 실행할 수 있습니다. 일부 백그라운드 작업은 주기적으로 실행되어야 하지만 작업을 너무 자주 실행하거나 장시간 실행하면 기기의 배터리가 소모될 수 있으므로 주의하세요.
Battery Historian을 사용하여 전체 (시스템 통계 > Jobscheduler 통계) 및 앱별 (앱 통계 > 예약된 작업)로 예약된 작업의 실행을 검사합니다. 총 개수와 총 시간을 확인합니다.
- 작업이 매우 자주 실행되는 경우 이 빈도를 줄이는 것이 좋습니다.
- 총 실행 시간이 예상과 일치하고 훨씬 길지 않은지 확인합니다.
또한 Battery Historian 그래프를 검사하여 각 JobScheduler 항목을 확인합니다. 특정 항목 위로 포인터를 가져가면 Battery Historian에 실행 중인 작업의 소유자가 표시됩니다. 다음을 고려하세요.
- 앱의 경우 실행 시간이 적절해야 합니다.
- 작업이 앱이 실행되는 동안 발생하는지 또는 작업이 주기적인 백그라운드 작업을 나타내는지 고려하세요.
센서
Wear OS 기기에는 GPS와 같은 다양한 센서가 있습니다. 대부분의 경우 SensorManager
와 직접 상호작용하는 대신 Wear OS의 건강 관리 서비스를 사용하세요. 대부분의 경우 건강 관리 서비스는 배터리 성능을 개선하기 위해 데이터를 지능적으로 일괄 처리합니다.
앱의 센서 사용량을 분석하려면 개발 머신의 터미널 창에서 다음 명령어를 실행합니다.
adb shell dumpsys sensorservice
이 명령어의 결과는 다음과 같습니다.
- 현재 및 이전 센서 등록
- 설정된 경우 일괄 처리를 포함한 센서 구성
- 최근에 샘플링된 데이터입니다.
센서에서 등록 취소 테스트
앱이 예상대로 센서 데이터 가져오기를 중지하는지 확인하려면 다음 시나리오를 테스트하세요.
- 앱을 스와이프하여 닫습니다.
- 손바닥으로 화면을 탭합니다. 이렇게 하면 화면이 꺼지거나 화면이 대기 모드로 전환됩니다.
이전 섹션의 ADB 명령어를 사용하여 센서가 등록되지 않은 것으로 올바르게 표시되는지 확인합니다.
데이터 영역
Data Layer API를 사용하면 각 전송 시 약간의 전력이 사용됩니다. 특히 이 API를 사용하여 데이터를 전송하는 경우 앱이 데이터를 수신하기 위해 깨어나야 합니다. 따라서 이 API는 신중하게 사용하세요.
Data Layer API 사용에 관한 몇 가지 추가 권장사항은 다음과 같습니다.
WearableListenerService
를 사용하여 리스너를 설정하기 전에 앱이 활성화될 때까지 기다립니다.빠른 업데이트를 구성하는 대신 상태 변경을 전송합니다. 이러한 상태 변경을 통해 Wear OS 기기는 운동 세션이 시작된 경우와 같이 로컬 데이터 계산을 실행할 수 있습니다.
UI를 업데이트하는 상태 변경사항만 전송합니다. 예를 들어 활동 화면에 '달린 거리(km)'가 소수점 이하 자릿수 1자리까지만 표시되는 경우 사용자가 1m씩 전진할 때마다 Wear OS에 상태 변경을 전송하지 마세요.
앱에서 Data Layer API 사용량을 분석하려면 개발 머신의 터미널 창에서 다음 명령어를 실행합니다.
adb shell dumpsys activity service WearableService
이 명령어의 결과에는 다음이 포함됩니다.
- RpcService:
MessageClient
를 사용하여 호출되는 빈도와 경로를 확인할 수 있습니다. - DataService:
DataClient
를 사용하여 데이터 항목이 설정되는 빈도를 확인할 수 있습니다.
건강/피트니스 앱
건강/피트니스 앱을 유지 관리하는 경우 건강 관리 서비스를 사용하여 앱의 센서 사용을 최적화하세요.
ExerciseClient
의 경우 Battery Historian을 사용하여 화면 보호 모드에서 올바른 동작을 확인합니다. 앱이ExerciseUpdate
데이터를 수신하기 위해 1~2분마다 깨어나지 않는지 확인합니다.- 종일 일반 건강 모니터링의 경우 백그라운드에서 건강 및 피트니스 데이터를 모니터링하는 방법에 관한 가이드에 설명된 대로
PassiveMonitoringClient
를 사용하세요.
카드 및 정보 표시
앱에서 카드 또는 정보 표시를 지원하는 경우 다음 권장사항을 따르세요.
- 자동 새로고침을 사용 중지하거나 새로고침 빈도를 2시간 이상으로 늘립니다.
- Firebase 클라우드 메시징 (FCM) 또는 적절하게 예약된 작업을 사용하여 데이터 업데이트를 전송합니다. 업데이트 속도가 너무 빠르면 시스템이 사용자 또는 플랫폼이 작업을 실행하는 데 필요한 데이터에 액세스하는 속도보다 더 빠른 속도로 반복 작업을 예약할 수 있으므로 주의해야 합니다.
- 사용자가 카드 또는 정보 표시와 상호작용하지 않을 때는 작업을 예약하지 마세요.
- 오프라인 우선 접근 방식을 사용합니다.
- 기본 앱, 카드, 정보 표시 기능에서 단일 데이터베이스를 공유합니다. 이렇게 하면 UI 노출 영역 전반에서 데이터가 일관되게 유지됩니다.
추천 서비스
- 참고: JavaScript가 사용 중지되어 있으면 링크 텍스트가 표시됩니다.
- 백그라운드에서 위치 정보 액세스
- 알람 예약하기
- 고급 위젯 만들기 {:#advanced-widget}