전키의 방황일지
article thumbnail

 

 

💨들어가기 전에..

자료를 찾아보면서 공부한 내용을 기록합니다.
잘못된 표현이나 개념이 있을 수 있으니 따끔하게 지적해주시면 감사히 받아들이겠습니다.🥰

앱개발을 하면서 Android가 어떤 구조로 생겨먹었는지 자세히 알지 못했고,

앱이 만들어지고 동작하는 과정에 대한 지식없이 막연하게 개발을 하고 있다는 느낌이 들어,

이참에 Android에 대해 기초부터 차근차근 공부하면서 내용을 정리하여 포스팅해볼까합니다.

 

우선, Android 플랫폼의 구조와 동작 원리에 대해서 가볍게 알아보면서 시작해보겠습니다 😛


 

Android의 구조

Android 플랫폼의 구조

 

먼저, Android의 내부 구조는 이렇게 생겼다고 합니다.

Android OS가 Linux를 기반으로 한다는 것은 얼핏 들어 알고 있는 사실이었는데, 그 위에 다른 레이어가 얹어지면서 비로소 Android라는 OS가 완성되는 것이죠.

 


리눅스 커널(Linux Kernel)

 

리눅스 커널 영역

앱개발자가 그리 신경쓰지 않아도 되는 영역이라고 생각됩니다.

그림을 보면 각종 드라이버와 전원 관리모듈이 존재합니다. 즉, 하드웨어적인 설정을 리눅스 커널에서 관리하는 것이죠.

커널에서 담당하는 일은 다음과 같이 정리할 수 있습니다.

  • 메모리 관리
  • 보안 설정
  • 전원 관리
  • 다른 하드웨어 장치 드라이버 관리
  • 네트워크 시스템 관리

 


하드웨어 추상화 계층(HAL : Hardware Abstraction Layer)

 

HAL 영역

 

리눅스 커널이 드라이버를 통해 하드웨어와 연결을 한다면, HAL은 하드웨어를 추상화해주는 역할을 합니다.

Android에서 제공되는 HAL는 다음 그림에 보이는 것처럼 오디오, 블루투스, 카메라, 이미지, 미디어 등 다양합니다.

 

HAL인터페이스는 C/C++ 기반으로 작성되며 모듈과 기기, 두 가지 요소로 구성된다고 합니다.

 

HAL 모듈 (hw_module_t)

모듈은 공유 라이브러리(.so 형식 파일)로 저장되는 패키징된 HAL 구현을 나타냅니다.

hardware/libhardware/include/hardware/hardware.h 헤더 파일은 모듈을 나타내는 구조체를 정의하며 버전, 이름 및 모듈 작성자와 같은 메타데이터를 포함합니다.

각 하드웨어별 HAL은 하드웨어의 추가 정보를 hw_module_t 구조체에 추가할 수 있습니다. 예를 들어, 다음 코드 스니펫과 같이 camera_module_t 구조체에는 hw_module_t 구조체와 기타 카메라 관련 함수 포인터가 포함됩니다.

typedef struct camera_module {
		hw_module_t common;
		int (*get_number_of_cameras)(void);
		int (*get_camera_info)(int camera_id, struct camera_info *info);
} camera_module_t;

 

HAL 기기 (hw_device_t)

기기는 제품의 하드웨어를 추상화합니다. 예를 들면 오디오 모듈에는 기본 오디오 기기, USB 오디오 기기, 블루투스 A2DP 오디오 기기가 포함될 수 있습니다.

모듈과 마찬가지로 각 유형의 기기는 하드웨어의 특정 기능 관련 함수 포인터를 포함하는 상세한 버전의 일반 구조체를 정의합니다.

예를 들어 다음 코드 스니펫과 같이 audio_hw_device_t 구조체 유형에는 오디오 기기 작업에 관한 함수 포인터가 포함됩니다.

struct audio_hw_device {
	struct hw_device_t common;

	/**
	 * used by audio flinger to enumerate what devices are supported by
	 * each audio_hw_device implementation.
	 *
	 * Return value is a bitmask of 1 or more values of audio_devices_t
	 */
	uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);
	...
};
typedef struct audio_hw_device audio_hw_device_t;

 


네이티브 C/C++ 라이브러리

 

네이티브 C/C++ 라이블러리 영역

 

ART 및 HAL와 같은 핵심 Android 시스템 구성 요소와 서비스가 C/C++로 작성된 네이티브 코드를 기반으로 빌드되었습니다. 

Android 플랫폼은 Java 프레임워크 API를 제공하여 일부 네이티브 라이브러리의 기능을 앱에 노출시킵니다. 그림에 보이는 네이티브 라이브러리 외에도 다양한 라이브러리를 Java 프레임워크 API를 통해 액세스할 수 있습니다.

추가로 C/C++ 코드가 필요한 앱을 개발하는 경우, Android NDK를 사용하여 네이티브 코드에서 직접 네이티브 플랫폼 라이브러리에 액세스할 수 있습니다.

C/C++ 라이브러리에 대한 더 자세한 내용은 다음 링크에서 참고하실 수 있습니다.

 


Android 런타임(ART)

 

ART 영역

Android 운영 체제 기반으로 만들어진 런타임 환경의 VM(Virtual Machine)입니다.

 

더보기

Java와 같은 컴파일 언어는 프로그래머가 작성한 코드(원시 코드)를 통째로 기계어로 변환한 뒤 기계를 통해 기계어를 실행하는 방식입니다.

Java의 경우 바이트코드로 컴파일되기 때문에, 이를 실행하기 위해서는 JVM(자바가상머신)이 필요하게 됩니다. 

그러나, 라이선스 문제로 인해 Android에서 JVM을 사용하지 않고 Dalvik과 ART를 별도로 개발하여 적용했다고 해요.

ART는 DEX파일(Android용으로 특별히 설계된 바이트코드 형식)을 실행하여 저용량 메모리 기기에서 여러 가상 머신을 실행하도록 작성되었습니다. 

Android 5(API 21) 이전에는 Dalvik이라는 가상 머신을 사용했다고 합니다. 만약 앱이 ART에서 제대로 실행된다면 Dalvik에서도 제대로 실행되지만, Dalvik에서 제대로 실행되는 앱이 ART에서 제대로 실행된다는 보장이 없습니다.

 


Java API 프레임워크

 

Java 프레임워크 영역

Android 앱 개발 시 사용되는 기능들의 집합체입니다.

기본적인 세트들은 모두 Java 언어로 작성되었으며, 이 API는 앱을 제작하는 데 필요한 빌딩 블록을 구성합니다.

 

콘텐츠 제공자(Content Providers) : 앱이 주소록 앱과 같은 다른 앱의 데이터에 접근하거나 자신의 데이터를 공유할 수 있도록 지원

뷰 시스템(View System) : 목록, 그리드, 텍스트, 버튼 등 앱의 UI를 빌드하는 데 사용

Manager : 각 주제에 맞는 기능을 사용할 수 있도록 지원

 


시스템 앱(System Apps)

 

시스템 앱 영역

Android는 이메일, 캘린더, 카메라 등 주요 앱 세트와 함께 제공됩니다.

시스템 앱은 사용자를 위한 앱으로 작동하는 동시에 개발자가 자신의 앱에서 액세스할 수 있는 주요 기능을 제공해주는 용도로도 작동합니다.

즉, 특별한 목적이 없는 경우 SMS 메시지 기능을 직접 빌드할 필요없이 이미 설치된 SMS앱을 호출하여 앱에 기능을 불어넣어줄 수 있는 것이죠.

 

 

 

 

 


👀Reference

플랫폼 아키텍처  ::  Android Developers

<안드로이드 플랫폼에 WiFi 디바이스 탑재 기법> 논문  ::  정우영/주영관/전중남

Dalvik, ART란?  ::  개발하는 두더지님 블로그

 

 

 

 

 

profile

전키의 방황일지

@전키

인테리어와 운동에 관심이 많은 개발자입니다 :)