VNDK 스냅샷 생성

VNDK 스냅샷은 Android 버전의 VNDK-core 및 VNDK-SP 라이브러리 집합입니다. vendor.img에 필요한 관련 VNDK 스냅샷이 system.img에 포함되어 있다면 시스템 파티션만 업그레이드할 수 있습니다.

공식 VNDK 스냅샷은 Android 빌드 서버에 자동으로 빌드되며 Android 소스 트리의 /prebuilts/vndk에 체크인됩니다. 개발 목적으로 VNDK 스냅샷을 로컬에서 빌드할 수 있습니다. VNDK 스냅샷은 arm, arm64, x86 및 x86_64 TARGET_ARCH 버전에 지원됩니다.

스냅샷 빌드

Android 빌드 서버는 다음과 같은 빌드 매개변수와 빌드 명령어를 사용하여 빌드 아티팩트와 VNDK 스냅샷 파일을 생성합니다.

빌드 매개변수

빌드 대상 이름은 vndk입니다. 빌드 대상 구성은 아래와 같습니다.

TARGET_PRODUCT TARGET_ARCH TARGET_ARCH_VARIANT
aosp_arm arm armv7-a-neon
aosp_arm64 arm64 armv8-a
aosp_x86 x86 x86
aosp_x86_64 x86_64 x86_64
  • TARGET_PRODUCT=aosp_$(TARGET_ARCH)
  • TARGET_BUILD_VARIANT=user
  • TARGET_ARCH는 일반 시스템 이미지(GSI) 대상 아키텍처(arm, arm64, x86, x86_64)와 동일합니다.
  • TARGET_ARCH_VARIANT. 스냅샷 v28(Android 9) 이상에는 위에 나열된 많이 사용되는 구성이 포함됩니다.

빌드 명령어

공식 스냅샷의 경우 Android 9 이상에는 VNDK 스냅샷을 빌드하여 $DIST_DIR에 출력하는 샘플 대상(vndk)이 vndk.mk에 포함되어 있습니다. 스냅샷 ZIP 파일은 android-vndk-$(TARGET_ARCH).zip 형식을 사용합니다. 예:

lunch aosp_TARGET_ARCH-user
make -j vndk dist [BOARD_VNDK_VERSION=current]

Android 빌드 서버는 build.sh 스크립트를 사용하여 다음 명령어로 지원되는 모든 아키텍처 버전을 빌드합니다.

DIST_DIR=dist_dir development/vndk/snapshot/build.sh

Android 버전의 VNDK 스냅샷은 그 버전의 출시 브랜치에서 생성됩니다.

로컬에서 빌드

개발 중에는 로컬 소스 트리에서 다음 명령어를 실행하여 VNDK 스냅샷을 빌드할 수 있습니다.

  • 지원되는 모든 아키텍처를 한 번에 빌드하려면 다음 빌드 스크립트(build.sh)를 실행합니다.
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
    
  • 하나의 특정 TARGET_ARCH를 빌드하려면 다음 명령어를 실행합니다.
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist
    

이에 대응하는 android-vndk-$(TARGET_ARCH).zip 파일이 $DIST_DIR 아래에 생성됩니다.

스냅샷 파일

VNDK 스냅샷에는 다음과 같은 파일이 포함됩니다.

  • VNDK-core 및 VNDK-SP 공유 라이브러리의 공급업체 변형
    • LL-NDK 공유 라이브러리는 이전 버전과 호환되므로 필요하지 않습니다.
    • 64비트 대상의 경우 TARGET_ARCHTARGET_2ND_ARCH 라이브러리가 모두 빌드되어 포함됩니다.
  • VNDK-core, VNDK-SP, LL-NDK 및 VNDK-private 라이브러리 목록은 [vndkcore|vndksp|llndk|vndkprivate].libraries.txt에서 볼 수 있습니다.
  • 라이선스 파일
  • module_paths.txt: 지정된 Android 소스 트리에서 출시된 소스가 GPL 프로젝트에 있는지 확인하는 데 필요한 모든 VNDK 라이브러리의 모듈 경로를 기록합니다.

지정된 VNDK 스냅샷 ZIP 파일 android-vndk-$(TARGET_ARCH).zip의 경우 사전 빌드된 VNDK 라이브러리는 ABI 비트율에 따라 arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT)라는 개별 디렉터리로 그룹화됩니다. 예를 들어 android-vndk-arm64.zip에서 64비트 라이브러리는 arch-arm64-armv8-a 아래에 있고 32비트 라이브러리는 arch-arm-armv8-a 아래에 있습니다. 아래 예는 arm64(TARGET_ARCH=arm64) VNDK 스냅샷 ZIP 파일(android-vndk-arm64.zip)의 디렉터리 구조를 보여줍니다.

VNDK 스냅샷 디렉터리 구조
그림 1. VNDK 스냅샷 디렉터리 구조(예)

공급업체 스냅샷을 위한 빌드

Android 11은 소스 트리의 Android 버전과 관계없이 vendor.img를 빌드할 수 있는 공급업체 스냅샷을 지원합니다. 기본 VNDK 스냅샷에는 기기에 설치한 다음 런타임 시 공급업체 C++ 바이너리에서 연결할 수 있는 공유 라이브러리 파일(.so)이 포함되어 있습니다. 이 VNDK 스냅샷을 기준으로 빌드하려면 헤더 파일, 내보낸 플래그 같은 추가 아티팩트가 필요합니다.

로컬 소스 트리에서 이러한 아티팩트를 VNDK 스냅샷과 함께 생성하려면 다음 명령어를 사용합니다.

VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh

이 명령어는 $DIST_DIR 아래에 android-vndk-$(TARGET_ARCH).zip 파일을 만듭니다. 아래 예는 빌드 아티팩트가 있는 arm64 VNDK 스냅샷 ZIP 파일입니다. 굵게 표시된 파일은 일반 VNDK 스냅샷(그림 1에 표시됨)에 새로 추가된 파일로, JSON 파일(각 라이브러리의 cflags 저장) 및 내보낸 모든 헤더 파일을 포함하고 있습니다.

android-vndk-arm64.zip
├── arch-arm64-armv8-a
│   └── shared
│       ├── vndk-core  -> *.so files, *.json files
│       └── vndk-sp    -> *.so files, *.json files
├── arch-arm-armv8-a   -> (same as arch-arm64-armv8-a)
├── configs            -> *.libraries.txt, module_paths.txt, module_names.txt
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files

VNDK 스냅샷 업로드

VNDK 스냅샷은 /prebuilts/vndk/vVER 아래의 소스 트리에 체크인됩니다. 여기에서 VER는 VNDK 스냅샷 버전(대응되는 Android 버전의 SDK 버전을 따름)과 동일합니다. 예를 들어 Android 8.1 VNDK 스냅샷은 버전 27입니다.

update.py 스크립트 사용

update.py 스크립트(/development/vndk/snapshot/update.py)는 사전 빌드된 VNDK 스냅샷을 소스 트리에 추가하는 프로세스를 자동화합니다. 그리고 빌드 아티팩트를 자동으로 감지하고 생성된 Android.bp에 연결된 속성을 적절하게 채웁니다. 이 스크립트는 다음과 같은 작업을 실행합니다.

  1. /prebuilts/vndk/vVER에서 repo start를 사용하여 새 Git 브랜치를 만듭니다.
  2. VNDK 스냅샷 빌드 아티팩트를 가져와 압축 해제합니다.
  3. gen_buildfiles.py를 실행하여 빌드 파일(Android.bp)을 자동 생성합니다.
  4. check_gpl_license.py를 실행하여 일반 공개 라이선스(GPL)에 따라 라이선스가 부여된 사전 빌드 라이브러리가 현재 소스 트리에서 출시된 소스를 포함하는지 확인합니다.
  5. git commit을 사용하여 새 변경사항을 커밋합니다.

로컬에서 빌드된 VNDK 스냅샷 사용

로컬에서 빌드된 VNDK 스냅샷을 사용할 수도 있습니다. --local 옵션이 지정된 경우 update.py 스크립트는 development/vndk/snapshot/build.sh에서 생성된 android-vndk-$(TARGET_ARCH).zip 파일이 있는 지정된 로컬 디렉터리(Android 빌드 서버 아님)에서 VNDK 스냅샷 빌드 아티팩트를 가져옵니다. --local 옵션을 사용하면 update.py 스크립트가 GPL 라이선스 확인 및 git commit 단계를 건너뜁니다.

문법:

python update.py VER --local local_path

/path/to/local/dir에서 로컬 빌드 아티팩트로 Android 8.1 VNDK 스냅샷을 업데이트하는 명령어의 예:

python update.py 27 --local /path/to/local/dir

로컬에서 빌드된 VNDK 스냅샷의 디렉터리 구조 예:

prebuilts/vndk
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (prebuilt libs)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   └── Android.bp         -> (VNDK modules with cflags)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   ├── x86                    -> (same as above)
│   ├── common
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (license file modules)
│   └── Android.bp             -> (*.libraries.30.txt modules)
└── (other VNDK versions)      -> (same as above)
VNDK_SNAPSHOT_BUILD_ARTIFACTS=true를 사용하여 아티팩트를 빌드한 경우 로컬 빌드 아티팩트가 자동으로 추가됩니다.

VNDK 스냅샷 설치

시스템 이미지는 빌드 시간에 BOARD_VNDK_VERSION, PRODUCT_EXTRA_VNDK_VERSIONSro.vndk.version에 있는 정보를 사용하여 VNDK 스냅샷 라이브러리를 설치합니다. 다음 옵션 중 하나를 사용하여, 사전 빌드된 VNDK 스냅샷 디렉터리(예: /prebuilts/vndk/v29 또는 /prebuilts/vndk/v30)에서 어떤 VNDK 스냅샷을 설치할지 제어할 수 있습니다.

  • 옵션 1: BOARD_VNDK_VERSION. 현재 공급업체 모듈을 빌드하는 데 스냅샷 모듈을 사용하고 공급업체 모듈에 필요한 스냅샷 모듈만 설치합니다.
  • 옵션 2: PRODUCT_EXTRA_VNDK_VERSIONS. 현재 공급업체 모듈과 관계없이 VNDK 스냅샷 모듈을 설치합니다. 그러면 PRODUCT_EXTRA_VNDK_VERSIONS에 나열된 사전 빌드된 VNDK 스냅샷을 빌드 시간에 다른 모듈에 연결하지 않고 설치합니다.

BOARD_VNDK_VERSION 설정

BOARD_VNDK_VERSION은 현재 공급업체 모듈이 빌드해야 하는 VNDK 버전을 보여줍니다. BOARD_VNDK_VERSION/prebuilts/vndk 디렉터리에 있는 사용 가능한 VNDK 스냅샷 버전이라면 BOARD_VNDK_VERSION에서 가리키는 VNDK 스냅샷이 설치됩니다. 디렉터리에 있는 VNDK 스냅샷을 사용할 수 없다면 빌드 오류가 발생합니다.

또한 BOARD_VNDK_VERSION을 정의하여 VNDK 모듈을 설치할 수도 있습니다. 공급업체 모듈은 빌드 시간에 BOARD_VNDK_VERSION에 정의된 VNDK 스냅샷 버전과 연결됩니다(이는 시스템 소스에 있는 현재 VNDK 모듈을 빌드하지 않음). 저장소에서 전체 소스 트리를 다운로드할 때 시스템과 공급업체 소스는 모두 동일한 Android 버전을 기반으로 합니다.

PRODUCT_EXTRA_VNDK_VERSIONS 설정

PRODUCT_EXTRA_VNDK_VERSIONS는 설치해야 하는 추가 VNDK 버전을 나열합니다. 일반적으로 현재 공급업체 파티션에 한 개의 VNDK 스냅샷만 있어도 충분합니다. 하지만 경우에 따라서는 여러 스냅샷을 하나의 시스템 이미지에 포함해야 할 수도 있습니다. 예를 들어 GSI에는 하나의 시스템 이미지로 여러 공급업체 버전을 지원하기 위한 여러 개의 스냅샷이 있습니다. PRODUCT_EXTRA_VNDK_VERSIONS를 설정하여 BOARD_VNDK_VERSION의 VNDK 버전 외에 VNDK 스냅샷 모듈을 설치할 수 있습니다.

PRODUCT_EXTRA_VNDK_VERSIONS에 구체적인 버전 목록이 있다면 빌드 시스템은 prebuilts/vndk 디렉터리에서 버전 목록의 사전 빌드된 스냅샷을 찾습니다. 빌드 시스템이 나열된 모든 스냅샷을 찾으면 각 VNDK APEX(out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER)에 그러한 스냅샷 파일을 설치합니다. 버전 누락은 빌드 오류를 야기합니다.

VNDK 모듈은 빌드 시간에 공급업체 모듈과 연결되지 않습니다. 하지만 설치된 VNDK 버전 중 하나가 공급업체 파티션의 공급업체 모듈에 필요한 경우 런타임 시 VNDK 모듈을 사용할 수 있습니다. PRODUCT_EXTRA_VNDK_VERSIONSBOARD_VNDK_VERSION이 정의된 경우에만 유효합니다.

PLATFORM_VNDK_VERSION

PLATFORM_VNDK_VERSION은 시스템 소스의 현재 VNDK 모듈과 관련된 VNDK 버전을 정의합니다. 값은 자동으로 설정됩니다.

  • 출시 전에는 PLATFORM_VNDK_VERSIONPLATFORM_VERSION_CODENAME으로 설정됩니다.
  • 출시 시점에는 PLATFORM_SDK_VERSIONPLATFORM_VNDK_VERSION에 복사됩니다.

Android 버전이 출시되면 현재 VNDK 라이브러리가 VNDK APEX(/system/apex/com.android.vndk.vVER)에 설치됩니다. 여기서 VERPLATFORM_VNDK_VERSION에 저장된 버전입니다.

BOARD_VNDK_VERSIONcurrent로 설정되면 PLATFORM_VNDK_VERSIONro.vndk.version에 저장되며 그렇지 않은 경우 BOARD_VNDK_VERSIONro.vndk.version에 저장됩니다. PLATFORM_VNDK_VERSION은 Android가 출시될 때 SDK 버전으로 설정됩니다. 출시 전에는 PLATFORM_VNDK_VERSION에 알파벳과 숫자로 이루어진 Android 코드명이 사용됩니다.

VNDK 버전 설정 요약

아래 표에는 VNDK 버전 설정이 요약되어 있습니다.

공급업체
빌드
보드
버전
SDK
출시
플랫폼
버전
버전
속성
설치 디렉터리
현재 VNDK 모듈 current 이전 CODE_NAME CODE_NAME /system/apex/com.android.vndk.vCODE_NAME
이후 SDK_VER SDK_VER /system/apex/com.android.vndk.vSDK_VER
사전 빌드된 스냅샷 모듈 스냅샷용
VNDK_VER
이전 또는 이후 CODE_NAME
또는 SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.vVNDK_VER
  • 보드 버전(BOARD_VNDK_VERSION). 공급업체 모듈에서 빌드해야 하는 VNDK 버전입니다. 공급업체 모듈이 현재 시스템 모듈과 연결될 수 있다면 current로 설정합니다.
  • 플랫폼 버전(PLATFORM_VNDK_VERSION). 현재 시스템 모듈이 빌드하고 있는 VNDK 버전입니다. BOARD_VNDK_VERSION이 현재 버전인 경우에만 빌드됩니다.
  • 버전 속성(ro.vndk.version). vendor.img의 바이너리와 라이브러리가 실행되는 데 필요한 VNDK 버전을 지정하는 속성입니다. vendor.img/vendor/default.prop에 저장됩니다.