Android Process

kimji1
6 min readMar 19, 2020

--

  • 애플리케이션의 구성 요소<activity> <service> <receiver> <provider>
  • 구성요소가 시작되고 애플리케이션에 실행 중인 다른 구성 요소가 없으면 Android 시스템은 하나의 실행 스레드로 애플리케이션의 Linux 프로세스를 시작
  • 기본적으로 같은 애플리케이션의 모든 구성 요소는 같은 프로세스와 스레드에서 실행
  • 애플리케이션 구성 요소가 시작되었는데 해당 애플리케이션의 프로세스가 이미 존재할 경우, 해당 구성 요소는 프로세스 내에서 시작되고 같은 실행 스레드를 사용
  • 애플리케이션 내의 여러 가지 구성 요소가 각자 별도의 프로세스에서 실행되도록 할 수 있고, 어느 프로세스에나 추가 스레드를 만들 수 있음

프로세스

  • manifest의 각 구성 요소에 대해서 android:process에 값을 지정함으로써 해당 구성 요소가 실행되는 프로세스를 지정할 수 있음
  • android:process를 설정하여 다른 애플리케이션의 구성 요소를 동일한 프로세스에서 실행할 수도 있음, 이 경우 애플리케이션이 동일한 Linux 사용자 ID를 공유하고 동일한 인증서로 서명되었을 경우에 한함
  • <application> 요소도 android:process 특성을 지원하며, 모든 구성 요소에 적용되는 기본값을 설정함

프로세스의 중요도

1. Foreground Process

  • 사용자가 현재 하고 있는 작업에 필요한 프로세스
  • 다양한 애플리케이션 구성요소로 인해 포함된 프로세스가 다양한 방식으로 포그라운드로 간주될 수 있음
  • 아래에 하나라도 해당하면 프로세스가 포그라운드에 있는 것으로 간주
    — 프로세스가 사용자와 상호작용하고 있는 화면에서 Activity 실행 중
    — 프로세스가 현재 실행중인 BroadcstReceiver가 있음
    — 프로세스에 콜백 중 하나에서 현재 코드를 실행 중인 Service가 있음

2. Visible Process

  • 사용자가 현재 알고 있는 작업을 하므로 이 프로세스를 종료하면 사용자 환경에 부정적인 영향을 미치기 때문
  • 아래 조건에 해당하는 프로세스가 가시적 프로세스로 간주
    — 프로세스가 화면상으로는 사용자에게 표시되지만 포그라운드에 있지 않은 Activity 실행 중(onPause() 메서드가 호출된 상태)으로, 예를들어 Foreground Activity가 대화상자로 표시되고 이 대화상자에서 포그라운드 Activity 뒤에 이전 Activity가 보이는 때
    — 프로세스에 Service.startForeground()를 통해 Foreground Service로 실행중인 Service가 있는 경우
    — 프로세스가 시스템에서 라이브 배경화면, 입력 방법 서비스 등과 같이 사용자가 알고 있는 특정 기능에 사용하는 서비스를 호스팅

3. Service Process

  • startService()메서드로 시작된 Service를 유지하는 프로세스
  • 사용자에게 직접 표시되지는 않지만 일반적으로 사용자가 관심을 가진 작업을 실행
  • 시스템은 모든 Foreground 프로세스 및 Visible 프로세스를 유지할 메모리가 부족하지 않다면 항상 이 프로세스의 실행 상태 유지

4. Cached Process

  • 현재 필요하지 않은 프로세스
  • 시스템은 다른 곳에서 메모리가 필요할 때 언제든 원하는 대로 이 프로세스를 종료
  • 정상적으로 작동하는 시스템에서 캐시된 프로세스는 메모리 관리와 관련된 유일한 프로세스
  • 현재 사용자에게 표시되지 않는 하나 이상의 Activity 인스턴스를 포함
  • Activity 생명 주기를 올바르게 구현하면 시스템이 이런 프로세스를 종료해도 앱으로 돌아갈 때 사용자 환경에 영향을 주지 않음
  • LRU 목록으로 유지되며 메모리 회수 시 목록의 마지막 프로세스가 맨 처음 종료

스레드

  • 애플리케이션이 시작되면 시스템이 애플리케이션에 대한 스레드를 생성하며 이를 UI 스레드(UI 조작 작업은 UI 스레드에서만 이루어져야 하기때문에)또는 Main 스레드라 함
  • 네트워크 액세스나 데이터베이스 쿼리 등의 긴 작업을 UI 스레드에서 수행할 경우 전체 UI 이벤트가 차단되어 사용자에게는 애플리케이션이 중단된 것처럼 보임
  • UI 스레드가 몇 초 이상 차단되면(현재는 약 5초) 사용자에게 Application Not Response(ANR)이라는 대화상자가 표시되고, 애플리케이션이 종료되거나 불만족에 의해 제거될 수 있음
  • Android UI Tool Kit은 Thread Safe하지 않기 때문에 UI를 Worker Thread에서 조작하면 안됨

Worker Thread

  • UI 반응성을 위해 UI 스레드를 차단하지 않는 것이 매우 중요하며, UI 업데이트를 제외하고 시간이 소요되는 작업은 반드시 별도의 스레드에서 수행해야 함. 이 별도의 스레드를 Background Thread 또는 Worker Thread 라고 함
  • 다른 스레드에서 UI 스레드에 액세스 하기 위해 제공하는 방식
    — Activity.runOnUiThread(Runnable)
    — View.post(Runnable)
    — View.postDealyed(Runnable, long)
  • 위의 방법을 사용하기에 복잡한 작업은 Handler를 사용하여 UI 스레드에서 전달받은 메시지를 처리하는 방안을 고려해봐야 함

--

--

kimji1
kimji1

No responses yet