안드로이드 프로세스 관리 기본원리
- 안드로이드 어플리케이션은 리눅스 프로세스 상에서 동작한다.
- 한 앱 컴포넌트가 시작하고 다른 앱의 컴포넌트가 실행중이지 않으면 안드로이드 시스템은 하나의 스레드 실행과 함께 새로운 리눅스 프로세스를 시작
- 컴포넌트 실행 시작하려는데 이미 그 앱의 다른 컴포넌트의 프로세스가 존재한다면 같은 프로세스, 같은 스레드에서 실행되는 것이 디폴트
- 하지만 하나의 앱에 이는 다른 각 컴포넌트를 다른 프로세스, 다른 추가적인 스레드를 만들어서 실행시킬 수 있다.
- 방법은 매니페스트에 <activity>, <service>, <receiver>, <provider> 엔트리를 넣고 android:process 속성값을 주어 각 컴포넌트가 어느 프로세스에서 실행되어야하는지 명시할 수 있다.
- 프로세스는 앱의 코드가 실행되어야할 때 만들어지고, 더이상 필요하지 않거나 시스템이 다른 앱을 위해 메모리를 재확보해야할 때까지 실행된다.
- 앱 프로세스의 생명주기는 앱 자체가 아니라 앱의 컴포넌트들의 조합을 통해 시스템에의해서 결정된다. (그 컴포넌트들이 얼마나 유저에게 중요한지와 얼만킁의 메모리가 사용가능한지)
- 그래서 안드 앱 개발자는 각 구성요소들, 특히 액티비티, 서비스, 브로드캐스트 리시버가 어떻게 앱 프로세스 생명주기에 영향을 미치는지 알아야한다.
- 메모리가 부족할 때, 시스템은 프로세스를 죽여야하는데, 그 순서는 실행되고 있는 컴포넌트와 컴포너트 상태로 결정된다. 그것을 기반으로 중요한 순서를 매기고 중요하지 않은 프로세스부터 죽인다는 말이다.
- 프로세스의 우선순위는 종속성에 따라 증가할 수도 있음 A 가 B 프로세스에 있는 컴포넌트에 종속되어있다면 B 가 우선순위가 더 높을 것이다.
프로세스의 4가지 타입
1. foreground process
- 현재 유저가 하고있는 것을 위해 필요한 프로세스.예를들면 다음과 같은 각 조건들이 있다.
- 현재 유저가 상호작용하고 있는 화면 최상단 Activity 가 (onResume 부터) 실행되고 있을 때
- BroadcastReceiver.onReceive() 메서드가 실행중 일 때 (이것도 포그라운드인지 몰랐다..! 의외)
- Service 가 가진 callback 인 onCreate, onStart or onDestroy 중 하나로 코드가 실행되고 있을 때
- 메모리가 부족할 때 최후의 수단으로 죽임
2. visible process
- 유저가 현재 인지하고 있는 것을 실행하는 프로세스, 예를들면 다음과 같은 각 조건들이 있다.
- Activity onPause 부터 (즉 스크린에는 보이지만 포그라운드가 아닐 때)
- Service.startForeground() (즉 서비스가 포그라운드 서비스로서 실행될 때)
- 사용자가 인지하고 있는 특정 기능을 시스템이 사용하고 있는 서비스를 호스팅하는 것
- 이러한 프로세스는 매우 중요한 것으로 간주되며, 모든 포그라운드 프로세스를 계속 실행하는 데 필요한 경우가 아니면 종료되지 않음
3. service process
- startService 부터 서비스를 붙잡고 있는 프로세스
- 유저가 신경쓴느 일들. 백그라운드 네트워크 업로드 다운로드가 그 예시
- 1번과 2번을 모두 보존하는 게 가능할 때까지만 유지
4. cached process
- 당장 필요하지 않아서 메모리같은 자원이 필요하다면 언제든 죽일 수 있는 프로세스
- 사용가능한 캐시 프로세스들은 효율적으로 앱을 switching 할 수 있게 함
- 주기적으로 오래된 캐시 프로세스를 죽임
- 보통 현재 유저에게 보이지 않는 (즉 onStop 호출, 리턴 이후) 액티비티 하나 이상 정도를 잡고 있음)
- 이래서 적절한 액티비티 생명주기 활용이 중요한 것, 왜냐하면 캐시 프로세스가 잡고있는 액티비티 인스턴스가 죽어도 생명주기로 saved state 를 restore 하면 되기 때문 (물론 그 액티비티는 새로운 프로세스에서 다시 만들어지는 것이지만)
- 리스트로 관리됨. 순서는 유용한 정도로 결정됨. 예를 들어 유저의 홈 앱이라던가, 유저가 본 마지막 액티비티라든가 등등
- 다른 제한도 고려할 수 있음. 예를 들어 허용된 캐시된 프로세스 개수, 시간 등
액티비티, 서비스, 브로드캐스트리시버가 프로세스의 생명주기에 어떻게 영향을 미치는지 알아보자!
1. Activity
2. Service
(준비중)
3. Broadcast Receiver
(준비중)
'Android > 이론 학습' 카테고리의 다른 글
[Android/Kotlin] Intent 에 커스텀 객체 전달하기? 직렬화, 역직렬화 Serializable 과 Parcelable, @Parcelize (0) | 2022.02.20 |
---|---|
[Android] Hilt 의 다양한 어노테이션을 알아보자 (0) | 2022.02.19 |
[Android] 안드로이드의 DI (Dependency Injection) (0) | 2022.02.16 |
[Android] 안드로이드의 Background 작업 (0) | 2022.02.12 |
[Android] Activity 의 Life cycle 과 App Life cycle 을 연관지어 생각해보기 (0) | 2022.02.10 |