안드로이드 어플리케이션(응용프로그램) 실행

 안드로이드는 동시에 여러 안드로이드 응용프로그램을 실행할 수 있고, 큰 지연없이 응용프로그램(애플리케이션) 사이에서 사용자 스위치를 할 수 있는 Multi user, multi tasking 시스템입니다. 리눅스 커널은 멀티태스킹을 처리하고, 응용프로그램 실행은 리눅스 프로세스를 기반으로 진행되어집니다.



리눅스 프로세스

리눅스는 모든 사용자에게 OS로 추적할수있는 번호인 고유한 사용자 ID를 할당하게 됩니다. 

일반적인 리눅스처럼 사용자 권한으로 보호되는 개인 리소스에는 접근할 수있으나 다른 사용자의 개인리소스에는 절대 접근할수없습니다. 

따라서 사용자를 격리하기위해서 SandBox 라는게 만들어집니다. 


 안드로이드에서 모든 응용프로그램의 패키지는 고유한 사용자 ID값을 가지게 됩니다. 구체적으로 예를든다면, 안르도이드 앱은 리눅스에서 고유한 사용자에게 해당됩니다. 그렇기때문에 다른 앱의 리소스에 엑세스할수없게됩니다.


응용프로그램은 서로 다른 process와 VM에서 실핼되게 됩니다. 

기본적으로 응용프로그램과 process는 1:1관계이지만, 필요시, 하나의 응용프로그램을 여러개의 프로세스에서 실행하거나, 여러 앱을 같은 프로세스에서 실행할 수도 있습니다.



Life Cycle 생명주기 

앱의 생명주기는 자바 android.app.Application 클래스로 대응되는 리눅스 프로세스 안에서 캡슐화가 됩니다. runtime이 onCreate() 함수를 호출할 때 각 응용프로그램에 대한 Application 객체가 시작됩니다. 원칙적으로 응용프로그램은 onTerminate()로 런타임 호출을 종료하지만, 응용 프로그램에 의존하지 않을수도있습니다. 런타임이 마지막 onTerminate()를 호출할 기회가 있기전에 하부 리눅스 프로세스가 종료되기도 합니다. Application 객체는 프로세스에 첫번째로 생성되는 구성요소이자 마지막으로 소멸되는 구성요소입니다.



응용프로그램 시작

 안드로이드 구성요소중 하나가 실행을 위해 초기화되면, 응용프로그램은 시작됩니다. 어떤 구성요소든 어플리케이션(응용프로그램)에 대한 진입점이 될 수 있습니다. 일단 첫번째 구성요소(컴포넌트라고도 합니다.)가 시작되엇고, 프로세스가 실행되기 전이라면 리눅스 프로세스는 다음과 같은 시동순서를 거치게됩니다.


1. 리눅스 프로세스를 시작합니다.

2. 런타임을 생성합니다.

3. Application 클래스의 인스턴스를 생성합니다.

4. 응용프로그램을 위한 진입점 구성요소를 생성하게 됩니다.


새로운 리눅스 프로세스와 runtime을 설정하는 작업은 결코 짧은 시간안에 이루어지지 않습니다. 이작업은 성능을 저하시키고 사용자 경험에 두드러진 악영향을 미칠 수 있습니다. 따라서 시스템은 시스템 부트에 Zygote라는 특별한 프로세스를 시작하여, 안드로이드 응용프로그램의 시작 시간을 단축하려고 합니다. 


 Zygote는 미리 로드된 핵심 라이브러리의 전체 세트를 가지고 있습니다. 새로운 응용프로그램 프로세스는 모든 응용프로그램에서 공유되는 핵심 라이브러리를 복사하지않고, Zygote프로세스에서 fork합니다.



응용프로그램 종료

프로세스는 응용프로그램이 시작될때 생성되며, 시스템 자원이 해제될때 종료됩니다. 사용자가 나중에 응용프로그램(application)을 재 실행할 수 있는 경우가 있기때문에 Runtime은 시스템 전체 자원이 부족해지기 전까지는 현재 살아있는 응용프로개름의 모든 자원을 소멸시키지는 않습니다. 따라서 모든 구성요소가 소멸해도 응용프로그램이 자동적으로 종료되지않습니다.


 시스템 자원이 부족할 때 어떤 프로세스를 죽여야할지는 Runtime에 달려있습니다. 이러한 결정을 하기 위해 시스템은 애플리케이션의 가시성 및 현재 실행중인 구성요소(컴포넌트)에 따라 각각의 프로세스에 순위를 부과합니다. 낮은 순위의 프로세스는 높은 순위의 프로세스보다 먼저 강제로 종료됩니다. 프로세스의 순위를 높은 순서대로 보면 다음 아래와 같습니다.


포그라운드(가장 앞단, UI컴포넌트 쪽)

 전면에 보이는 컴포넌트를 가진 애플리케이션, 원격 프로세스에서 전면의 액티비티에 바인딩된 서비스, 실행중인 브로드캐스트 리시버가 해당됩니다.


화면에 보이는 프로세스

 화면에 보이나 부분적으로 숨겨진 컴포넌트(구성요소)를 가진 애플리케이션입니다.


Service 서비스

 백그라운드에서 실행중이며, 화면에 보이는 컴포넌트와 연결되어있지않은 서비스가 해당합니다.


Background 백그라운드

 화면에 보이지않는 액티비티, 대부분의 애플리케이션이 가지는 프로세스 레벨입니다.


빈프로세스

 활성화된 구성요소가 없는 프로세스, 빈 프로세스는 응용프로그램의 시작시간을 개선하기 위해 유지되는편이지만, 시스템이 자원을 회수할때 가장 먼저 종료됩니다.



+ Recent posts