VINTF 객체는 기기 매니페스트 및 프레임워크 매니페스트 파일(XML)의 데이터를 가져와 집계합니다. 두 매니페스트 모두 형식을 공유하지만 모든 요소가 둘 다에 적용되지는 않습니다. 스키마에 관한 자세한 내용은 매니페스트 파일 스키마를 참고하세요.
기기 매니페스트
기기에서 제공하는 기기 매니페스트는 공급업체 매니페스트와 ODM 매니페스트로 구성됩니다.
- 공급업체 매니페스트는 SoC에 일반적인 HAL, SELinux 정책 버전 등을 지정합니다.
device/VENDOR/DEVICE/manifest.xml
의 Android 소스 트리에 공급업체 매니페스트를 배치하는 것이 좋습니다. 하지만 여러 프래그먼트 파일을 사용해도 됩니다. 자세한 내용은 매니페스트 프래그먼트와 프래그먼트에서 DM 생성을 참고하세요. - ODM 매니페스트는 ODM 파티션의 제품과 관련된 HAL을 나열합니다.
VINTF 객체는 다음과 같은 순서로 ODM 매니페스트를 로드합니다.
SKU
가 정의된 경우(여기서SKU
는ro.boot.product.hardware.sku
속성 값)/odm/etc/vintf/manifest_SKU.xml
/odm/etc/vintf/manifest.xml
SKU
가 정의된 경우/odm/etc/manifest_SKU.xml
/odm/etc/manifest.xml
- 공급업체 매니페스트는 공급업체 파티션의 제품과 관련된 HAL을 나열합니다.
VINTF 객체는 다음과 같은 순서로 공급업체 매니페스트를 로드합니다.
SKU
가 정의된 경우(여기서SKU
는ro.boot.product.vendor.sku
속성 값)/vendor/etc/vintf/manifest_SKU.xml
/vendor/etc/vintf/manifest.xml
- VINTF 객체는 다음과 같은 순서로 기기 매니페스트를 로드합니다.
- 공급업체 매니페스트가 있으면 다음을 결합합니다.
- 공급업체 매니페스트
- 선택적 공급업체 매니페스트 프래그먼트
- 선택적 ODM 매니페스트
- 선택적 ODM 매니페스트 프래그먼트
- 그렇지 않으면 ODM 매니페스트가 존재하는 경우 ODM 매니페스트를 선택적 ODM 매니페스트 프래그먼트와 결합합니다.
/vendor/manifest.xml
(레거시, 프래그먼트 없음)
참고:
- 레거시 기기에서는 레거시 공급업체 매니페스트와 ODM 매니페스트가 사용됩니다. ODM 매니페스트는 레거시 공급업체 매니페스트를 완전히 재정의할 수 있습니다.
- Android 9로 출시된 기기에서는 ODM 매니페스트가 공급업체 매니페스트와 결합됩니다.
- 매니페스트 목록을 결합하는 경우 목록에 나중에 표시되는 매니페스트는 목록에 일찍 표시되는 매니페스트의 태그를 재정의할 수 있습니다. 단, 나중에 표시되는 매니페스트의 태그에 속성
override="true"
가 있어야 합니다. 예를 들어 ODM 매니페스트는 공급업체 매니페스트의 일부<hal>
태그를 재정의할 수 있습니다. 아래override
속성 문서를 참고하세요.
- 공급업체 매니페스트가 있으면 다음을 결합합니다.
이 설정을 사용하면 보드가 같은 여러 제품이 공통 HAL을 제공하는 같은 공급업체 이미지를 공유하되 제품별 HAL을 지정하는 서로 다른 ODM 이미지를 사용하도록 사용 설정할 수 있습니다.
다음은 공급업체 매니페스트의 예입니다.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="2.0" type="device" target-level="1"> <hal> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.4</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> <instance>proprietary/0</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.0</version> <version>2.0</version> <interface> <name>INfc</name> <instance>nfc_nci</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <fqname>@2.0::INfc/default</fqname> </hal> <hal> <name>android.hardware.drm</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ICryptoFactory</name> <instance>default</instance> </interface> <interface> <name>IDrmFactory</name> <instance>default</instance> </interface> <fqname>@1.1::ICryptoFactory/clearkey</fqname> <fqname>@1.1::IDrmFactory/clearkey</fqname> </hal> <hal format="aidl"> <name>android.hardware.light</name> <version>1</version> <fqname>ILights/default</fqname> </hal> <hal format="aidl"> <name>android.hardware.power</name> <version>2</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> <hal format="native"> <name>EGL</name> <version>1.1</version> </hal> <hal format="native"> <name>GLES</name> <version>1.1</version> <version>2.0</version> <version>3.0</version> </hal> <sepolicy> <version>25.0</version> </sepolicy> </manifest>
다음은 ODM 매니페스트의 예입니다.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device"> <!-- camera 3.4 in vendor manifest is ignored --> <hal override="true"> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.5</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> </interface> </hal> <!-- NFC is declared to be disabled --> <hal override="true"> <name>android.hardware.nfc</name> <transport>hwbinder</transport> </hal> <hal> <name>android.hardware.power</name> <transport>hwbinder</transport> <version>1.1</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> </manifest>
다음은 OTA 패키지의 기기 매니페스트의 예입니다.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device" target-level="1"> <!-- hals ommited --> <kernel version="4.4.176"> <config> <key>CONFIG_ANDROID</key> <value>y</value> </config> <config> <key>CONFIG_ARM64</key> <value>y</value> </config> <!-- other configs ommited --> </kernel> </manifest>
자세한 내용은 기기 매니페스트 개발을 참고하세요.
프레임워크 매니페스트
프레임워크 매니페스트 파일은 시스템 매니페스트, 제품 매니페스트, system_ext 매니페스트로 구성됩니다.
- Google에서 제공하는 시스템 매니페스트는 수동으로 생성되고
/system/libhidl/manifest.xml
의 Android 소스 트리에 있습니다. - 기기에서 제공하는 제품 매니페스트는 제품 파티션에 설치된 모듈에서 처리하는 HAL을 나열합니다.
- 기기에서 제공하는 system_ext 매니페스트는 다음을 나열합니다.
- system_ext 파티션에 설치된 모듈에서 처리하는 HAL
- VNDK 버전
- 시스템 SDK 버전
기기 매니페스트와 마찬가지로 여러 프래그먼트 파일을 사용할 수 있습니다. 자세한 내용은 매니페스트 프래그먼트를 참고하세요.
다음은 프레임워크 매니페스트의 예입니다.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="framework"> <hal> <name>android.hidl.allocator</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IAllocator</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.memory</name> <transport arch="32+64">passthrough</transport> <version>1.0</version> <interface> <name>IMapper</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.manager</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IServiceManager</name> <instance>default</instance> </interface> </hal> <hal> <name>android.frameworks.sensorservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISensorManager</name> <instance>default</instance> </interface> </hal> <hal max-level="5"> <name>android.frameworks.schedulerservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISchedulingPolicyService</name> <instance>default</instance> </interface> </hal> <vendor-ndk> <version>27</version> </vendor-ndk> <system-sdk> <version>27</version> </system-sdk> </manifest>
매니페스트 프래그먼트
Android 10 이상에서는 매니페스트 항목을 빌드 시스템의 HAL 모듈에 연결할 수 있습니다. 이렇게 하면 훨씬 쉽게 HAL 모듈을 빌드 시스템에 조건부로 포함할 수 있습니다.
예
Android.bp
또는 Android.mk
파일에서 vintf_fragments
를 원하는 모듈에 추가합니다. 예를 들어 HAL의 구현(my.package.foo@1.0-service-bar
)으로 모듈을 수정할 수 있습니다.
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
manifest_foo.xml
이라는 파일에서 이 모듈의 매니페스트를 만듭니다. 빌드 시 이 매니페스트가 기기에 추가됩니다. 여기에 항목을 추가하는 것은 기기의 기본 매니페스트에 항목을 추가하는 것과 같습니다.
이렇게 하면 클라이언트가 인터페이스를 사용할 수 있고 VTS는 어떤 HAL 구현이 기기에 있는지 식별할 수 있습니다. 일반 매니페스트가 실행하는 모든 작업을 이 매니페스트도 실행합니다.
아래 예에서는 vendor
또는 odm
파티션에 설치되는 android.hardware.foo@1.0::IFoo/default
를 구현합니다. system
, product
또는 system_ext
파티션에 설치하는 경우에는 device
유형 대신 framework
유형을 사용합니다.
<manifest version="1.0" type="device"> <hal format="hidl"> <name>android.hardware.foo</name> <transport>hwbinder</transport> <fqname>@1.0::IFoo/default</fqname> </hal> </manifest>
매니페스트 파일 스키마
이 섹션에서는 이러한 XML 태그의 의미를 설명합니다. 일부 '필수' 태그는 Android 소스 트리의 소스 파일에서 누락될 수 있으며 빌드 시 assemble_vintf
에 의해 작성될 수 있습니다. 필수 태그는 기기의 상응하는 파일에 존재해야 합니다.
?xml
- 선택사항입니다. XML 파서에만 정보를 제공합니다.
manifest.version
- 필수사항입니다. 이 매니페스트의 메타 버전입니다. 매니페스트에서 예상되는 요소를 설명합니다. XML 버전과 무관합니다.
manifest.type
- 필수사항입니다. 이 매니페스트의 유형입니다. 기기 매니페스트 파일의 경우
device
값이 있고 프레임워크 매니페스트 파일의 경우framework
값이 있습니다. manifest.target-level
- 기기 매니페스트의 경우 필수사항입니다. 호환되도록 이 기기 매니페스트를 타겟팅한 프레임워크 호환성 매트릭스(FCM) 버전을 지정합니다. 기기의 배송 FCM 버전이라고도 불립니다.
manifest.hal
- 선택사항입니다. 반복할 수 있습니다.
format
속성에 따른 단일 HAL(GL과 같은 HIDL 또는 네이티브)입니다. manifest.hal.format
- 선택사항입니다. 값은 다음 중 하나일 수 있습니다.
hidl
: HIDL HAL입니다. 이는 기본값입니다.aidl
: AIDL HAL입니다. 매니페스트 메타 버전 2.0 이상에서만 유효합니다.native
: 네이티브 HAL입니다.
manifest.hal.max-level
- 선택사항입니다. 프레임워크 매니페스트에서만 유효합니다. 설정된 경우 프레임워크 매니페스트의 타겟 FCM 버전보다 최대 수준이 낮은 HAL이 사용 중지됩니다.
manifest.hal.override
- 선택사항입니다. 값은 다음 중 하나일 수 있습니다.
true
: 동일한<name>
및 주 버전으로 다른<hal>
요소를 재정의합니다. 이<hal>
요소에<version>
또는<fqname>
이 없으면<hal>
요소는 이 HAL을 사용 중지로 선언합니다.false
: 동일한<name>
및 주 버전으로 다른<hal>
요소를 재정의하지 않습니다.
manifest.hal.name
- 필수사항입니다. HAL의 정규화된 패키지 이름입니다. 여러 HAL 항목에서 동일한 이름을 사용할 수 있습니다. 예:
android.hardware.camera
(HIDL 또는 AIDL HAL)GLES
(네이티브 HAL, 이름만 필요)
manifest.hal.transport
manifest.hal.format == "hidl"
의 경우 필수사항입니다. 다른 경우에 존재하면 안 됩니다. 패키지의 인터페이스가 서비스 관리자에서 쿼리되었을 때 어떤 전송이 사용되는지 명시합니다. 값은 다음 중 하나일 수 있습니다.hwbinder
: 바인더화된 모드passthrough
: 패스 스루 모드
manifest.hal.format == "aidl"
의 경우 선택사항입니다. 다른 경우에 존재하면 안 됩니다. 인터페이스가 원격으로 제공될 때 어떤 전송이 사용되는지 명시합니다. 명시되는 값은 다음과 같습니다.inet
: Inet 소켓
manifest.hal.transport.ip
와manifest.hal.transport.port
를 사용해야 합니다.manifest.hal.transport.arch
passthrough
의 경우 필수사항이며hwbinder
에 있으면 안 됩니다. 제공되고 있는 패스 스루 서비스의 비트성을 설명합니다. 값은 다음 중 하나일 수 있습니다.32
: 32비트 모드64
: 64비트 모드32+64
: 둘 다
manifest.hal.transport.ip
inet
의 경우 필수사항이며 다른 경우에 있으면 안 됩니다. 원격 인터페이스가 제공되고 있는 IP 주소를 표시합니다.manifest.hal.transport.port
inet
의 경우 필수사항이며 다른 경우에 있으면 안 됩니다. 원격 인터페이스가 제공되고 있는 포트를 표시합니다.manifest.hal.version
- 선택사항입니다. 반복할 수 있습니다. 매니페스트의
hal
태그 버전입니다.
HIDL 및 네이티브 HAL의 경우 형식은MAJOR.MINOR
입니다. 예는hardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
또는system/hardware/interfaces
를 참고하세요.
HIDL 및 네이티브 HAL은 고유한 주 버전을 표현하는 이상 여러 개의 버전 필드를 사용할 수 있으며 주 버전당 한 개의 부 버전만 제공됩니다. 예를 들어 3.1 및 3.2는 공존할 수 없지만 1.0 및 3.4는 공존이 가능합니다. 이는override="true"
가 아니라면 이름이 동일한 모든hal
요소에 적용됩니다.<version>
값은<fqname>
과 연결되지 않습니다.<fqname>
에 버전이 있기 때문입니다.
AIDL HAL의 경우<version>
은 Android 11 이하를 실행하는 기기에 없어야 합니다.<version>
은 Android 12 이상을 실행하는 기기에서 단일 정수여야 합니다.(package, interface, instance)
튜플별로<version>
은 1개 이하여야 합니다. 없으면 기본값은1
입니다.<fqname>
에 버전이 없으므로<version>
값은 동일한<hal>
에 있는 모든<fqname>
과 연결됩니다. manifest.hal.interface
- 필수사항입니다. 중복 없이 반복할 수 있습니다. 인스턴스 이름이 있는 패키지에 인터페이스를 명시합니다.
<hal>
에 여러<interface>
요소가 있을 수 있으며 이름은 고유해야 합니다. manifest.hal.interface.name
- 필수사항입니다. 인터페이스의 이름입니다.
manifest.hal.interface.instance
- 필수사항입니다. 반복할 수 있습니다. 인터페이스의 인스턴스 이름입니다. 인터페이스에 여러 인스턴스를 보유할 수 있지만 중복된
<instance>
요소는 보유할 수 없습니다. manifest.hal.fqname
- 선택사항입니다. 반복할 수 있습니다. 이름
manifest.hal.name
으로 HAL의 인스턴스를 지정하는 대체 방법입니다.- HIDL HAL의 경우 형식은
@MAJOR.MINOR::INTERFACE/INSTANCE
입니다. - AIDL HAL의 경우 형식은
INTERFACE/INSTANCE
입니다.
- HIDL HAL의 경우 형식은
manifest.sepolicy
- 필수사항입니다. 모든 sepolicy 관련 항목을 포함합니다.
manifest.sepolicy.version
- 기기 매니페스트의 경우 필수사항입니다. SELinux 버전을 선언합니다. 형식은
SDK_INT.PLAT_INT
입니다. manifest.vendor-ndk
- 필수사항이며 반복할 수 있습니다. 프레임워크 매니페스트의 경우 필수사항입니다. 기기 매니페스트에 있으면 안 됩니다. 여러
<vendor-ndk>
항목은<version>
이 서로 달라야 합니다. 프레임워크에서 제공하는 VNDK 스냅샷 집합을 설명합니다. manifest.vendor-ndk.version
- 필수사항입니다. VNDK 스냅샷의 버전을 나타내는 양의 정수입니다.
manifest.vendor-ndk.library
- 선택사항이며 중복 없이 반복할 수 있습니다. 이 VNDK 공급업체 스냅샷과 관련하여 프레임워크에 의해 제공되는 VNDK 라이브러리 집합을 설명합니다. 값은 라이브러리의 파일 이름입니다(예: 접두사
lib
와 접미사.so
가 포함된libjpeg.so
). 경로 구성요소가 허용되지 않습니다. manifest.system-sdk.version
- 선택사항이며 중복 없이 반복할 수 있습니다. 프레임워크 매니페스트에 의해서만 사용됩니다. 프레임워크가 공급업체 앱에 제공하는 시스템 SDK 버전 집합을 설명합니다.
manifest.kernel
- 선택사항입니다. 커널에 관한 정적 정보를 설명합니다.
manifest.kernel.target-level
- 선택사항입니다. 커널 분기를 설명합니다. 값이 없는 경우 기본값은
manifest.target-level
입니다.manifest.target-level
이상이어야 합니다. 자세한 내용은 커널 일치 규칙을 참고하세요.