ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android O, Background Check and other insights into the evolution of the Android Operating System Framework
    프로그래밍/Android 2017. 6. 7. 00:19
    반응형


    201705 Background Check and other insights into the evolution of the Android Operating System Framework

    The mobile ecosystem has dramatically changed since Android's inception, and we must continue to evolve and mature the platform to remain relevant. Find out how the framework team thinks about features like Doze, Background Limits, Application overlays and the delicate balancing act between API freedom and anarchy.

    https://events.google.com/io/schedule/?section=may-17&sid=15f6514a-2b56-4e42-b99b-fb338f31e30e


    Android O부터 아래 주요 변경 키들이 있다. 

    Background execution limits

    Location updates limit

    Removing of implicit broadcasts



    Background execution limits


    주요 키를 이해하기 위해서는 아래 배경지식이 있어야한다.  


    Service란? 

    Service는 근본적으로 Activity와 같다. 하지만 Activity의 task 실행 시간보다 긴 long-running operation에 적합하며 UI를 제공하지 않는다는 것이 특징이다. 


    Service는 3가지 타입이 있다.


    Started Service - application component(ex. Activity)가 startService()로 실행한 Service. 독립적으로 동작하며 대표적으로 Music Application이 있다. 

    Bound Service - application component(ex. Activity)가 

    bindService()로 실행한 Service. Component의 Back단에서 동작하며 client-server 모델을 가지고 있다. 대표적으로 Navigation Application의 위치 업데이트 기능에 사용된다. 

    Scheduled Service - Scheduled API (ex. JobScheduler)

    에 의해 scheduled된 Service.


    Background vs Foreground Application

    Background 실행 변화에 대해서 알기 위해서는 Background와 Foreground Application이 뭔지 알아야한다. 아래 사항들이 충족되는 Application은 Foreground Application으로 고려된다. 아래 사항들이 충족되지 않는 Application은 background로 고려된다. 


    Application이 Foreground상태이기 위해서는 아래 세 가지 중에 한 가지가 충족되어야한다. 

    1. Activity가 현재 화면에 보여지고 있다.

    2. Foreground Service가 실행되고 있다. 

    3. 다른 Foreground Application에서 Binding Service, Content Provider로 사용되고 있다.


    왜 Android는 background service를 제한하게 되었을까?

    Application이 Service를 이용해서 Background로 동작할 때 Memory와 Battery의 주요 리소스를 소비하기 때문이다. 우리 사용자들의 Memory와 Battery는 충분하지 않다. 

    Android M부터 Doze 모드와 같이 Background의 Memory와 Battery 리소스 사용을 제한하는 시도들을 하고 있다. 

    하지만 아직까지 많은 Application이 Background Service로 socket connection과 같은 많은 양의 RAM을 사용하는 일을 한다. 이로 인해 Foreground에서 실행되는 video 재생이나 game 동작과 같은 Application이 느려지게 된다. 그러면 사용자는 video, game Application을 탓하며 핸드폰을 던지겠지..


    그래서 우리는 startService()를 했으면, stopService()를 해야한다. 


    Android O는 어떻게 service를 제한하고 있을까?

    Android O부터 Application이 Background 상태로 진입하게 되면, 몇 분동안만 Background Service를 생성하고 실행할 수있다. 그 몇 분이 경과하면 Background Application은 idle stage로 진입한다. 


    idle stage에 진입한 Application에대해 Android 시스템은 Service.stopSelf()(https://developer.android.com/reference/android/app/Service.html#stopSelf%28%29)를 호출하여 

    Background로 실행중인 Service를 종료한다.  


    가장 재미있는 부분은 Android O에서는 idle stage에서 startService()를 호출하면 IllegalArgumentException을 발생시킨다.

    다만, 아래 상황에서는 Background Service를 생성해도 Android 시스템이 제한하지 않는다. 

    우선순위 높은 FCM message 알림받기

    브로드 캐스트 알림받기

    Notification의 PendingIntent 실행 


    참고: 이 제한은 Android O를 대상으로 하는 앱에만 적용됩니다. API 레벨 25 이하를 대상으로 하는 앱은 영향이 없습니다.


    그렇다면, idle stage에서도 Background task를 실행하기 위해서는 어떻게 해야할까?

    1) API21에서 제공되는 JobScheduler API를 사용한다. 이 API는 Android 시스템이 Application별로 특정 시간에 실행되도록 만들어진 service들을 일괄 처리할 수 있도록 하여 CPU 사용 시간을 줄일 수 있도록 하였다. JobScheduler는 21부터 제공되므로 만약에 Application이 21 미만 버전도 지원한다면 Firebase Job Dispatcher라는 라이브러리 사용을 고려해보자. 

    2) Foreground Service를 사용한다. Foreground Service는 실행에 제약이 없고 Background Service도 실행할 수 있다.  


    Android O이전에는 Foreground Service를 만들기 위해서 Background Service를 startService()로 실행한 뒤에 Foreground Service를 실행했었다. (ex. notification의 startForeground()) 하지만 Android O부터 우리는 더이상 startService를 호출할 수 없게 된다. 바로 Foreground Service로 실행하는 방법으로 마이그레이션해야한다. (ex. 앞으로 생길 NotificationManager.startServiceInForeground())


    https://medium.com/@kevalpatel2106/how-to-handle-background-services-in-android-o-f96783e65268



    Location updates limit

    참고: 이 제한은 Android O 타겟과 상관 없이 Android O 기기에서 동작하는 모든 앱에 적용됩니다. 

    Background Motion Detection이나 Background로 실시간 알림 기능에 의존하는 앱들은 주의를 기울여야 한다. 중요한 포인트는 한시간에 몇번씩만 Location 업데이트를 받도록만 허용한다는 것이다. 아직은 Android O가 Preview 단계이므로 (201706현재 Preview4, Final만 남음) Location 업데이트 주기에 대해서는 개발자들의 피드백을 받고 있다.


    Location 업데이트도 마찬가지로 Foreground Application 상태가 되기 위해 필요한 기준이 한 가지라도 충족되어야하고, 한 가지라도 충족이 안되면 Android 시스템은 Background 상태로 본다.


    Foreground Application의 Location 업데이트 sampling rate는 동일 

    만약에 Application이 Foreground로 동작하면 Android 7.1.1과 동일한 방식으로 Location 업데이트를 한다. 


    Background Application일 때, 수정할 것

    Background로 동작할지 안 할지의 case를 고려하는 것보다 Application을 Foreground로 돌리는 것이 낫다. Action을 취하기에 좀 더 자주 Location 업데이트를 받을 수 있다.

    1. Application을 Foreground로 동작하게 한다. 

    2. 특히 Service를 Foreground로 동작하게 한다. Service를 Foreground로 동작하게 하기 위해서는 Notification Status bar에 UI를 표시해야한다. ex. 뮤직앱

    3. 전력 절약에 최적화된 GeofencingApi를 사용한다.

    4. Background Application 상태일 때, 한 시간에 그나마 몇 번정도 Location 업데이트를 하는 batch 방식의 FusedLocationProviderApi를 사용한다.


    영향 받는 API

    1.  Fused Location Provider (FLP)

    2. Geofencing
    3. GNSS Measurements and GNSS Navigation Messages
    4. Location Manager
    5. Wi-Fi Manager


    반응형
Designed by Tistory.