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_ARCH
와TARGET_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 스냅샷 디렉터리 구조](https://source.android.google.cn/static/docs/core/architecture/images/vndk_snapshot_directory.png?authuser=4&hl=ko)
공급업체 스냅샷을 위한 빌드
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
에 연결된 속성을 적절하게 채웁니다. 이 스크립트는 다음과 같은 작업을 실행합니다.
/prebuilts/vndk/vVER
에서repo start
를 사용하여 새 Git 브랜치를 만듭니다.- VNDK 스냅샷 빌드 아티팩트를 가져와 압축 해제합니다.
gen_buildfiles.py
를 실행하여 빌드 파일(Android.bp
)을 자동 생성합니다.check_gpl_license.py
를 실행하여 일반 공개 라이선스(GPL)에 따라 라이선스가 부여된 사전 빌드 라이브러리가 현재 소스 트리에서 출시된 소스를 포함하는지 확인합니다.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_VERSIONS
및 ro.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_VERSIONS
는 BOARD_VNDK_VERSION
이 정의된 경우에만 유효합니다.
PLATFORM_VNDK_VERSION
PLATFORM_VNDK_VERSION
은 시스템 소스의 현재 VNDK 모듈과 관련된 VNDK 버전을 정의합니다. 값은 자동으로 설정됩니다.
- 출시 전에는
PLATFORM_VNDK_VERSION
이PLATFORM_VERSION_CODENAME
으로 설정됩니다. - 출시 시점에는
PLATFORM_SDK_VERSION
이PLATFORM_VNDK_VERSION
에 복사됩니다.
Android 버전이 출시되면 현재 VNDK 라이브러리가 VNDK APEX(/system/apex/com.android.vndk.vVER
)에 설치됩니다. 여기서 VER
은 PLATFORM_VNDK_VERSION
에 저장된 버전입니다.
BOARD_VNDK_VERSION
이 current
로 설정되면 PLATFORM_VNDK_VERSION
은 ro.vndk.version
에 저장되며 그렇지 않은 경우 BOARD_VNDK_VERSION
은 ro.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
에 저장됩니다.