본문 바로가기
Mobile App

[안드로이드] - Android Process lifecycle

by Jman 2022. 7. 13.

Process lifecycle

안드로이드 시스템은 할 수만 있다면 최대한으로 애플리케이션 프로세스를 유지하려고 한다.
그러나, 메모리 공간은 한계가 있다
메모리 공간이 부족하게 되면 어쩔 수 없이 해당 프로세스를 종료시켜야만 한다.
이때, 안드로이드 시스템에서 어떤 프로세스를 먼저 죽여야할 지 우선순위(ADJ)를 결정짓게 되는데,
그 중요도라는 것이 프로세스에서 돌아가고 있는 컴포넌트들이 얼마나 중요한 지에 따라 결정되는 것이다.

 

프로세스 중요도에 따라 총 5단계로 나눠진다.
가장 덜 중요한 프로세스부터 종료된다.

 

Foreground process

사용자가 현재 하고 있는 작업에 필요한 프로세스를 일컫는다.

구체적으로 아래의 조건에 해당하는 프로세스들을 의미한다.

  • 프로세스가 사용자 상호작용하고 있는 화면 상단에 Activity가 실행될 때 (onResume() 메서드가 호출됨)
  • 프로세스에 현재 실행 중인 BroadcastReceiver 가 있을 때 (BroadcastReceiver.onReceive() 메서드가 실행 중)
  • 프로세스에 콜백 Service.onCreate(), Service.onStart(), Service.onDestroy() 중 하나에서 현재 코드를 실행 중인 Service 가 있을 때

 

위 같은 프로세스는 시스템에 몇 개밖에 없다.

메모리가 매우 부족하여 이러한 프로세스조차 계속 실행할 수 없을 때,

최후의 수단으로만 Foreground process를 종료한다. 

일반적으로 이 시점에서는 기기가 메모리 페이징 상태에 도달 했으므로 사용자 인터페이스의 반응성을 유지하려면 Foreground process 종료가 필요하다.

 


Visible process

사용자가 현재 알고 있는 작업을 하므로, 이 프로세스를 종료하면 사용자 환경에 분명히 부정적인 영향을 미친다.

구체적으로 아래의 조건에 해당하는 프로세스를 의미한다.

 

  • 프로세스가 화면상으로는 사용자에게 표시되지만, 포그라운데 있지 않은 Activity 를 실행 중일 때 (onPause() 메서드가 호출됨). 

예를들어, 포그라운드 활동이 대화상자로 표시되고 이 대화상자에서 포그라운드 활동 뒤쪽에 이전 활동이 보이는 때.

  • 프로세스에 Service.startForeground() 를 통해 포그라운드 서비스로 실행 중인 Service 가 있을 때.

Service.startForeground() 는 서비스를 사용자가 알고 있는 것 또는 기본적으로 사용자에게 표시되는 것으로 처리하도록 시스템에게 요청함

  • 프로세스가 시스템에서 라이브 배경화면, 입력 방법 서비스 등과 같이 사용자가 알고 있는 특정 기능에 사용하는 서비스를 호스팅할 때

 

시스템에서 실행 중인 위 같은 프로세스의 수는 포그라운드 프로세스(Foreground)보다 덜 제한적이지만, 그럼에도 비교적 관리되는 편이다.

위 같은 프로세스는 매우 중요한 것으로 간주되며 프로세스의 종료가 모든 포그라운드 프로세스(Foreground)의 실행 상태를 유지하는 데 필요한 상황이 아니라면 종료되지 않는다.

 


Service process

startService() 메서드로 시작된 Service 를 유지하는 프로세스다.

이러한 프로세스는 사용자에게 직접 표시되지 않지만 일반적으로 사용자가 관심(백그라운드 네트워크 데이터 업로드 또는 다운로드)을 가진 작업을 실행한다.

 

따라서 시스템은 모든 포그라운드 프로세스(Foreground) 및 가시적 프로세스(Visible)를 유지할 메모리가 부족하지 않다면 항상 이러한 프로세스의 실행 상태를 유지한다.

 

하지만, 오랫동안(ex 30분이상) 실행되고 있는 서비스는 중요도가 강등됨에 따라 이 프로세스가 캐시된 LRU 목록으로 이전될 수 있다.

그러면 메모리 누출 또는 기타 문제가 있는 장기 실행 서비스가 너무 많은 RAM을 소비하여 시스템이 캐시된 프로세스를 효과적으로 활용하지 못하게 하는 상황을 방지할 수 있다.

 


Cashed process

현재 필요하지 않은 프로세스를 말한다.

따라서 안드로이드 시스템은 다른 곳에서 메모리가 필요할 때 언제든 원하는 대로 이 프로세스를 종료할 수 있다.

 

정상적으로 작동하는 안드로이드 시스템에서 캐시된 프로세스는 메모리 관리와 관련된 유일한 프로세스라고 한다.

제대로 운영되는 안드로이드 시스템에서는 다수의 캐시된 프로세스가 항상 사용 가능하며(효율적인 애플리케이션 간 전환을 위해) 필요에 따라 가장 오래된 프로세스를 정기적을 종료한다.

 

매우 심각한 상황에서만 안드로이드 시스템이 캐시된 프로세스를 모두 종료하고 서비스 프로세스 종료를 시작해야 하는 시점에 이르게 된다.

 

구체적으로 아래의 조건에 해당하는 프로세스를 의미한다.

  • 현재 사용자에게 표시되지 않는 하나 이상의 Activity 인스턴스를 포함 (onStop() 메서드가 호출되어 반환 됨)

 

 

캐시된 프로세스가 활동 수명 주기를 올바르게 구현하면 안드로이드 시스템이 캐시된 프로세스를 종료해도 앱으로 돌아갈 때, 사용자 환경에 영향을 주지 않는다. 그리고 연결된 활동이 새 프로세스에 다시 생성될 때 시스템이 이전에 저장된 상태를 복원할 수 있다.

 

캐시된 프로세스는 의사 LRU 목록으로 유지되며, 메모리 회수 시 목록의 마지막 프로세스가 맨 처음 종료된다.

이 목록의 정확한 순서 지정 정책은 플랫폼의 구현 세부정보이지만, 일반적으로 다른 유형의 프로세스보다 유용한 프로세스(사용자의 홈 애플리케이션을 호스팅하는 프로세스 또는 마지막으로 표시된 활동 등)를 더 앞에 유지하려고 한다.

 

또한 허용되는 프로세스 수의 엄격한 제한, 프로세스가 지속적으로 캐시된 상태를 유지할 수 있는 시간 제한 등 다른 프로세스 종료 정책도 적용될 수 있다.

 

 

 

https://developer.android.com/guide/components/activities/process-lifecycle

 

프로세스 및 애플리케이션 수명 주기  |  Android 개발자  |  Android Developers

대부분의 경우 모든 Android 애플리케이션은 자체 Linux 프로세스에서 실행됩니다. 이 프로세스는 일부 코드를 실행해야 할 때 애플리케이션용으로 생성되며 더 이상 필요하지 않고 시스템이 메모

developer.android.com