본 포스팅은 DroidKaigi 2016 Androidの省電力を考える 을 기본으로 번역하여 작성했습니다
제 일본어 실력으로 인하여 오역이나 오타가 발생할 수 있습니다.
실제 슬라이드의 일본어
부분을 번역했다는 점 양해바랍니다.
DroidKaigi 2016 Android 저전력에 대한 생각
Brightechno 주식회사
대표 Nakanishi Yoshiaki
자기소개(상세버전)
자기소개(간략버전)
최근 활동
본 세션에서 다룰 내용
본 세션에서 얻으셨으면 하는 것
전력 사용량 감소 역사
전력 사용량 감소 역사
↓
Android 6.0에서 대개혁
배터리가 부족한 Android
통신 작업 경험에서의 대책
단말 제조상의 대규모 정리
비슷한 기능, 최근 어디선가 본듯한 기분이 든다
어플 작성 가이드라인 · 도구
Google의 대처
Google의 대처 (계속)
회장에의 질문
예상 응답
어째서 대응하지않는가(할 수 없는가)
Android 6.0 저전력 대책
Google이 지혜로운 결단(?)
↓
Doze
http://developer.android.com/intl/ko/training/monitoring-device-state/doze-standby.html
Doze 중에서의 제한
Doze 중에서의 Alarm 발화
Doze 중에서의 Alarm 발화(계속)
Doze 중에서의 GCM
{
"to" : "...",
"priority" : "hight",
"notifiation" : {
...
},
"data" : {
...
}
}
https://developers.google.com/cloud-messaging/concept-options
Doze 중에서의 GCM(계속)
Doze 회피 방법의 영향 정리
대상 어플 | 이외의 어플 | |
---|---|---|
AlarmManager setAndAllowWhileIdle() | Doze 일시적 해제 | Doze 유지 |
setExactAndAllowWhileIdle() | Doze 일시적 해제 | Doze 유지 |
setAlarmClock() | Doze 해제 | Doze 해제 |
높은 우선도 GCM | Doze 일시적 해제 | Doze 유지 |
AlarmManager#setAlarmClock()은 영향이 크기때문에, 가능한 사용하지않는 것이 바람직하다
App Standby
어플을 Doze/App Standby 대상밖으로 하는 방법
Intent intent = new Intent();
String packageName = context.getPackageName();
PowerManager pm = (PowerManager)
context.getSystemService(Context.POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
intent.setAction(
Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName)); }
startActivity(intent);
Whitelist 등록이 허가되는 조건
종류 | UseCase | GCM 사용가능? | 허가? | 비고 |
---|---|---|---|---|
Instant Message, 채팅, 호출 | 실시간 메세지가 Doze/App Standby중에도 필수 | O | X | 높은 우선도 GCM을 사용하라 |
위 항목 + 법인 VoIP | 위와 같음 | X | O | |
Task 자동화 어플 | 어플 코어 기능이 스케쥴되는 자동 Action | 어떤것이라도 된다 (if applicable) | O |
잠재적 Google Play 리스크
↓
AlarmManager of Job Scheduler
Job Scheduler 사용방법
Context appContext = getApplicationContext();
JobScheduler scheduler =
(JobScheduler)appContext.getSystemService(JOB_SCHEDULER_SERVICE);
ComponentName componentName =
new ComponentName(appContext, MyJobService.class);
JobInfo jobInfo = JobInfo.Builder(jobId, componentName)
.setPeriod(5000).setNetworkType(JonInfo.NETWORK_TYPE_ANY).build();
scheduler.schedule(jobInfo);
JobService
public class Myservice extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// TODO: AsyncTask등으로 실제 처리를 별도 스레드에서 실행시킨다
return true; // true: 별도 스레드에서 처리중, false: 처리 완료
}
@Override
public boolean onStopJob(JobParameters params) {
// TODO: 시스템으로부터 정지요구가 있다면 별도 스레드 Task를 취소한다
// 예를들면, onStartJob에서 생성한 AsyncTask에 cancel()를 호출
return false; // true: Job을 다시 Schedule한다, false: Job을 버린다
}
}
정리
↓
시청 감사합니다
보조 자료
단말 하드웨어 개선
어플 작성 가이드라인 · 도구
Doze 실현방법
Doze로부터 빠져나오는 조건
(※) 가속도 센서, 픽업 센서 등으로 검축된 동작을 말함
Doze 조정 (단말개발자용)
<!-- Doze: check proximity sensor before pulsing? -->
<bool name="doze_proximity_check_before_pulse">true</bool>
<!-- Doze: duration to avoid false pickup gestures triggered by notification vibrations -->
<integer name="doze_pickup_vibration_threshold">2000</integer>
Doze 동작 확인 방법
Doze 동작 확인 방법 (계속)
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
- 몇번인가 IDLE이 표시될때까지 호출
- 이후, step으로 IDLE/IDLE_MAINTENANCE로 변화시키므로 maintenance windows 동작확인도 가능 - 또는 강제적으로 deviceidle에 이행 (화면 ON인채로)
$ adb shell dumpsys deviceidle force-idle
Doze 동작 확인 방법 (계속)
$ adb shell dumpsys battery reset
App Standby 동작 확인
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true
App Standby 동작 확인 방법 (계속)
$ adb shell am set-inactive <packageName> false
$ adb shell dumpsys battery reset
comments powered by Disqus
Subscribe to this blog via RSS.
LazyColumn/Row에서 동일한 Key를 사용하면 크래시가 발생하는 이유
Posted on 30 Nov 2024