부록 B. 새 하드웨어에 대한 지원 추가
임베디드 시스템에 Android에서 아직 지원되지 않는 하드웨어가 포함되어 있는 경우가 있습니다. AOSP 내부에서 수행할 수 있는 작업 중 일부는 모듈식이지만, 새로운 유형의 하드웨어에 대한 지원을 추가하려면 안드로이드의 일부 내부에 대한 지식이 필요하므로 더 까다롭습니다. 이 부록에서는 자체 하드웨어 유형을 지원하기 위해 Android의 다양한 계층을 확장하는 방법을 보여줍니다.
참고
실제로 시스템에 새로운 유형의 하드웨어에 대한 지원을 추가하는 데 관심이 없을 수도 있지만, 안드로이드 스택의 다양한 계층이 실제로 어떻게 결합되는지에 대한 복잡한 세부 사항을 이해하려는 경우 이 부록이 유용할 수 있습니다.
또한 이 부록에서는 2.3/진저브레드 코드베이스를 사용하여 수정하는 방법을 설명하지만, 수정되는 메커니즘과 Java 코드는 4.2/젤리빈에서도 매우 유사합니다. 주요 차이점이 있는 경우 본문에서 이를 지적할 것입니다.
기본 사항
2장에서 설명한 것처럼 표준 "바닐라 Linux"와 달리 Android는 하드웨어에서 작동하기 위해 적절한 장치 드라이버 이상의 것이 필요합니다. 실제로 안드로이드 코어에서 지원하는 각 하드웨어 유형에 대한 API를 정의하는 새로운 하드웨어 추상화 계층(HAL)을 정의합니다. 하드웨어 구성 요소가 Android와 올바르게 인터페이스하려면 해당 하드웨어 유형에 지정된 API를 준수하는 해당 하드웨어 '모듈'(커널 모듈과는 무관)이 있어야 합니다.
일반적으로 Android에서 지원하는 각 하드웨어 유형에는 해당 시스템 서비스 및 HAL 정의가 있습니다. 조명 서비스 및 조명 HAL 정의가 있습니다. 와이파이 서비스 및 와이파이 HAL 정의가 있습니다. 전원 관리, 위치, 센서 등도 마찬가지입니다. 그림 2-3은 안드로이드의 하드웨어 지원의 전체 아키텍처를 보여줍니다. 물론 이러한 시스템 서비스의 대부분은 앞서 설명한 대로 일반적으로 시스템 서버 내에서 실행됩니다.
HAL 모듈에는 일반적으로 두 가지 범주가 있습니다: 명시적으로 로드되는 모듈( dlopen())과 동적 링커에 의해 자동으로 로드되는 모듈(모두 libhardware_legacy.so에 링크되어 있으므로). 전자를 위한 API는 hardware/libhardware/include/hardware/에, 후자를 위한 API는 hardware/libhardware_legacy/include/hardware_legacy/에 있습니다. 안드로이드가 "레거시"에서 벗어나고 있는 추세인 것 같습니다. 이러한 .so 파일과 실제 드라이버 사이의 인터페이스는 /dev항목 등을 통해 제조업체가 지정할 수 있습니다. 안드로이드는 그것에 신경 쓰지 않습니다. 적절한 HAL .so 모듈을 찾는 데만 신경을 씁니다.
제가 자주 받는 질문 중 하나는 "안드로이드에서 나만의 하드웨어 유형에 대한 지원을 추가하려면 어떻게 해야 하나요?"입니다. 이를 설명하기 위해 opersys-hal-hw 유형을 만들고 이 HAL 유형을 구현하는 코드를 매우 기본적인 원형 ...