매니페스트

VINTF 객체는 기기 매니페스트프레임워크 매니페스트 파일(XML)의 데이터를 가져와 집계합니다. 두 매니페스트 모두 형식을 공유하지만 모든 요소가 둘 다에 적용되지는 않습니다. 스키마에 관한 자세한 내용은 매니페스트 파일 스키마를 참고하세요.

기기 매니페스트

기기에서 제공하는 기기 매니페스트는 공급업체 매니페스트와 ODM 매니페스트로 구성됩니다.

  • 공급업체 매니페스트는 SoC에 일반적인 HAL, SELinux 정책 버전 등을 지정합니다. device/VENDOR/DEVICE/manifest.xml의 Android 소스 트리에 공급업체 매니페스트를 배치하는 것이 좋습니다. 하지만 여러 프래그먼트 파일을 사용해도 됩니다. 자세한 내용은 매니페스트 프래그먼트프래그먼트에서 DM 생성을 참고하세요.
  • ODM 매니페스트는 ODM 파티션의 제품과 관련된 HAL을 나열합니다. VINTF 객체는 다음과 같은 순서로 ODM 매니페스트를 로드합니다.
    1. SKU가 정의된 경우(여기서 SKUro.boot.product.hardware.sku 속성 값) /odm/etc/vintf/manifest_SKU.xml
    2. /odm/etc/vintf/manifest.xml
    3. SKU가 정의된 경우 /odm/etc/manifest_SKU.xml
    4. /odm/etc/manifest.xml
  • 공급업체 매니페스트는 공급업체 파티션의 제품과 관련된 HAL을 나열합니다. VINTF 객체는 다음과 같은 순서로 공급업체 매니페스트를 로드합니다.
    1. SKU가 정의된 경우(여기서 SKUro.boot.product.vendor.sku 속성 값) /vendor/etc/vintf/manifest_SKU.xml
    2. /vendor/etc/vintf/manifest.xml
  • VINTF 객체는 다음과 같은 순서로 기기 매니페스트를 로드합니다.
    1. 공급업체 매니페스트가 있으면 다음을 결합합니다.
      1. 공급업체 매니페스트
      2. 선택적 공급업체 매니페스트 프래그먼트
      3. 선택적 ODM 매니페스트
      4. 선택적 ODM 매니페스트 프래그먼트
    2. 그렇지 않으면 ODM 매니페스트가 존재하는 경우 ODM 매니페스트를 선택적 ODM 매니페스트 프래그먼트와 결합합니다.
    3. /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 소켓
Inet 연결 정보를 더 지정하려면 manifest.hal.transport.ipmanifest.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입니다.
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 이상이어야 합니다. 자세한 내용은 커널 일치 규칙을 참고하세요.