Zrzut VNDK to zestaw bibliotek VNDK-core i VNDK-SP na potrzeby wydania na Androida.
Uaktualnić można tylko partycję systemową, jeśli system.img
zawiera odpowiednią migawkę VNDK wymaganą przez vendor.img
.
Oficjalne zrzuty dysku VNDK są kompilowane automatycznie na serwerze kompilacji Androida i przesyłane do /prebuilts/vndk
w drzewie kodu źródłowego Androida. Na potrzeby programowania możesz tworzyć zrzuty VNDK lokalnie. Zrzuty VNDK są obsługiwane w przypadku wersji arm, arm64, x86 i x86_64 TARGET_ARCH
.
Tworzenie zrzutów
Serwer kompilacji Androida generuje artefakty kompilacji i pliki migawek VNDK za pomocą tych parametrów i komend kompilacji.
Parametry tworzenia
Nazwa docelowego pakietu kompilacji to vndk
. Konfiguracja docelowego procesu kompilacji jest widoczna poniżej.
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
to to samo co Generic System Image (GSI) target archs (arm
,arm64
,x86
,x86_64
).TARGET_ARCH_VARIANT
. W przypadku wersji snapshot 28 (Android 9) i nowszych uwzględnia popularne konfiguracje wymienione powyżej.
Polecenia kompilacji
W przypadku oficjalnych wersji snapshotów Android 9 i nowszych zawiera przykładowy obiekt docelowy (vndk
) w vndk.mk
, który tworzy i wyprowadza snapshot VNDK do $DIST_DIR
. Plik ZIP z migawką ma format android-vndk-$(TARGET_ARCH).zip
.
Przykład:
lunch aosp_TARGET_ARCH-user
make -j vndk dist [BOARD_VNDK_VERSION=current]
Serwer kompilacji Androida używa skryptu build.sh
do kompilowania wszystkich obsługiwanych wersji architektury za pomocą tego polecenia.
DIST_DIR=dist_dir development/vndk/snapshot/build.sh
Zrzut VNDK dla danej wersji Androida jest generowany z gałęzi wydania tej wersji.
Kompilowanie lokalnie
Podczas tworzenia możesz tworzyć zrzuty VNDK z lokalnego drzewa źródłowego za pomocą tych poleceń.
- Aby skompilować wszystkie obsługiwane architektury naraz, uruchom ten skrypt kompilacji (
build.sh
).cd $ANDROID_BUILD_TOP
development/vndk/snapshot/build.sh
- Aby utworzyć jeden konkretny
TARGET_ARCH
, wykonaj te polecenia.lunch aosp_TARGET_ARCH-user
m -j vndk dist
Odpowiedni plik android-vndk-$(TARGET_ARCH).zip
zostanie utworzony w folderze $DIST_DIR
.
Pliki zrzutu
Zrzut ekranu VNDK zawiera te pliki.
- Wersja biblioteki udostępnionej VNDK-core i VNDK-SP od konkretnego dostawcy.
- Biblioteki współużytkowane LL-NDK nie są potrzebne, ponieważ są zgodne wstecz.
- W przypadku celów 64-bitowych są kompilowane i uwzględniane biblioteki
TARGET_ARCH
iTARGET_2ND_ARCH
.
- Listę bibliotek VNDK-core, VNDK-SP, LL-NDK i VNDK-private znajdziesz na stronie
[vndkcore|vndksp|llndk|vndkprivate].libraries.txt
. - pliki licencji,
module_paths.txt
. Zapisuje ścieżki modułów dla wszystkich bibliotek VNDK, co jest potrzebne do sprawdzenia, czy źródła projektów GPL zostały opublikowane w danym drzewie źródłowym Androida.
W przypadku danego pliku ZIP z migawką VNDK (android-vndk-$(TARGET_ARCH).zip
) wstępnie skompilowane biblioteki VNDK są pogrupowane w oddzielne katalogi o nazwach arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT)
według typu ABI. Na przykład w przypadku android-vndk-arm64.zip
biblioteki 64-bitowe są umieszczane w folderze arch-arm64-armv8-a
, a biblioteki 32-bitowe – w folderze arch-arm-armv8-a
. Przykład poniżej przedstawia strukturę katalogu pliku ZIP zrzutu VNDK (android-vndk-arm64.zip
) dla architektury arm64 (TARGET_ARCH=arm64
).

Tworzenie zrzutów dostawcy
Android 11 obsługuje migawki dostawców, które umożliwiają kompilowanie vendor.img
niezależnie od wersji Androida w drzewie źródłowym. Domyślny snapshot VNDK zawiera pliki biblioteki współdzielonej (.so
), które można zainstalować na urządzeniach, a następnie połączyć z binarnymi plikami C++ dostawcy w czasie wykonywania. Aby skompilować na podstawie tego snapshotu VNDK, potrzebujesz dodatkowych artefaktów, takich jak pliki nagłówka i wyeksportowane flagi.
Aby wygenerować takie artefakty (wraz ze snapshotem VNDK) z lokalnego drzewa źródeł, użyj tego polecenia.
VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh
To polecenie tworzy pliki android-vndk-$(TARGET_ARCH).zip
w katalogu $DIST_DIR
. Przykład poniżej to plik ZIP z archiwum VNDK dla arm64 z elementami kompilacji. Pliki wyróżnione pogrubioną czcionką to nowo dodane pliki do normalnego snapshotu VNDK (pokazany na rysunku 1). Obejmują one pliki JSON (przechowujące cflags
każdej biblioteki) oraz wszystkie wyeksportowane pliki nagłówka.
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
Przesyłanie zrzutów VNDK
Snapshoty VNDK są sprawdzane w drzewie źródłowym w folderze /prebuilts/vndk/vVER
, gdzie VER
jest równe wersji snapshotu VNDK (która odpowiada wersji pakietu SDK odpowiedniej wersji Androida). Na przykład snapshot VNDK Androida 8.1 ma wersję 27.
Używanie skryptu update.py
Skrypt update.py
(/development/vndk/snapshot/update.py
) automatyzuje proces dodawania do drzewa źródeł gotowego snapshota VNDK. Automatycznie wykrywa artefakty kompilacji i odpowiednio wypełnia powiązane właściwości w wygenerowanym pliku Android.bp
. Skrypt wykonuje te zadania:
- W
/prebuilts/vndk/vVER
używarepo start
do utworzenia nowej gałęzi Git. - Pobiera i rozpakowuje artefakty kompilacji zrzutu VNDK.
- Uruchamia
gen_buildfiles.py
, aby automatycznie wygenerować pliki kompilacji (Android.bp
). - Uruchomienie
check_gpl_license.py
w celu sprawdzenia, czy gotowe biblioteki objęte licencją General Public License (GPL) mają źródła opublikowane w bieżącym drzewie źródłowym. - Używa
git commit
do zatwierdzania nowych zmian.
Korzystanie z lokalnie utworzonych zrzutów VNDK
Możesz też użyć migawek VNDK utworzonych lokalnie. Gdy określona jest opcja --local
, skrypt update.py
pobiera artefakty kompilacji z migawki VNDK z określonego lokalnego katalogu (zamiast z serwera kompilacji Androida), który zawiera pliki android-vndk-$(TARGET_ARCH).zip
wygenerowane z pliku development/vndk/snapshot/build.sh
. W przypadku opcji --local
skrypt update.py
pomija sprawdzanie licencji GPL i krok git commit
.
Składnia:
python update.py VER --local local_path
Przykład polecenia służącego do aktualizowania snapshotu VNDK w Androidzie 8.1 za pomocą artefaktów lokalnej kompilacji w pliku /path/to/local/dir
:
python update.py 27 --local /path/to/local/dir
Przykładowa struktura katalogu zrzutu VNDK utworzonego lokalnie:
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
.
Instalowanie zrzutów VNDK
Obraz systemu instaluje biblioteki zrzutów VNDK w czasie kompilacji, korzystając z informacji w plikach BOARD_VNDK_VERSION
, PRODUCT_EXTRA_VNDK_VERSIONS
i ro.vndk.version
.
Możesz określić, które zrzuty stanu VNDK mają być instalowane z katalogów gotowych zrzutów stanu VNDK (np. /prebuilts/vndk/v29
lub /prebuilts/vndk/v30
) za pomocą jednej z tych opcji.
- Opcja 1:
BOARD_VNDK_VERSION
. Użyj modułów zrzutu do tworzenia bieżących modułów dostawcy i zainstaluj tylko te moduły zrzutu, które są wymagane dla modułów dostawcy. - Opcja 2:
PRODUCT_EXTRA_VNDK_VERSIONS
. Zainstaluj moduły zrzutu VNDK bez względu na obecne moduły dostawcy. Spowoduje to zainstalowanie wstępnie utworzonych snapshotów VNDK wymienionych wPRODUCT_EXTRA_VNDK_VERSIONS
bez ich łączenia z żadnymi innymi modułami w momencie kompilacji.
Ustaw BOARD_VNDK_VERSION
BOARD_VNDK_VERSION
pokazuje wersję VNDK, której wymagają obecne moduły dostawców do kompilacji. Jeśli w katalogu /prebuilts/vndk
w kontenerze BOARD_VNDK_VERSION
jest dostępna wersja zrzutu VNDK, oznacza to, że zrzut VNDK wskazany w kontenerze BOARD_VNDK_VERSION
jest zainstalowany. Jeśli w katalogu nie ma miganego obrazu VNDK, wystąpi błąd kompilacji.
Definiowanie BOARD_VNDK_VERSION
umożliwia też instalowanie modułów VNDK. Moduł dostawcy łączy się z wersją snapshotu VNDK zdefiniowaną w BOARD_VNDK_VERSION
w momencie kompilacji (nie powoduje kompilacji bieżących modułów VNDK w źródle systemu). Podczas pobierania pełnego drzewa źródłowego z repozytorium zarówno źródła systemowe, jak i źródła dostawcy są oparte na tej samej wersji Androida.
Ustaw PRODUCT_EXTRA_VNDK_VERSIONS
PRODUCT_EXTRA_VNDK_VERSIONS
zawiera listę dodatkowych wersji VNDK do zainstalowania. Zwykle wystarczy 1 migawka VNDK dla bieżącej partycji dostawcy. W niektórych przypadkach może być jednak konieczne uwzględnienie kilku migawek w jednym obrazie systemu. Na przykład GSI zawiera wiele migawek, aby obsługiwać wiele wersji dostawców za pomocą jednego obrazu systemu. Ustawienie PRODUCT_EXTRA_VNDK_VERSIONS
umożliwia instalowanie modułów VNDK snapshot oprócz wersji VNDK w BOARD_VNDK_VERSION
.
Jeśli PRODUCT_EXTRA_VNDK_VERSIONS
zawiera określoną listę wersji, system kompilacji szuka w katalogu prebuilts/vndk
gotowych zrzutów wersji z listy. Jeśli system kompilacji znajdzie wszystkie wymienione zrzuty, zainstaluje je w każdej z plików APEX VNDK (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER
. Brakujące wersje powodują błąd kompilacji.
Podczas kompilacji moduły VNDK nie są łączone z modułami dostawcy, ale można ich używać w czasie wykonywania, jeśli moduły dostawcy w partycji dostawcy wymagają jednej z zainstalowanych wersji VNDK. Wartość PRODUCT_EXTRA_VNDK_VERSIONS
jest prawidłowa tylko wtedy, gdy zdefiniowano wartość BOARD_VNDK_VERSION
.
PLATFORM_VNDK_VERSION
PLATFORM_VNDK_VERSION
definiuje wersję VNDK dla bieżących modułów VNDK w źródle systemowym. Wartość jest ustawiana automatycznie:
- Przed wydaniem wartość atrybutu
PLATFORM_VNDK_VERSION
jest ustawiona jakoPLATFORM_VERSION_CODENAME
. - Podczas publikowania
PLATFORM_SDK_VERSION
jest kopiowany doPLATFORM_VNDK_VERSION
.
Po wydaniu wersji na Androida aktualne biblioteki VNDK są instalowane w pliku APEX VNDK (/system/apex/com.android.vndk.vVER
), gdzie VER
to wersja przechowywana w pliku PLATFORM_VNDK_VERSION
.
Gdy wartość BOARD_VNDK_VERSION
to current
, parametr PLATFORM_VNDK_VERSION
jest przechowywany w ro.vndk.version
, a w przeciwnym razie parametr BOARD_VNDK_VERSION
jest przechowywany w ro.vndk.version
. PLATFORM_VNDK_VERSION
jest ustawiane na wersję pakietu SDK w przypadku wersji Androida; przed wydaniem w przypadku PLATFORM_VNDK_VERSION
używana jest alfanumeryczna nazwa kodu Androida.
Podsumowanie ustawień wersji VNDK
Tabela zawiera podsumowanie ustawień wersji VNDK.
Dostawca Kompilacja |
Wsiadanie do: Wersja |
Wersja pakietu SDK: |
Platforma Wersja |
Wersja Właściwość |
Katalog instalacji |
---|---|---|---|---|---|
Aktualne moduły VNDK | current |
Przed | CODE_NAME |
CODE_NAME |
/system/apex/com.android.vndk.vCODE_NAME |
Po | SDK_VER |
SDK_VER |
/system/apex/com.android.vndk.vSDK_VER |
||
Gotowe moduły zrzutu | VNDK_VER na zrzucie |
Przed lub po | CODE_NAME lub SDK_VER |
VNDK_VER |
/system_ext/apex/com.android.vndk.vVNDK_VER |
- Wersja płyty głównej (
BOARD_VNDK_VERSION
). Wersja VNDK, której wymagają moduły dostawców do kompilacji. Ustaw nacurrent
, jeśli moduły dostawcy mogą łączyć się z bieżącymi modułami systemu. - Wersja platformy (
PLATFORM_VNDK_VERSION
). Wersja VNDK, w której są kompilowane bieżące moduły systemowe. Wygenerowany tylko wtedy, gdyBOARD_VNDK_VERSION
jest równe current. - Właściwość wersji (
ro.vndk.version
). Właściwość wskazująca wersję VNDK, której wymagają pliki binarne i biblioteki w pliku vendor.img. Przechowywane wvendor.img
w/vendor/default.prop
.