Generuj zrzuty VNDK

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_ARCHTARGET_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).

Struktura katalogu zrzutu VNDK
Rysunek 1. Struktura katalogu zrzutu VNDK (przykład)

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:

  1. W /prebuilts/vndk/vVER używa repo start do utworzenia nowej gałęzi Git.
  2. Pobiera i rozpakowuje artefakty kompilacji zrzutu VNDK.
  3. Uruchamia gen_buildfiles.py, aby automatycznie wygenerować pliki kompilacji (Android.bp).
  4. 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.
  5. 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)
Komponenty lokalne są dodawane automatycznie, jeśli zostały utworzone za pomocą narzędzia 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_VERSIONSro.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 w PRODUCT_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 jako PLATFORM_VERSION_CODENAME.
  • Podczas publikowania PLATFORM_SDK_VERSION jest kopiowany do PLATFORM_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 na current, 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, gdy BOARD_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 w vendor.img/vendor/default.prop.