https://chunky.tistory.com/26
해당 게시글을 참고하여 공부하며 쓴 글입니다.


각종 드라이버와 전원 관리모듈 존재
-> 하드웨어적인 설정을 리눅스 커널에서 관리
커널이 담당하는 일

리눅스 커널이 드라이버를 통해 하드웨어와 연결한다면, HAL는 하드웨어를 추상화해주는 역할을 함.
Android에서 제공되는 HAL는 다음 그림처럼 오디오, 블루투스, 카메라, 이미지, 미디어 등 다양함.

HAL 인터페이스는 C/C++ 기반으로 작성되며 모듈과 기기, 두 가지 요소로 구성됨.
HAL 모듈 (hw_module_t)
ex) 다음 코드 스니펫과 같이 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)
기기는 제품의 하드웨어를 추상화
ex) 오디오 모듈에는 기본 오디오 기기, USB 오디오 기기, 블루투스 A2DP 오디오 기기가 포함
모듈과 마찬가지로 각 유형의 기기는 하드웨어의 특정 기능 관련 함수 포인터를 포함하는 상세한 버전의 일반 구조체를 정의
ex) 다음 코드 스니펫과 같이 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;


Android 운영 체제 기반으로 만들어진 런타임 환경의 VM
ART는 DEX파일(Android용으로 특별히 설계된 바이트코드 형식)을 실행하여 저용량 메모리 기기에서 여러 가상 머신을 실행하도록 작성

Android 앱 개발 시 사용되는 기능들의 집합체
기본적인 세트들은 모두 Java 언어로 작성, 이 API는 앱을 제작하는 데 필요한 빌딩 블록 구성

Android는 이메일, 캘린더, 카메라 등 주요 앱 세트와 함께 제공
시스템 앱은 사용자를 위한 앱으로 작동하는 동시에 개발자가 자신의 앱에서 액세스할 수 있는 주요 기능을 제공해주는 용도로도 작동
즉, 특별한 목적이 없는 경우 SMS 메시지 기능을 직접 빌드할 필요없이 이미 설치된 SMS 앱을 호출하여 앱에 기능을 불어넣어줄 수 있음.