VNDK 스냅샷 설계

시스템 이미지는 시스템 및 공급업체 이미지가 Android의 다른 버전에서 빌드된 경우에도 올바른 VNDK 라이브러리를 공급업체 이미지에 제공하기 위해 VNDK 스냅샷을 사용할 수 있습니다. VNDK 스냅샷을 생성하려면 VNDK 라이브러리를 스냅샷으로 캡처하고 버전 번호로 이를 표시해야 합니다. 공급업체 이미지는 공급업체 이미지의 모듈을 위한 필수 ABI를 제공하는 구체적인 VNDK와 링크될 수 있습니다. 하지만 동일한 VNDK 버전 내에서는 VNDK 라이브러리가 ABI 안정성을 지녀야 합니다.

VNDK 스냅샷 설계에는 현재 시스템 이미지에서 VNDK 스냅샷의 사전 빌드를 생성하거나 최신 Android 버전의 시스템 파티션에 이러한 사전 빌드 lib를 설치하기 위한 메서드가 포함됩니다.

VNDK 라이브러리 정보

Android 8.0에 도입된 HIDL-HAL은 시스템 및 공급업체 파티션에 별도의 업그레이드를 지원합니다. VNDK는 공급업체 코드를 링크할 수 있는 라이브러리 집합(VNDK-core, VNDK-SP 및 LL-NDK)을 정의하고 공급업체가 VNDK 집합에 없는 라이브러리를 사용하지 못하도록 차단합니다. 결과적으로는 시스템 이미지의 올바른 VNDK 집합을 공급업체 이미지에 제공하면 공급업체 이미지를 빌드하여 실행할 수 있습니다.

VNDK-core

VNDK-core 라이브러리 집합은 /system/lib[64]/vndk-${VER}에 설치되며, API 수준이 ${VER}와 같은 공급업체 프로세스의 경우에만 사용할 수 있습니다. 시스템 프로세스는 이러한 라이브러리를 사용할 수 없으며 대신 /system/lib[64]에 설치된 라이브러리를 사용해야 합니다. 각 프로세스의 엄격한 네임스페이스 제한 덕분에 VNDK-core 라이브러리는 이중 로드로부터 안전합니다.

VNDK-core에 라이브러리를 포함하려면 다음을 Android.bp에 추가합니다.

vendor_available: true,
vndk: {
    enabled: true,
},

VNDK-SP

VNDK-SP 라이브러리는 /system/lib[64]/vndk-sp-${VER}에 설치되며 (공급업체 파티션에 설치된 SP-HAL 라이브러리를 통해) 공급업체 프로세스 및 시스템 프로세스에서 사용할 수 있습니다. VNDK-SP 라이브러리는 이중 로드될 수 있습니다.

VNDK-SP에 라이브러리를 포함하려면 다음을 Android.bp에 추가합니다.

vendor_available: true,
vndk: {
    enabled: true,
    support_system_process: true,
},

LL-NDK

LL-NDK 라이브러리는 /system/lib[64]에 설치됩니다. 공급업체 모듈은 LL-NDK stub 라이브러리를 사용하여 LL-NDK 라이브러리의 미리 선택된 기호에 액세스할 수 있습니다. LL-NDK는 공급업체 모듈의 기존 버전이 LL-NDK 라이브러리의 새로운 버전을 사용할 수 있도록 역호환성 및 ABI-안정성을 지녀야 합니다. LL-NDK의 ABI-안정성 때문에 VNDK 스냅샷에는 기존 공급업체 이미지의 LL-NDK 라이브러리를 포함할 필요가 없습니다.

VNDK 스냅샷 정보

Android 8.1에는 소스 코드에서 빌드된 VNDK 라이브러리가 포함되었습니다. 하지만 Android의 최신 버전의 경우 각 VNDK 버전을 스냅샷으로 캡처하여 사전 빌드로 제공해야 기존 공급업체 이미지에 링크할 수 있습니다.

Android 9부터는 Android 소스 코드의 기존 버전과 관련된 VNDK-core 및 VNDK-SP 디렉터리의 스냅샷이 최소 1개 이상 Android의 새 버전에 포함됩니다. 빌드 시 필수 스냅샷은 /system/lib[64]/vndk-${VER}/system/lib[64]/vndk-sp-${VER}(공급업체 파티션에서 사용할 수 있는 디렉터리)에 설치됩니다. 여기서 ${VER}는 VNDK 스냅샷의 버전 이름을 나타내는 문자열 변수입니다.

VNDK 스냅샷 라이브러리는 VNDK 버전마다 다를 수 있으므로 VNDK 스냅샷에는 etc/ld.config.${VER}.txt, /etc/llndk.libraries.${VER}.txt, /etc/vndksp.libraries.${VER}.txt로 설치된 링커 네임스페이스 구성도 포함됩니다.

예시: 시스템 및 공급업체 이미지 업그레이드

스냅샷은 필요 없으며, VNDK 스냅샷의 추가 구성 없이 빌드 가능합니다.

예시: 시스템 이미지만 업그레이드

시스템 이미지의 공급업체 이미지와 관련된 VNDK 스냅샷과 링커 네임스페이스 구성 파일을 포함해야 합니다. 링커 네임스페이스 구성 파일은 /system/lib[64]/vndk-${VER}/system/lib[64]/vndk-sp-${VER} 에서 VNDK 라이브러리를 검색하도록 자동으로 구성됩니다.

그림 1. 시스템만 업그레이드

예시: 시스템 이미지 업그레이드, 사소한 공급업체 이미지 변경

VNDK 스냅샷에 관한 공급업체 이미지를 빌드하는 기능은 아직 지원되지 않습니다. 따라서 원래 소스 코드와 별개의 공급업체 이미지를 빌드한 다음 이전 예시에서 설명한 것처럼 시스템 이미지를 업그레이드해야 합니다.

VNDK 스냅샷 아키텍처

Android 9 시스템 이미지가 Android 8.1 공급업체 이미지와 호환되도록 하려면 아래에 보이는 것처럼 Android 8.1 공급업체 이미지와 일치하는 VNDK 스냅샷을 Android 9 시스템 이미지와 함께 제공해야 합니다.

그림 2. VNDK 스냅샷 아키텍처

VNDK 스냅샷 설계에는 다음과 같은 방식이 포함됩니다.

  • VNDK-core 및 VNDK-SP 라이브러리의 스냅샷 생성. Android 9에는 최신 VNDK 빌드의 스냅샷을 생성하는 데 사용할 수 있는 스크립트가 포함됩니다. 이 스크립트는 현재 소스에서 빌드된 /system/lib[64]/vndk-28/system/lib[64]/vndk-sp-28의 모든 라이브러리를 VNDK 스냅샷으로 묶습니다. 여기에서 28은 Android 9의 VNDK 버전입니다. 스냅샷에는 링커 네임스페이스 구성 파일 /etc/ld.config.28.txt, /etc/llndk.libraries.28.txt, /etc/vndksp.libraries.28.txt도 포함됩니다. 생성된 스냅샷은 최신 Android 버전(Android 9 이상)과 함께 사용됩니다.
  • 스냅샷에서 사전 빌드된 VNDK-core 및 VNDK-SP 라이브러리를 생성. Android 9에서는 VNDK 스냅샷에 사전 빌드된 VNDK-core 라이브러리 집합과 VNDK-SP 라이브러리 집합은 물론 링커 네임스페이스 구성 파일까지 포함됩니다. 빌드 시 설치될 VNDK 스냅샷 버전의 목록을 제공하면 시스템 이미지가 VNDK 스냅샷 라이브러리를 /system/lib[64]/vndk-${VER}/system/lib[64]/vndk-sp-${VER} 디렉터리에 설치하고 이 VNDK 스냅샷의 링커 네임스페이스 구성 파일을 /etc 디렉터리에 설치합니다.

VNDK 버전 관리

각 Android 버전에는 1개의 VNDK 스냅샷만 있으며 SDK 버전이 VNDK 버전으로 사용됩니다(즉, VNDK 버전에 Android 8.1의 27과 같은 정수 번호가 있음). VNDK 버전은 Android 버전이 출시되면 수정됩니다. 공급업체 파티션에서 사용하는 VNDK 버전은 런타임에 읽을 수 있는 ro.vndk.version 속성에 자동 저장됩니다. 이어서 이 버전은 일부 라이브러리의 공급업체 VNDK 버전을 식별하고 네임스페이스 구성의 VNDK 스냅샷 버전을 식별하는 데 사용됩니다.

VNDK 라이브러리 빌드

make vndk 명령어는 종속 항목 및 네임스페이스 구성 파일을 비롯하여 vndk: { enabled: true, … }를 포함하는 라이브러리를 빌드합니다. BOARD_VNDK_VERSION := current가 설정되어 있으면 make 명령어로 이 라이브러리를 빌드합니다.

이 빌드는 스냅샷에서 VNDK 라이브러리를 설치하지 않으므로 설치된 VNDK 라이브러리가 ABI-안정성을 지니지 않습니다. 하지만 Android 버전이 출시되면 최신 VNDK 버전의 ABI가 수정됩니다. 현재 시점에서는 모든 ABI 중단이 빌드 오류이므로 Android 버전의 패치로 인해 VNDK 라이브러리의 ABI가 변경되면 안 됩니다.