공급업체 네이티브 개발 키트(VNDK)

공급업체 네이티브 개발 키트(VNDK)는 오로지 공급업체의 HAL 구현만을 위한 라이브러리 집합입니다. VNDK는 system.img에 포함되며 런타임 시 공급 업체 코드에 동적으로 링크됩니다.

VNDK여야 하는 이유

Android 8.0 이상에서는 공급업체 파티션을 원래대로 유지한 상태에서 시스템 파티션을 최신 버전으로 업그레이드할 수 있는 프레임워크 전용 업데이트를 지원합니다. 이는 여러 시기에 빌드된 바이너리가 서로 호환될 수 있어야 함을 의미합니다. VNDK는 Android의 여러 출시에 걸친 API/ABI 변경사항에 적용됩니다.

프레임워크 전용 업데이트에는 다음과 같은 문제가 있습니다.

  • 프레임워크 모듈 및 공급업체 모듈 간의 종속 항목. Android 8.0 이전에는 양 측의 모듈을 상대 측의 모듈과 링크할 수 있었습니다. 하지만 공급업체 모듈의 종속 항목에 따라 프레임워크 모듈 개발에 원치 않는 제한이 적용되었습니다.
  • AOSP 라이브러리 확장. Android 8.0 이상에서는 시스템 파티션이 표준 GSI(일반 시스템 이미지)로 교체되면 모든 Android 기기가 CTS를 전달해야 합니다. 하지만 공급업체가 성능을 높이거나 HIDL 구현에 추가 기능을 더하기 위해 AOSP 라이브러리를 확장하는 과정에서 시스템 파티션을 표준 GSI로 플래시하면 공급업체의 HIDL 구현이 중단될 수 있습니다. (이러한 중단을 방지하기 위한 가이드라인은 VNDK 확장 프로그램을 참조하세요.)

이러한 문제를 해결하기 위해 Android 8.0에는 VNDK(이 섹션에서 설명함), HIDL, hwbinder, 기기 트리 오버레이, sepolicy 오버레이와 같은 여러 기법을 도입합니다.

VNDK 리소스

이 섹션에는 다음과 같은 VNDK 리소스가 포함되어 있습니다.

  • VNDK 개념(아래)에서는 프레임워크 공유 라이브러리, 동일 프로세스 HAL(SP-HAL), VNDK 용어에 관해 설명합니다.
  • VNDK 확장 프로그램은 공급업체별 변경사항을 카테고리로 분류합니다. 예를 들어 공급업체 모듈이 의존하는 확장 기능을 포함하는 라이브러리는 공급업체 파티션에 복사해야 하지만 ABI와 호환되지 않은 변경사항은 금지됩니다.
  • VNDK 빌드 시스템 지원은 VNDK와 관련된 빌드 시스템 구성 및 모듈 정의 구문을 설명합니다.
  • VNDK 정의 도구는 소스 트리를 Android 8.0 이상으로 이전하는 데 도움이 됩니다.
  • 링커 네임스페이스를 사용하면 공유 라이브러리 링크를 세부적으로 제어할 수 있습니다.
  • 디렉터리, 규칙 및 sepolicy는 Android 8.0 이상을 실행하는 기기의 디렉터리 구조, VNDK 규칙, 관련 sepolicy를 정의합니다.
  • VNDK 디자인 프레젠테이션은 Android 8.0 이상에 사용되는 기본 VDNK 개념을 보여줍니다.

VNDK 개념

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

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

다음 섹션에서는 VNDK가 공급업체 및 동일 프로세스 HAL(SP-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.so, libvulkan.so
  • 사용 가능한 VNDK 라이브러리(VNDK)는 두 번 복사해도 안전한 프레임워크 공유 라이브러리입니다. 프레임워크 모듈공급업체 모듈은 자체 사본과 링크될 수 있습니다. 프레임워크 공유 라이브러리는 다음 기준을 충족하는 경우에만 사용 가능한 VNDK 라이브러리가 될 수 있습니다.
    • 프레임워크에서 IPC를 송수신하지 않습니다.
    • ART 가상 머신과 관련이 없습니다.
    • 불안정한 파일 형식으로 파일/파티션을 읽고 쓰지 않습니다.
    • 법적 검토가 필요한 특수 소프트웨어 라이선스가 없습니다.
    • 코드 소유자가 공급업체 사용에 반대하지 않습니다.
  • 프레임워크 전용 라이브러리(FWK 전용)는 위에서 언급한 카테고리에 속하지 않는 프레임워크 공유 라이브러리입니다. 이 라이브러리의 특징은 다음과 같습니다.
    • 프레임워크 내부 구현 세부정보로 간주됩니다.
    • 공급업체 모듈에서 액세스하면 안 됩니다.
    • 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 }를 지정합니다. vendor_available: false도 지정되면 이 라이브러리는 VNDK-SP-Private이라고 하며 SP-HALS에 표시되지 않습니다.

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

  • libft2.so (Renderscript)
  • libmediandk.so (Renderscript)

VNDK 용어

  • 모듈이란 공유 라이브러리 또는 실행 프로그램을 의미합니다.
  • 프로세스실행 프로그램에서 생성되는 운영체제 작업입니다.
  • 프레임워크 한정 용어란 시스템 파티션과 관련된 개념을 의미합니다.
  • 공급업체 한정 용어란 공급업체 파티션과 관련된 개념을 의미합니다.

예:

  • 프레임워크 실행 파일/system/bin 또는 /system/xbin의 실행 파일을 의미합니다.
  • 프레임워크 공유 라이브러리/system/lib[64] 하위의 공유 라이브러리를 의미합니다.
  • 프레임워크 모듈프레임워크 공유 라이브러리프레임워크 실행 파일 모두를 의미합니다.
  • 프레임워크 프로세스프레임워크 실행 파일에서 생성된 프로세스입니다(예: /system/bin/app_process).
  • 공급업체 실행 파일/vendor/bin의 실행 파일을 의미합니다.
  • 공급업체 공유 라이브러리/vendor/lib[64] 하위의 공유 라이브러리를 의미합니다.
  • 공급업체 모듈공급업체 실행 프로그램공급업체 공유 라이브러리를 의미합니다.
  • 공급업체 프로세스공급업체 실행 프로그램에서 생성된 프로세스입니다(예:
  • /vendor/bin/android.hardware.camera.provider@2.4-service).

VNDK 버전 관리

Android 9에서는 VNDK 공유 라이브러리가 버전 관리됩니다.

  • ro.vndk.version 시스템 속성이 /vendor/default.prop에 자동으로 추가됩니다.
  • VNDK 공유 라이브러리는 /system/lib[64]/vndk-${ro.vndk.version}에 설치됩니다.
  • VNDK-SP 공유 라이브러리는 /system/lib[64]/vndk-sp-${ro.vndk.version}에 설치됩니다.
  • 동적 링커 구성 파일은 /system/etc/ld.config.${ro.vndk.version}.txt에 설치됩니다.

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

  • BOARD_VNDK_VERSIONcurrent다른 경우 BOARD_VNDK_VERSION 사용
  • BOARD_VNDK_VERSIONcurrent같은 경우:
    • PLATFORM_VERSION_CODENAMEREL인 경우 PLATFORM_SDK_VERSION을 사용(예: 28).
    • 아니면 PLATFORM_VERSION_CODENAME을 사용(예: P).

기기 업그레이드

Android 8.x 기기가 BOARD_VNDK_VERSION 없이 빌드되어 VNDK 런타임 시행을 사용 중지한 경우 Android 9로 업그레이드되는 동안 PRODUCT_USE_VNDK_OVERRIDE := falseBoardConfig.mk에 추가할 수 있습니다.

PRODUCT_USE_VNDK_OVERRIDEfalse이면 ro.vndk.lite 속성이 /vendor/default.prop에 자동으로 추가되고 값은 true가 됩니다. 따라서 동적 링커는 /system/etc/ld.config.vndk_lite.txt에서 링커 네임스페이스 구성을 로드하여 SP-HAL 및 VNDK-SP만 격리합니다.

Android 7.0 이하 기기를 Android 9로 업그레이드하려면 PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := falseBoardConfig.mk에 추가합니다.

공급업체 테스트 도구 모음(VTS)

Android 9 공급업체 테스트 도구 모음(VTS)은 비어 있지 않은 ro.vndk.version 속성을 필요로 합니다. 새로 출시된 기기와 업그레이드하는 기기 모두 ro.vndk.version을 정의해야 합니다. 일부 VNDK 테스트 사례(예를 들어 VtsVndkFilesTestVtsVndkDependencyTest)는 ro.vndk.version 속성을 사용하여 일치하는 사용 가능한 VNDK 라이브러리 데이터 세트를 로드합니다.

ro.product.first_api_level 속성이 27보다 크면 ro.vndk.lite 속성이 정의되어서는 안 됩니다. 새로 출시된 Android 9 기기에 ro.vndk.lite이 정의되어 있으면 VtsTreblePlatformVersionTest는 실패합니다.

문서 이력

이 섹션에서는 VNDK 문서에 대한 변경사항을 추적합니다.

Android 9 변경사항

  • VNDK 버전 관리 섹션을 추가함
  • VTS 섹션을 추가함
  • 일부 VNDK 카테고리의 이름이 변경됨
    • LL-NDK-Indirect의 이름이 LL-NDK-Private으로 변경됨
    • VNDK-Indirect의 이름이 VNDK-Private으로 변경됨
    • VNDK-SP-Indirect-Private의 이름이 VNDK-SP-Private으로 변경됨
    • VNDK-SP-Indirect가 제거됨

Android 8.1 변경사항

  • SP-NDK 라이브러리가 LL-NDK 라이브러리로 병합됨
  • RS 네임스페이스 섹션에서 libui.solibft2.so로 교체함. libui.so를 포함한 것은 오류였음
  • libGLESv3.solibandroid_net.so를 LL-NDK 라이브러리에 추가함
  • libion.so를 VNDK-SP 라이브러리에 추가함
  • LL-NDK 라이브러리에서 libstdc++.so를 삭제하고, 대신 libc++.so를 사용하세요. 일부 버전의 독립형 도구 모음은 -lstdc++를 기본 링커 플래그에 추가할 수 있음. 기본값을 사용 중지하기 위해 -nodefaultlibs -lc -lm -ldlLDFLAGS에 추가함
  • LL-NDK에서 VNDK-SP 라이브러리로 libz.so를 이동함. 일부 구성에서는 libz.so가 LL-NDK로 유지될 수 있지만, 눈에 띄는 차이는 없어야 함