공급업체 기본 개발 키트(VNDK) 개요

VNDK(Vendor Native Development Kit) 는 dlopen 런타임 시 공급업체 또는 제품 파티션의 다른 라이브러리 또는 바이너리에서 사용하는 라이브러리 세트입니다.

왜 VNDK인가?

AOSP는 공급업체 파티션이 변경되지 않은 상태에서 시스템 파티션을 최신 프레임워크 버전으로 업그레이드할 수 있는 프레임워크 전용 업데이트를 허용합니다. 서로 다른 시간에 빌드되었음에도 불구하고 각 파티션의 바이너리는 서로 작동할 수 있어야 합니다.

프레임워크 전용 업데이트에는 다음과 같은 과제가 포함됩니다.

  • 프레임워크 모듈과 공급업체 모듈 간의 종속성 . Android 8.0 이전에는 공급업체와 시스템 파티션의 모듈이 서로 링크될 수 있었습니다. 그러나 공급업체 모듈의 종속성은 프레임워크 모듈 개발에 원치 않는 제한을 부과했습니다.
  • AOSP 라이브러리에 대한 확장 . Android는 시스템 파티션이 표준 GSI(일반 시스템 이미지)로 대체될 때 모든 Android 기기가 CTS를 통과하도록 요구합니다. 그러나 공급업체가 성능을 향상시키거나 HIDL 구현을 위한 추가 기능을 추가하기 위해 AOSP 라이브러리를 확장함에 따라 표준 GSI로 시스템 파티션을 플래시하면 공급업체의 HIDL 구현이 중단될 수 있습니다. 이러한 파손 방지에 대한 지침은 VNDK 확장 을 참조하십시오.

이러한 문제를 해결하기 위해 Android에는 VNDK(이 섹션에서 설명), HIDL , hwbinder, 장치 트리 오버레이 및 sepolicy 오버레이와 같은 여러 기능이 포함되어 있습니다.

VNDK 관련 용어

VNDK 관련 문서에서는 다음 용어를 사용합니다.
  • 모듈 은 공유 라이브러리 또는 실행 파일을 참조합니다. 모듈은 빌드 시간 종속성을 만듭니다.
  • 프로세스 는 실행 파일에서 생성된 운영 체제 작업입니다. 프로세스는 런타임 종속성을 만듭니다.
  • 프레임워크 한정 용어는 system 파티션과 관련이 있습니다.
    • 프레임워크 실행 파일은 /system/bin 또는 /system/xbin 의 실행 파일을 참조합니다.
    • 프레임워크 공유 라이브러리/system/lib[64] 아래의 공유 라이브러리를 참조합니다.
    • 프레임워크 모듈 은 프레임워크 공유 라이브러리와 프레임워크 실행 파일을 모두 참조합니다.
    • 프레임워크 프로세스/system/bin/app_process 와 같은 프레임워크 실행 파일에서 생성된 프로세스입니다.
  • 공급업체 자격 조건은 vendor 파티션과 관련이 있습니다.
    • 공급업체 실행 파일은 /vendor/bin 에 있는 실행 파일을 참조합니다.
    • 공급업체 공유 라이브러리/vendor/lib[64] 아래의 공유 라이브러리를 참조합니다.
    • 공급업체 모듈 은 공급업체 실행 파일과 공급업체 공유 라이브러리를 모두 참조합니다.
    • 공급업체 프로세스/vendor/bin/android.hardware.camera.provider@2.4-service 와 같이 공급업체 실행 파일에서 생성된 프로세스입니다.

VNDK 개념

이상적인 Android 8.0 이상 세계에서 프레임워크 프로세스는 공급업체 공유 라이브러리를 로드하지 않고 모든 공급업체 프로세스는 공급업체 공유 라이브러리(및 프레임워크 공유 라이브러리의 일부)만 로드하며 프레임워크 프로세스와 공급업체 프로세스 간의 통신은 HIDL 및 하드웨어에 의해 관리됩니다. 접합재.

이러한 세계에는 프레임워크 공유 라이브러리의 안정적인 공개 API가 공급업체 모듈 개발자에게 충분하지 않을 수 있는 가능성이 포함되며(API는 Android 릴리스 간에 변경될 수 있음) 공급업체 프로세스에서 프레임워크 공유 라이브러리의 일부에 액세스할 수 있어야 합니다. 또한 성능 요구 사항으로 인해 손상이 발생할 수 있으므로 응답 시간이 중요한 일부 HAL은 다르게 처리해야 합니다.

다음 섹션에서는 VNDK가 공급업체 및 SP-HAL(Same-Process HAL)을 위한 프레임워크 공유 라이브러리를 처리하는 방법을 자세히 설명합니다.

공급업체용 프레임워크 공유 라이브러리

이 섹션에서는 공급업체 프로세스에 액세스할 수 있는 공유 라이브러리를 분류하는 기준에 대해 설명합니다. 여러 Android 릴리스에서 공급업체 모듈을 지원하는 두 가지 접근 방식이 있습니다.

  1. 프레임워크 공유 라이브러리의 ABI/API를 안정화합니다 . 새 프레임워크 모듈과 이전 공급업체 모듈은 동일한 공유 라이브러리를 사용하여 메모리 공간과 저장소 크기를 줄일 수 있습니다. 고유한 공유 라이브러리는 여러 이중 로드 문제도 방지합니다. 그러나 안정적인 ABI/API를 유지하기 위한 개발 비용이 높고 모든 프레임워크 공유 라이브러리에서 내보낸 모든 ABI/API를 안정화하는 것은 비현실적입니다.
  2. 이전 프레임워크 공유 라이브러리를 복사 합니다. 바인더, 소켓, 파이프, 공유 메모리, 공유 파일 및 시스템 속성을 포함하되 이에 국한되지 않는 프레임워크 모듈 및 공급업체 모듈 간의 통신을 위한 모든 메커니즘으로 정의되는 사이드 채널에 대한 강력한 제한이 함께 제공됩니다. 통신 프로토콜이 고정되고 안정적이지 않으면 통신이 없어야 합니다(예: hwbinder를 통한 HIDL). 공유 라이브러리를 이중 로드하면 문제가 발생할 수도 있습니다. 예를 들어, 새 라이브러리에 의해 생성된 객체가 이전 라이브러리에서 함수로 전달되면 이러한 라이브러리가 객체를 다르게 해석할 수 있으므로 오류가 발생할 수 있습니다.

공유 라이브러리의 특성에 따라 다른 접근 방식이 사용됩니다. 결과적으로 프레임워크 공유 라이브러리는 세 가지 하위 범주로 분류됩니다.

  • LL-NDK 라이브러리 는 안정적인 것으로 알려진 프레임워크 공유 라이브러리 입니다. 개발자는 API/ABI 안정성을 유지하기 위해 최선을 다하고 있습니다.
    • LL-NDK에는 libEGL.so , libGLESv1_CM.so , libGLESv2.so , libGLESv3.so , libandroid_net.so , libc.so , libdl.so , liblog.so , libm.so , libnativewindow.so 라이브러리가 포함되어 libneuralnetworks.so , libsync.so , libvndksupport.solibvulkan.so ,
  • 적격 VNDK 라이브러리(VNDK) 는 두 번 복사해도 안전한 프레임워크 공유 라이브러리 입니다. 프레임워크 모듈공급업체 모듈 은 자체 복사본과 연결할 수 있습니다. 프레임워크 공유 라이브러리는 다음 기준을 충족하는 경우에만 적격 VNDK 라이브러리가 될 수 있습니다.
    • 프레임워크와 IPC를 주고받지 않습니다.
    • ART 가상 머신과 관련이 없습니다.
    • 불안정한 파일 형식의 파일/파티션을 읽거나 쓰지 않습니다.
    • 법적 검토가 필요한 특수 소프트웨어 라이선스가 없습니다.
    • 코드 소유자는 공급업체 사용에 이의가 없습니다.
  • 프레임워크 전용 라이브러리(FWK-ONLY) 는 위에서 언급한 범주에 속하지 않는 프레임워크 공유 라이브러리 입니다. 다음 라이브러리:
    • 프레임워크 내부 구현 세부 정보로 간주됩니다.
    • 공급업체 모듈에서 액세스하면 안 됩니다.
    • ABI/API가 불안정하고 API/ABI 호환성이 보장되지 않습니다.
    • 복사되지 않습니다.

동일 프로세스 HAL(SP-HAL)

동일 프로세스 HAL ( SP-HAL )은 공급업체 공유 라이브러리 로 구현되고 프레임워크 프로세스 에 로드되는 미리 결정된 HAL 세트입니다. SP-HAL은 링커 네임스페이스에 의해 격리됩니다(공유 라이브러리에 표시되는 라이브러리 및 기호 제어). SP-HAL은 LL-NDKVNDK-SP 에만 의존해야 합니다.

VNDK-SP는 적격 VNDK 라이브러리의 미리 정의된 하위 집합입니다. VNDK-SP 라이브러리는 VNDK-SP 라이브러리를 프레임워크 프로세스에 이중 로드해도 문제가 발생하지 않도록 주의 깊게 검토됩니다. SP-HAL과 VNDK-SP는 모두 Google에서 정의합니다.

다음 라이브러리는 승인된 SP-HAL입니다.

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

VNDK-SP 라이브러리는 Android.bp 파일에 vndk: { support_system_process: true } 를 지정합니다. vndk: {private:true} 도 지정되면 이러한 라이브러리를 VNDK-SP-Private 라고 하며 SP-HALS에 표시되지 않습니다.

다음은 RS 예외(FWK-ONLY-RS)가 있는 프레임워크 전용 라이브러리입니다 .

  • libft2.so (렌더스크립트)
  • libmediandk.so (렌더스크립트)

VNDK 버전 관리

VNDK 공유 라이브러리의 버전은 다음과 같습니다.

  • ro.vndk.version 시스템 속성은 /vendor/default.prop 에 자동으로 추가됩니다.
  • VNDK 및 VNDK-SP 공유 라이브러리는 VNDK apex com.android.vndk.v${ro.vndk.version} 으로 설치되고 /apex/com.android.vndk.v${ro.vndk.version} 에 마운트됩니다.

ro.vndk.version 의 값은 아래 알고리즘에 의해 선택됩니다.

  • BOARD_VNDK_VERSIONcurrent같지 않으면 BOARD_VNDK_VERSION 을 사용하십시오.
  • BOARD_VNDK_VERSIONcurrent같은 경우:
    • PLATFORM_VERSION_CODENAMEREL 인 경우 PLATFORM_SDK_VERSION (예: 28 )을 사용합니다.
    • 그렇지 않으면 PLATFORM_VERSION_CODENAME (예: P )을 사용하십시오.

공급업체 테스트 제품군(VTS)

Android VTS(Vendor Test Suite)는 비어 있지 않은 ro.vndk.version 속성을 요구합니다. 새로 출시된 장치와 업그레이드 장치 모두 ro.vndk.version 을 정의해야 합니다. 일부 VNDK 테스트 사례(예: VtsVndkFilesTestVtsVndkDependencyTest )는 ro.vndk.version 속성을 사용하여 일치하는 VNDK 라이브러리 데이터 세트를 로드합니다.