프레임워크로써의 안드로이드

3 분 소요

목표

OS, Framework, Library 의 차이에 대해서 구분하고 안드로이드 환경에서 앱이 동작하는 기본적인 원리에 대해서 이해한다.

  • 프레임워크와 라이브러리 차이를 설명할 수 있다.
  • new Activity() 코드가 왜 없는지에 대해 설명할 수 있다.
  • Lifecycle을 누가 호출하는지에 대해서 설명할 수 있다.

1. 안드로이드란

1.1. OS

하드웨어와 소프트웨어를 제어하며 사용자가 컴퓨터를 쓸 수 있도록 인터페이스를 제공하는 시스템(소프트웨어).

안드로이드는 OS 이다.

1.2. Platform

소프트웨어가 실행되는 환경. 좀 더 넓은 의미로 보자면 일관된 개발/실행 환경을 제공하는 모든 하드웨어나 소프트웨어.

Platform은 OS보다 좀 더 넓은 개념으로 OS 역시 Platform 이다.

일관된 개발/실행 환경을 제공한다는 의미에서 Java, .NET 프레임워크 등 도 모두 Platform 이다.

안드로이드는 OS 이자 Platform 이다.

1.3. Library

자주 사용되는 기능을 묶어 클래스나 함수, 메서드로 만들게 되는데 이들의 집합을 Library 라 한다.
단순히 재활용 가능한 코드의 집합으로 예를 들어 C 표준 library, Java library가 있다.

1.4. Framework

프레임워크는 소프트웨어 개발에 있어 하나의 뼈대 역할을 하는데 소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합이다.

프레임워크는 라이브러리보다 더 넓은 개념으로 보통 프레임워크는 라이브러리를 제공한다.

안드로이드는 앱 개발을 위해 Application Framework를 제공한다. 여기에 여러 library가 있다.

1.5. Library와 Framework의 차이

library_vs_framework

주요한 차이점은 소프트웨어 제어 흐름에 대한 주도성이 누구에게/어디에 있는가 이다.

라이브러리는 개발자가 호출하여 사용한다.
개발자 필요에 따라 사용하므로 개발의 흐름을 개발자가 가지고 있다.

프레임워크는 제어의 역전이 발생한다.
개발자가 흐름을 주도하는것이 아니라 프레임워크에 의해서 흐름이 주도되며, 개발자는 프레임워크의 요구에 맞춰 코드를 개발한다.

1.6. 안드로이드에서 Framework의 특징을 알 수 있는 예

안드로이드 주요 컴포넌트 Activity, Service, Broadcast Receiver, Content Provider 를 앱에서 구현할때 이 클래스들을 상속받은 다음 Lifecycle 메서드를 override하여 필요한 코드를 추가한다.

Activity를 구현하는 예를 본다.

// Activity를 상속받는 클래스를 생성함.
class SampleActivity : AppCompatActivity() {
	
	// Activity Lifecycle 메서드인 onCreate()를 override하여 필요한 코드를 개발함.
	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		setContentView(R.layout.activity_sample)
		initView()
	}
}

객체 지향 프로그래밍에서 모든 것은 객체로 존재해야 한다.
그런데 안드로이드에서 Activity를 생성할때 new SampleActivity()를 호출하지 않는다.

또한, Lifecycle 메서드인 onCreate(savedInstanceState: Bundle?) 는 개발자가 호출한 적이 없는데 알아서 호출된다.

프레임워크의 특징은 뼈대 역할을 하고 제어의 역전이 발생한다고 했다.

  1. Activity 라는걸 만들면 하나의 화면이 만들어진다는 점. (Activity가 화면이 되는 뼈대를 제공함)
  2. onCreate()는 개발자가 호출한적이 없는데 알아서 호출이 되고, 개발자에게는 적당한 lifecycle 메서드 아래에 적당한 코드가 기입되는것이 강요된다는 점

이러한 것이 안드로이드가 프레임워크인 예라고 할 수 있다.

2. OS / Framework 로써 안드로이드

android

2.1. Kernel

OS의 핵심.
메모리 관리, 프로세스 관리, 쓰레드 관리, 하드웨어 드라이버 관리 등을 한다.

안드로이드는 오픈소스 OS인 리눅스의 커널을 Base로 모바일 환경에 맞게 커스터마이징 하여 사용한다.

2.2. Library

여기서 Library는 일반적으로 앱 개발할때 사용하는 android library가 아니라 system library를 말한다. 단말의 속도를 결정하는 중요한 요소라 자바가 아닌 C로 개발되어 있다.

2.3. Runtime

안드로이드 앱이 구동되는 실행 환경이다.
안드로이드에서 Dalvik, ART가 런타임에 해당한다.

일반적인 컴파일 언어는 CPU의 아키텍쳐와 플랫폼의 환경에 맞추어 기계어로 컴파일된다. 간단히 말하자면, 사람이 작성한 프로그램을 CPU가 알아들을 수 있는 언어로 바로 번역하여 저장하는 것이다. 이 CPU간의 서로 다른 “언어”가 “아키텍쳐”에 해당한다고 보면 된다.

그러나, 자바의 경우는 기본적으로 한 가지 CPU의 아키텍쳐나 환경에 맞추는 것이 아닌 바이트코드라는 것으로 컴파일 되며, 이를 실행하기 위해서는 자바 가상 머신이 필요하다. 이렇게 하는 이유는 자바는 바이트코드 하나만으로 여러 가지 아키텍쳐나 플랫폼에서 작동할 수 있도록 하는 것이 목표이기 때문이다. 아키텍쳐와 플랫폼에 맞는 가상머신만 있다면 하나의 실행 파일만 가지고도 각종 장치에서 쓸 수 있는 것이다.

안드로이드도 Java 언어를 사용하기 때문에 VM이 필수적이다. 이에 자바 가상머신(JVM)을 사용할 수 있지만, JVM은 라이센스 문제가 있어서 구글에서는 안드로이드 개발 시 Dalvik VM을 따로 개발해서 넣었다.

이후 Dalvik 대신 ART를 개발하였고, 최신 버전의 안드로이드 Runtime은 ART이다.

2.4. Application Framework

앱 개발의 기본이 되는것이 어플리케이션 프레임워크로 개발시 어플리케이션 프레임워크를 사용한다. 앱은 커널이나 시스템 라이브러리를 직접호출할 수 없고, 프레임워크의 api를 호출하여 이들을 사용할 수 있다.

2.5. Application

안드로이드 환경에서 동작하는 앱.

참고로 안드로이드 폰을 구동하면 부팅 후 런처가 뜨는데 이 런처 역시 Application에 속한다. 마치 OS의 특징인것처럼 보여 다른 계층에 존재할것 같지만 런처는 다른 앱을 구동시키는 앱일 뿐이다.

3. ActivityManagerService

startActivity()를 호출하면 누가 Activity를 생성하게 되는가? 이들을 관리하는것은 누구인가? 최근 앱 목록을 보면 어떻게 이 목록들이 나타날 수 있을까?

이들을 가능하게 하는게 ActivityManagerService 이다.
ActivityManagerService는 코어 플랫폼 서비스(시스템 서비스)로써, Application Framework에 속한다.

ActivityManagerService의 주 역할이 안드로이드 4대 Component인 Activity, Service, BroadcastReceiver, ContentProvider를 생성하고 이들의 생명주기를 관리하는 것이다.

즉, startActivity(), startService() 를 했을때 액티비티와 서비스를 생성하는 주체가 바로 ActivityManagerService 이다.

System Service는 SystemServer에 의해 단말 부팅 시 실행된다.

3.1 ActivityThread

ActivityManagerService에 의해서 실제로 Activity에 대해 관리가 이뤄지는 곳이 ActivityThread 이다.

ActivityThread는 모든 안드로이드 애플리케이션의 메인 스레드로서 액티비티 및 서비스의 생성 및 스케쥴링을 담당한다.

앱에서 Activity나 Service 생성을 요청하면 SystemService인 ActivityManagerService에게 요청이 전달된다. ActivityManagerService는 실행하고자 하는 Activity나 Service의 Process가 존재하는지 보고 존재하지 않으면 zygote process 를 통한 프로세스 생성 및 ActivityThread 생성을 요청한다.

ActivityThread 코드 참고.


[참고 문서]

  1. 참고 블로그 1
  2. 참고 블로그 2

댓글남기기