안드로이드 앱 개발을 할 때 마다 궁금한게 있었습니다. 안드로이드 앱이 실행되고 부터는 제가 개발한 코드가 돌아가는걸 알고 있는데 사용자가 앱 아이콘을 클릭한 시점부터 안드로이드 앱이 동작하기 까지 어떠한 과정을 거쳐서 제가 짠 코드가 돌아가게 되는걸까요? 제가 개발하는 건 안드로이드에 있는 수많은 앱들 중 하나인데 이 많은 앱들을 실행시키는 이 안드로이드는 도대체 어떻게 만들어져 있는걸까요? 이러한 궁금증들이 계속 있었고 이번에 기회에 생겨 안드로이드 OS 가 부팅되는 시점부터 앱이 실행되어 내가 짠 코드에 진입하는 순간까지를 안드로이드 프레임워크 관점에서 공부해보기로 마음먹었습니다.
안드로이드 앱은 어떻게 실행될까?
(1) 안드로이드 프레임워크 : (현재 글)
이번 글에서는 안드로이드의 제일 기본이라 할 수 있는 안드로이드 프레임워크에 대해서 공부해보겠습니다.
안드로이드는 다양한 종류의 디바이스와 폼팩터를 위해 만들어진 리눅스 기반의 오픈소스 소프트웨어입니다. 아래 그림은 안드로이드 플랫폼의 주요한 컴포넌트들을 보여줍니다.
위의 그림을 요소별로 간단히 정리하면 다음과 같습니다. 리눅스 커널위에 추상화된 하드웨어 계층(HAL)이 있고 그 위로 라이브러리와 런타임이 있습니다. 그 다음 어플리케이션 프레임워크(API Framework)가 존재합니다. 그리고 마지막 최상단에 어플리케이션이 있습니다. 안드로이드 앱 개발자는 주로 어플리케이션 프레임워크에서 제공하는 컴포넌트와 이를 사용하기 위한 API를 가지고 어플리케이션을 개발하게 됩니다.
각 계층별로 중요한 요소를 바텀 업 순서로 설명하면 다음과 같습니다.
리눅스 커널
안드로이드 커널은 리눅스 커널을 기반으로, 기존 리눅스에서 불필요한 것 (X-Windows, 표준 리눅스 유틸리티 일부 등) 은 제거하고 기능을 추가로 확창 패치한 것입니다. (Binder, Low Memory Killer 등등) 이 중 Binder IPC는 Inter Process Protocol 의 약자로 프로세스 간 통신에 사용됩니다.
HAL ( Hardware Abstraction Layer )
HAL은 하드웨어 공급업체에서 구현해야 하는 표준 인터페이스를 정의하며 Android에서 하위 수준의 드라이버 구현을 고려하지 않아도 되게 해주는 시스템입니다.
Android Runtime
안드로이드 런타임은 Application 을 실행시키기 위한 최소한의 환경을 제공하는 역할을 합니다. 크게 가상머신(ART)과 자바 코어 라이브러리로 이루어져 있습니다. 모든 안드로이드 어플리케이션은 가상 머신의 인스턴스에 있는 자체 프로세스 안에서 실행됩니다.
ART 는 안드로이드에서 사용되던 기존의 달빅 가상머신의 한계점을 해결하기 위해서 구글에서 새로 개발한 런타임으로 안드로이드 OS. 5 롤리팝부터 기본 적용되었습니다. 그 전에는 Dalvic 가상머신에서 실행됐습니다.
코어 라이브러리는 안드로이드에서 Java 의 핵심 라이브러리를 사용할 수 있도록 하는 Java 라이브러리 입니다. 커널을 래핑하거나 추가 기능을 제공하는 역할을 합니다. 안드로이드 프레임워크 소스에서 위치는 /system/core 입니다.
네이티브 C/C++ 라이브러리
WebKit, SQLite, OpenGL 과 같은 다양한 C/C++ 라이브러리를 포함하고 있습니다. 어플리케이션 프레임워크를 통해 라이브러리 사용이 가능합니다.
어플리케이션 프레임워크
어플리케이션 프레임워크는 안드로이드 OS 위에서 어플리케이션의 기반이 되는 기본 구조입니다. 그림을 보면 어플리케이션 프레임워크에 여러 Manager 가 있는데 이들 Manager 가 해당 역할을 하고 있습니다. 앱에서는 새로운 화면을 시작할 때 직접 해당 화면 인스턴스를 생성하거나 초기화 하는 함수를 호출하지 않습니다. 또한 환경설정에서 언어가 변경될 때 앱에서 해당 언어의 리소스를 '직접' 찾아서 가져오지 않습니다. 이러한 여러 동작들은 앱에서 '직접' 하지 않고 어플리케이션 프레임워크에서 관리하고 있습니다. 앱에서는 어플리케이션 프레임워크에서 정한 규칙에 따라 만들기만 하면 됩니다.
여기서 생기는 궁금증이 어플리케이션 프레임워크의 Manager 들이 실제로 어떻게 위와 같은 작업들을 하는지입니다. 이는 여러 앱을 통합해서 관리하는 통합 문의 채널인 system_server 에서 하게 됩니다. 사실 어플리케이션 Manager 들도 주요한 기능을 실제로 수행하는 system_server를 위한 관문입니다.
앱 = 클라이언트
- 컴포넌트 탐색, 액티비티 스택관리, 서비스 목록 유지, ANR 처리 등을 직접 하지 않습니다.
- 액티비티를 포함한 모든 안드로이드 컴포넌트는 system_server 를 거쳐서 관리되고 system_server 에서 앱 프로세스에 다시 메세지를 보내는 방식으로 동작합니다.
- 앱 프로세스는 서버인 system_server 프로세스에 모두 위임하고 컴포넌트 실행 등 최소한의 역할만 합니다.
system_server = 서버
- system_server 는 여러 앱을 통합해서 관리하는 '통합 문의 채널' 입니다.
- 각종 Manager 의 서버 기능은 "별도 프로세스"인 system_server 에서 실행합니다.
시나리오로 예를 들면
- 앱단에서 startActivity() 라는 함수를 호출해 새로운 화면을 보여주려 하면
- system_server 에서는 해당 액티비티 탐색하게 되고
- 해당 액티비티를 가진 앱 프로세스가 아직 떠있지 않다면 system_server 에서 새 프로세스를 시작하고
- 해당 액티비티를 가진 앱 프로세스가 띄워져 있다면 해당 프로세스를 찾습니다.
- 이 후 system_server 는 액티비티 스택에 액티비티 내용을 반영하고
- 액티비티를 가진 앱 프로세스에 새로운 화면(액티비티)를 보여주라고 명령을 하게 됩니다.
위와 같은 구조 덕분에 안드로이드 개발자는 어플리케이션 프레임워크의 Manager 들을 통해 여러 기능들을 개발할 수 있게 됩니다.
하나 더 추가로 정리하면 여러 Manager는 대부분 자바로 작성되어 있습니다. 이 중 하드웨어 제어나 빠른 속도가 필요한 것들은 내부적으로 JNI를 연결해서 네이티브 C/C++ 코드를 사용하기도 합니다. 예를 들면 Telephony Manager, Location Manager 는 제어하기 위해서, Resource Manager 등은 리소스 테이블을 유지하고 접근할 때 빠른 속도를 내기 위해서 네이티브 C/C++ 코드를 사용합니다.
어플리케이션
안드로이드 프레임워크의 최상단으로 안드로이드 개발자가 개발하는 앱들이 여기에 속한다고 보시면 됩니다.
지금까지 안드로이드 프레임워크에 대해 간략하게 알아보았습니다. 전에는 막연하게 공부하고 넘어갔었는데 이번에 글을 쓰면서 어느정도 정리가 된 것 같습니다. 다음에는 이를 토대로 안드로이드 부팅 과정에 대해 공부해 보겠습니다.
[레퍼런스]
- 안드로이드 Next Step
'개발 공부 정리' 카테고리의 다른 글
안드로이드 프레임워크 뷰 콜백함수에 코루틴 적용하기 (0) | 2021.03.21 |
---|---|
안드로이드 앱은 어떻게 실행될까? - 안드로이드 부팅 (0) | 2021.02.07 |