HAL은 커널 드라이버 파일의 다른 이름이 아닙니다
- Framework의 요청
정해진 HAL 인터페이스의 메서드를 호출합니다.
Binder를 통한 IPC 또는 해당 구현 방식의 호출
- HAL 서비스
요청을 검사하고 장치별 처리 방법으로 바꿉니다.
open·read·ioctl 등 해당 드라이버의 UAPI 사용
- Linux 드라이버
장치의 레지스터·인터럽트·버퍼를 관리합니다.
하드웨어 프로토콜에 맞춰 접근
- 센서
측정 결과나 상태를 제공합니다.
화살표는 요청이 전달되는 관계입니다. 모든 HAL이 직접 장치 파일을 열거나 모든 서비스가 같은 프로세스에서 실행되는 것은 아닙니다.
구형 hw_module_t 예제, HIDL 예제, AIDL HAL 예제는 서로 다른 인터페이스 세대입니다. 기존 보드에 어느 경로가 남아 있는지 확인한 뒤 읽어야 합니다. AIDL을 쓰는 것만으로 임의의 vendor·system 조합이 자동 호환되는 것은 아닙니다. AIDL HAL
제공하는 인터페이스와 요구하는 인터페이스를 맞춥니다
VINTF의 manifest는 기기나 framework가 제공하는 인터페이스를 기술하고, compatibility matrix는 상대 쪽에 요구하는 조건을 기술합니다. 실제 서비스의 등록 이름·instance·버전과 선언이 맞아야 합니다. 파일 하나에 이름을 적었다고 서비스 프로세스가 자동으로 만들어지는 것은 아닙니다.
| 확인 단계 | 확인하는 사실 |
|---|---|
| 인터페이스 정의 | 메서드·타입·안정성 규칙과 버전을 확인합니다. |
| 빌드 | 구현 바이너리·의존 라이브러리·설정 파일이 제품 이미지에 들어갔는지 확인합니다. |
| init 서비스 | 서비스가 어떤 사용자·그룹·class로 시작되는지 확인합니다. |
| VINTF 선언 | 제공·요구하는 HAL과 실제 instance 이름을 비교합니다. |
| SELinux와 장치 권한 | 서비스가 등록·검색·장치 접근을 할 권한이 있는지 확인합니다. |
property 값은 환경 변수와 다르게 관리됩니다
Android property는 시스템의 property 서비스를 통해 관리하는 이름·값 체계입니다. 프로세스의 shell 환경 변수를 바꾸는 것과 다릅니다. 내부 값은 문자열로 저장하지만 property_contexts에서 타입과 보안 문맥을 지정할 수 있습니다. 어떤 프로세스가 읽거나 쓸 수 있는지는 정책으로 제한합니다. property 이름·타입·접근 규칙
getprop vendor.demo.mode
getprop ro.boot.verifiedbootstate첫 이름은 설명용으로 만든 property이며 실제 제품에 반드시 존재하지 않습니다. 두 번째는 부팅 시 전달된 verified boot 상태를 확인하는 데 쓰입니다. getprop는 값을 읽는 명령입니다. 값이 있다고 해서 이를 읽는 서비스가 존재하거나 그 서비스가 변경을 실시간 반영한다는 보장은 없습니다.
| 접두사 또는 파일 | 역할 |
|---|---|
ro. | 일반적으로 한 번 설정한 뒤 다시 쓰지 않는 property 규칙과 관련됩니다. 보안 비밀을 저장하라는 뜻은 아닙니다. |
persist. | 재부팅 뒤에도 유지할 값인지와 관련됩니다. 이름만 붙이면 모든 부팅 시점에 읽을 수 있는 것은 아닙니다. |
vendor. / persist.vendor. | vendor가 소유하는 property 이름 공간을 나타냅니다. 접근 허가를 자동으로 부여하는 접두사는 아닙니다. |
property_contexts | 이름을 SELinux property type과 값 타입에 대응시킵니다. rc의 서비스 시작 조건과는 다른 정보입니다. |
권한 오류를 먼저 숨기면 원인을 잃습니다
장치를 열지 못한다면 장치 노드가 만들어졌는지, Unix 소유자·그룹·모드가 맞는지, SELinux가 어느 접근을 거부했는지 차례로 확인합니다. 권한을 넓히거나 SELinux를 끄면 특정 현상이 사라질 수 있지만 제품의 올바른 권한 설계를 확인한 결과는 아닙니다.
Property를 바꿨는데 동작이 달라지지 않으면 값을 설정한 주체의 권한, property의 실제 값, 이를 읽는 코드와 읽는 시점을 각각 확인합니다. 서비스가 시작 때 한 번만 읽는 값이라면 property 변경만으로 실행 중인 상태가 바뀌지 않을 수 있습니다. SELinux 구현과 정책 확인