개발/AOS

안드로이드 Work Manager란

728x90

현재 회사에서 안드로이드 클라이언트 단에서 OAuth2 JWT관리와, 네트워크 연결 관리 등을 개선해야할 일이 생겼다.

 

팀원들과 논의 결과 백그라운드에서 처리 하는 방향으로 결정 하였고, 

 

Work Manager를 공부하게 되었다.

 

 

 

Google에서 2018년 안드로이드 릴리즈로 인해 복잡해진 백그라운드 처리를 해결하기 위해서 출시한 라이브러리이다.

 

 

 

 

 

Work Manager를 이해하기 위해서는 먼저, 메모리와 기본 백그라운드 솔루션을 이해해야 한다.

 

 

 

 

 

1. 안드로이드 메모리 

 

안드로이드가 처음 나왔을 때, 안드로이드 커널은 리눅스 커널을 기반으로 했다. 하지만, 안드로이드와 다른 모든 리눅스 커널 기반 시스템 주요 차이점은 안드로이드에서는 스왑 공간이라는 것이 없다.

 

리눅스의 스왑공간은 실제 메모리의 양이 가득차면 사용된다. 시스템에 더 많은 메모리 리소스가 필요하고 램이 가득 차면 메모리의 비활성 페이지가 스왑공간으로 이동된다. 스왑 공간은 램보다 엑세스 시간이 느린 하드 드라이브에 있다.

 

메모리와 하드드라이브의 메모리 공간 스왑 과정

 

하지만 안드로이드에서는 스왑 공간이 없음, 시스템에 메모리가 부족하면 OMM Killter를 통해서 메모리를 확보한다.

 

oom_adj 활동 관리자가 점수를 부여한다.

앱 이전 상태(포그라운드, 백그라운드, 서비스 등)의 조합이다.

 

 setprop ro.FOREGROUND_APP_ADJ 0 
    setprop ro.VISIBLE_APP_ADJ 1 
    setprop ro.SECONDARY_SERVER_ADJ 2 
    setprop ro.BACKUP_APP_ADJ 2 
    setprop ro.HOME_APP_ADJ 4 
    setprop ro.HIDDEN_APP_MIN_ADJ 7 
    setprop ro.CONTENT_PROVIDER_ADJ 14 
    setprop ro.EMPTY_APP_ADJ 15

oom_adj의 값이 높을 수록 oom killer에 의해 제거될 확률이 높다.

현재 포그라운드 앱은 oom_adj은 0이다 (oom killer에 의해 제거될 확률이 낮음)

 

oom killer는 여유 메모리 및 oom_adj 임계값을 기반으로 구성 가능한 규칙을 사용함.

 

즉 규칙에 사용가능한 메모리가 X1보다 작으면, oom_adj>Y1로 프로세스를 종료 라고 명시되어 있음.

 

따라서 기본적인 흐름은 아래와 같다.

모든 프로세스에 점수가 지정됨

 

adj_oom > 7 및 메모리 소비 > 10kb인 모든 프로세스 종료
메모리가 해제된 이후

 

 

 

 

3. WorkManager

 

 Google IO Android 프레임워크 팀은 WorkManager을 발표했다. 

 

WorkManager는 시스템 기반 백그라운드 처리를 위한 최고급 API를 제공하여 개발자 경험을 단순화 하는 것을 목표로 합니다. 앱이 더 이상 포그라운드에 있지 않더라도 실행되더야하는 백그라운드 작업을 위한 것입니다. 가능한 경우 JobSheduler 또는 Firebase JobDispatcher를 사용하여 작업을 수행합니다. 앱이 포그라운드에 있는 경우 프로세스에서 직접 작업 시도를 합니다.