안드로이드 아키텍쳐 (Analysis of the Android Architecture) #2-1 안드로이드 구조


Android/번역본 2013.10.15 21:49



KIT라는 곳에서 2010년도에 발표된 Analysis of the Android Architecture에 대해 번역을 한 글입니다. 

원본은 http://os.ibds.kit.edu/downloads/sa_2010_braehler-stefan_android-architecture.pdf이며, 중간중간 개인적인 주석은 () / *로 처리하겠습니다. 


간단하게 아키텍쳐를 이해하는데 도움을 얻으려 번역을 하고 공유하려 합니다. 

(일부 오역 및 의도가 잘못 전달 되었을 수도 있습니다. 양해부탁드립니다)



2. 안드로이드 구조 


 OS의 최대의 목표는 Application을 구동시키기 위함이며, 안드로이드는 서로 다른 Layer에서 Application을 실행하고 관리하기 위해 몇가지를 제공합니다. 안드로이드는 확실히 application, process, task와 thread가 구별됩니다. 이번 챕터는 이런 것들에 대해 좀더 정확하게 파악을 하고자 합니다. 


2.1 Processes & threads


 위에서 언급한 것들 중 Processes는 시스템의 행동을 제어하고 프로그램을 실행하기 때문에 굉장히 중요합니다. Processes 에는 다양한 타입이 있으며, 이 것들은 process classes에서 찾아볼 수 있습니다. 


Foreground : 액티비티가 구동되는 Process이며 Service는 Activity를 Providing합니다. Service가 시작되거나 중지가 되면 BroadcastReceiver를 통해 즉각적으로 반응을 받을 수 있습니다. (가장 상위에 있는 Service라고 생각하셔도 무방할 것 같습니다.)


Visible : Process가 일시적으로 중지상태이지만 액티비티가 보이거나 서비스가 액티비티에 bound되어 있을 경우에는 process는 visible process로 분류 합니다. (If a process holds a paused but still visible Activity or a Service bound to a visible Activity and no foreground components, it is classified a visible process.)


Service : Service를 실행하는 process


Background : 액티비티가 보이지 않는 경우 보이지 않는 백그라운드 process에 의해 유지됩니다. 


Empty : 활동하지 않고 있는 Application 에 포함되어 있는 process들은 Caching을 목적으로 존재합니다. 


 만약 시스템에서 사용할 수 있는 메모리가 적을 경우, 프로세스들은 시스템의 결정에 의해 kill이 되고 메모리들을 확보하게 됩니다. 

그러므로 empty processes들(background process들을 포함한)은 대부분 중지되게 됩니다. 일반적으로 empty 혹은 background로만 동작하는 process들은 유저가 사용하는 것에 있어 크게 영향을 주지 않습니다. System은 Activity를 통해 터치를 받지 않는 상태일때에는 메모리를 회수하도록 디자인되어있습니다. 


 Processes들은 여러개의 threads를 가질 수 있으며, 이것은 Linux를 기반으로 했기에 가능한 일입니다. 대부분의 안드로이드 앱들은 UI thread, Input handling, I/O operation, 계산 등의 다양한 작업이 가능해야 하기 때문에 여러개의 thread들을 가진 process를 통해 구동이 됩니다. Application level에서 동작하는 thread는 일반적으로 Java thread이며 Dalvik VM위에서 동작합니다. 



2.2 Application & tasks


 안드로이드 어플리케이션은 Thread가 포함되어 있는 processes들에 의해 동작하게 됩니다. task나 applciation은 서로 밀접하게 연관이 있습니다. tasks는 Activities의 세트이며 task가 존재하기 떄문에 여러개의 앱들이 실행될 수 있습니다. tasks는 기본적으로 유저가 사용했던 경험을 차곡차곡 기억해 놓습니다. 이를테면 유저가 메일 앱을 이용해 메일을 받았는데, 그 메일에 링크가 있어 클릭을 통해 웹브라우져에 접속을 했습니다. 이런 경우 task는 메일과 웹브라우져 앱 두가지를 기억하고 있으며 Back키를 누를 경우 순차적으로 뒤로 이동하게 됩니다. 


 * 이 글에서는 간단하게 설명이 되어 있는데, Stack이란 간단하게 연관된 액티비티들의 모음으로 생각하면 쉽게 이해할 수 있을 듯 합니다. 


2.3 Application 내부 


 안드로이드 앱의 구조는 네가지의 다른 컴포넌트로 구성이 됩니다. 이 컴포넌트들로는 Activity와 Service, BroadcastReceiver(한글판 안드로이드 책에서는 '방송'으로 단어를 사용합니다) 그리고 ContentProvider이 있습니다. Application은 네가지 모두를 다 필요로 하지는 않지만 GUI를 구현하기 위해는 적어도 Activity는 사용이 되어야 합니다. 


 Applications는 다른 Application과의 정보교환을 Intent를 통해 하게 됩니다. 이 intents는 실행하고자 하는 Action의 이름을 받게 됩니다. intentManger는 받은 intent들을 관리하며 인텐트를 통해 적절한 행동을 할 수 있습니다. Intent의 수신은 Application을 통해 filtering할 수 있습니다. 


Service와 BR은 application이 background에서 어떠한 작업을 하거나 다른 컴포넌트들이 기능들을 수행할 수 있도록 하기 위해 필요합니다. BR은 이벤트를 쏠수 있고, 서비스는 긴시간을 유지하는 반면, 짧은 시간동안 실행되게 됩니다. (단순히 쏘고 받기만을 하기 때문). 


2.3 Application internal 

 라이브러리, 이미지파일, 그리고 다른 필요한 데이터등은 .apk file로 압축이 되어 Android application이 됩니다. 

(.APK는 컴파일 된 압축파일입니다. 실제로 압축프로그램을 통해서도 풀 수 있으며, AndroidManifest.xml 에서 첫번째에 띄울 클래스를 지정하는 것으로 start Activity부터 앱이 시작되게 됩니다.)


2.3.1 AndroidManifest.xml 


 모든 안드로이드 Dalvik 어플리케이션들은 AndroidManifest.xml이라는 XML 문서를 가지고 있습니다. 이 파일에는 시스템에서 어떻게 돌아갈지에 대한 설정과 권한을 얻거나 필요한 라이브러리와 filter들, intent와 broadcast등이 기록되어 있습니다. 

 manifest에 기록되는 몇가지 요소들은 다른 챕터에서 좀 더 자세히 이야길 할 것입니다.



2.3.2 Activities


 액티비티들은 쉽게 이야기해서 화면에 보이고 있는 '하나의 화면'입니다. 액티비티는 정보들이 보이는 요소들(이미지 같은)을 가지고 있으며 유저의 반응을 받습니다. 각가의 어플들을 여러개의 액티비티들을 가지고 있어 서로 다른 액티비티들끼리는 위에서 이야기했듯, intent를 통해 통신을 합니다. 

 모든 액티비티들은 android.app.Activity를 상속받으며 (물론 상속받는 Activity를 커스텀하게 만들 수 있지만 결국엔 상속받은 class들중 가장 부모는 Activity를 상속받습니다) 생명주기를 갖습니다. 안드로이드가 multitasking을 관리하거나 특성상 메모리가 작기 때문에 이러한 concept을 가지고 있습니다. (아마 데스크탑처럼 한 화면안에 여러개의 앱이 띄우지는 것이 아니라 한화면을 Activity로 규정한 이유가 스마트폰이라는 기기의 적은 메모리를 커버하기 위한 특성이라는 듯 합니다) 


 생명주기를 보면, 


onCreate() 액티비티가 시작될 때

onDestory() 액티비티가 완전히 종료될 때

onResume() 액티비티가 foreground에 뜰 때 호출이 됩니다. (홈키를 눌러 백그라운드로 진입한 후 다시 홈키를 길게 눌러 앱의 화면을 다시 띄우는 경우에도 호출됩니다.)

onPause() 앱이 백그라운드로 전환될때 호출됩니다.

onrestart() 액티비티에 저장되어 있는 모든 것들이 사라진 뒤 다시 나타날때 호출됩니다. 


저작자 표시 비영리 변경 금지
신고

WRITTEN BY
ShakeJ

0 ,