Generowanie migawek VNDK

Migawka VNDK to zestaw bibliotek VNDK-core i VNDK-SP dla wersji Androida. Można uaktualnić tylko partycję systemową, jeśli plik system.img zawiera odpowiednią migawkę VNDK potrzebną w pliku vendor.img .

Oficjalne migawki VNDK są tworzone automatycznie na serwerze kompilacji Androida i zapisywane w /prebuilts/vndk drzewa źródeł Androida. Do celów programistycznych można lokalnie tworzyć migawki VNDK. Migawki VNDK są obsługiwane dla odmian arm, arm64, x86 i x86_64 TARGET_ARCH .

Tworzenie migawek

Serwer kompilacji systemu Android generuje artefakty kompilacji i pliki migawek VNDK przy użyciu następujących parametrów kompilacji i poleceń kompilacji.

Parametry kompilacji

Nazwa docelowa kompilacji to vndk . Konfiguracja docelowa kompilacji jest pokazana 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 jest taki sam jak łuki docelowe Generic System Image (GSI) ( arm , arm64 , x86 , x86_64 ).
  • TARGET_ARCH_VARIANT . W przypadku migawki w wersji 28 (Android 9) i nowszej zawiera popularne konfiguracje wymienione powyżej.

Komendy budowania

W przypadku oficjalnych migawek system Android 9 i nowsze wersje zawierają przykładowy obiekt docelowy ( vndk ) w vndk.mk , który tworzy i wysyła migawkę VNDK do $DIST_DIR . Plik ZIP migawki ma format android-vndk-$(TARGET_ARCH).zip . Na przykład:

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

Serwer kompilacji systemu Android używa skryptu build.sh do tworzenia wszystkich obsługiwanych wersji Arch za pomocą następującego polecenia.

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

Migawka VNDK dla wersji systemu Android jest generowana z gałęzi wydania tej wersji.

Budowanie lokalnie

Podczas programowania można tworzyć migawki VNDK z lokalnego drzewa źródłowego za pomocą następujących poleceń.

  • Aby zbudować wszystkie obsługiwane łuki na raz, wykonaj następujący skrypt kompilacji ( build.sh ).
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
    
  • Aby zbudować jeden konkretny TARGET_ARCH , wykonaj następujące polecenia.
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist
    

Odpowiedni plik android-vndk-$(TARGET_ARCH).zip jest tworzony w katalogu $DIST_DIR .

Pliki migawek

Migawka VNDK zawiera następujące pliki.

  • Wariant dostawcy bibliotek współdzielonych VNDK-core i VNDK-SP.
    • Biblioteki współdzielone LL-NDK nie są potrzebne, ponieważ są kompatybilne wstecz.
    • W przypadku celów 64-bitowych budowane i dołączane są biblioteki TARGET_ARCH i TARGET_2ND_ARCH .
  • Lista bibliotek VNDK-core, VNDK-SP, LL-NDK i VNDK-private znajduje się pod adresem [vndkcore|vndksp|llndk|vndkprivate].libraries.txt .
  • Pliki licencyjne.
  • module_paths.txt . Rejestruje ścieżki modułów dla wszystkich bibliotek VNDK, co jest potrzebne do sprawdzenia, czy projekty GPL mają źródła wydane w danym drzewie źródeł Androida.

Dla danego pliku ZIP migawki VNDK, android-vndk-$(TARGET_ARCH).zip , prekompilowane biblioteki VNDK są pogrupowane w oddzielnych katalogach o nazwach arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT) zgodnie z bitowością ABI. Na przykład dla android-vndk-arm64.zip 64-bitowe biblioteki są umieszczone pod arch-arm64-armv8-a , a 32-bitowe biblioteki są umieszczone pod arch-arm-armv8-a . Poniższy przykład pokazuje strukturę katalogów dla pliku ZIP migawki VNDK arm64 ( TARGET_ARCH=arm64 ) ( android-vndk-arm64.zip ).

Struktura katalogu migawek VNDK
Rysunek 1. Struktura katalogów migawek VNDK (przykład)

Tworzenie migawek dostawców

Android 11 obsługuje migawki dostawców , które umożliwiają tworzenie vendor.img niezależnie od wersji Androida w drzewie źródłowym. Domyślny zrzut VNDK zawiera pliki bibliotek współdzielonych ( .so ), które można zainstalować na urządzeniach, a następnie połączyć z plikami binarnymi C++ dostawcy w czasie wykonywania. Aby skompilować tę migawkę VNDK, potrzebujesz dodatkowych artefaktów, takich jak pliki nagłówkowe i wyeksportowane flagi.

Aby wygenerować takie artefakty (wraz z migawką VNDK) z lokalnego drzewa źródłowego, użyj następującego polecenia.

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

To polecenie tworzy pliki android-vndk-$(TARGET_ARCH).zip w katalogu $DIST_DIR . Poniższy przykład to plik ZIP migawki VNDK arm64 z artefaktami kompilacji. Pogrubione pliki to nowo dodane pliki do normalnej migawki VNDK (pokazane na rysunku 1) i zawierają pliki JSON (w których przechowywane są cflags każdej biblioteki) oraz wszystkie wyeksportowane pliki nagłówkowe.

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 migawek VNDK

Migawki VNDK są sprawdzane w drzewie źródłowym w /prebuilts/vndk/v VER , gdzie VER jest równe wersji migawki VNDK (która jest zgodna z wersją SDK odpowiedniej wersji Androida). Na przykład migawka VNDK systemu Android 8.1 ma wersję 27.

Korzystanie ze skryptu update.py

Skrypt update.py ( /development/vndk/snapshot/update.py ) automatyzuje proces dodawania wstępnie utworzonej migawki VNDK do drzewa źródłowego. Automatycznie wykrywa artefakty kompilacji i odpowiednio wypełnia powiązane właściwości w wygenerowanym Android.bp . Skrypt ten wykonuje następujące zadania:

  1. W /prebuilts/vndk/v VER używa repo start do utworzenia nowej gałęzi Git.
  2. Pobiera i rozpakowuje artefakty kompilacji migawek VNDK.
  3. Uruchamia gen_buildfiles.py w celu automatycznego wygenerowania plików kompilacji ( Android.bp ).
  4. Uruchamia plik check_gpl_license.py , aby sprawdzić, czy wstępnie zbudowane biblioteki objęte licencją General Public License (GPL) mają źródła udostępnione w bieżącym drzewie źródeł.
  5. Używa git commit do zatwierdzania nowych zmian.

Korzystanie z lokalnie zbudowanych migawek VNDK

Można także używać lokalnie utworzonych migawek VNDK. Jeśli określono opcję --local , skrypt update.py pobiera artefakty kompilacji migawki VNDK z określonego katalogu lokalnego (zamiast z serwera kompilacji systemu Android), w którym znajdują się pliki android-vndk-$(TARGET_ARCH).zip wygenerowane w development/vndk/snapshot/build.sh . Dzięki opcji --local skrypt update.py pomija kroki sprawdzania licencji GPL i git commit .

Składnia:

python update.py VER --local local_path

Przykładowe polecenie aktualizacji migawki VNDK systemu Android 8.1 za pomocą lokalnych artefaktów kompilacji w /path/to/local/dir :

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

Przykładowa struktura katalogów lokalnie zbudowanej migawki 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)
Lokalne artefakty kompilacji są dodawane automatycznie, jeśli artefakty zostały zbudowane z VNDK_SNAPSHOT_BUILD_ARTIFACTS=true .

Instalowanie migawek VNDK

Obraz systemu instaluje biblioteki migawek VNDK w czasie kompilacji, korzystając z informacji z BOARD_VNDK_VERSION , PRODUCT_EXTRA_VNDK_VERSIONS i ro.vndk.version . Możesz kontrolować, które migawki VNDK będą instalowane z gotowych katalogów migawek VNDK (na przykład /prebuilts/vndk/v29 lub /prebuilts/vndk/v30 ), korzystając z jednej z poniższych opcji.

  • Opcja 1: BOARD_VNDK_VERSION . Użyj modułów migawek do zbudowania bieżących modułów dostawcy i zainstaluj tylko te moduły migawek, które są wymagane dla modułów dostawcy.
  • Opcja 2: PRODUCT_EXTRA_VNDK_VERSIONS . Zainstaluj moduły migawek VNDK niezależnie od modułów bieżącego dostawcy. Spowoduje to zainstalowanie gotowych migawek VNDK wymienionych w PRODUCT_EXTRA_VNDK_VERSIONS bez łączenia ich z innymi modułami w czasie kompilacji.

Ustawianie BOARD_VNDK_VERSION

BOARD_VNDK_VERSION pokazuje wersję VNDK, którą muszą zbudować aktualne moduły dostawców. Jeśli BOARD_VNDK_VERSION ma dostępną wersję migawki VNDK w katalogu /prebuilts/vndk , zainstalowana zostanie migawka VNDK wskazana w BOARD_VNDK_VERSION . Jeśli migawka VNDK nie jest dostępna w katalogu, wystąpi błąd kompilacji.

Zdefiniowanie BOARD_VNDK_VERSION umożliwia także instalację modułów VNDK. Moduły dostawcy łączą się z wersją migawki VNDK zdefiniowaną w BOARD_VNDK_VERSION w czasie kompilacji (nie powoduje to zbudowania bieżących modułów VNDK w źródle systemowym). Podczas pobierania pełnego drzewa źródeł z repozytorium zarówno źródła systemowe, jak i dostawcy są oparte na tej samej wersji Androida.

Ustawianie PRODUCT_EXTRA_VNDK_VERSIONS

PRODUCT_EXTRA_VNDK_VERSIONS zawiera listę dodatkowych wersji VNDK do zainstalowania. Zwykle wystarczy mieć jedną migawkę VNDK dla bieżącej partycji dostawcy. Jednak w niektórych przypadkach może być konieczne umieszczenie wielu migawek w jednym obrazie systemu. Na przykład GSI ma wiele migawek umożliwiających obsługę wersji wielu dostawców za pomocą jednego obrazu systemu. Ustawiając PRODUCT_EXTRA_VNDK_VERSIONS , możesz zainstalować moduły migawek VNDK jako dodatek do wersji VNDK w BOARD_VNDK_VERSION .

Jeśli PRODUCT_EXTRA_VNDK_VERSIONS ma określoną listę wersji, system kompilacji szuka wstępnie utworzonych migawek listy wersji w katalogu prebuilts/vndk . Jeśli system kompilacji zlokalizuje wszystkie wymienione migawki, instaluje te pliki migawek w każdym VNDK APEX ( out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.v VER . Brakujące wersje powodują błąd kompilacji.

Moduły VNDK nie łączą się z modułami dostawcy w czasie kompilacji, ale można ich używać w czasie wykonywania, jeśli moduły dostawcy w partycji dostawcy wymagają jednej z zainstalowanych wersji VNDK. PRODUCT_EXTRA_VNDK_VERSIONS jest ważny tylko wtedy, gdy zdefiniowano 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 PLATFORM_VNDK_VERSION jest ustawiona jako PLATFORM_VERSION_CODENAME .
  • W wersji PLATFORM_SDK_VERSION jest kopiowany do PLATFORM_VNDK_VERSION .

Po wydaniu wersji na Androida aktualne biblioteki VNDK są instalowane w VNDK APEX ( /system/apex/com.android.vndk.v VER ), gdzie VER to wersja przechowywana w PLATFORM_VNDK_VERSION .

Gdy BOARD_VNDK_VERSION jest ustawiona na current , PLATFORM_VNDK_VERSION jest przechowywana w ro.vndk.version , w przeciwnym razie BOARD_VNDK_VERSION jest przechowywana w ro.vndk.version . PLATFORM_VNDK_VERSION jest ustawiona na wersję SDK w momencie wydania Androida; przed wydaniem alfanumeryczna nazwa kodowa Androida jest używana dla PLATFORM_VNDK_VERSION .

Podsumowanie ustawień wersji VNDK

Poniższa tabela podsumowuje ustawienia wersji VNDK.

Sprzedawca
Zbudować
Tablica
Wersja
SDK
Uwolnienie
Platforma
Wersja
Wersja
Nieruchomość
Zainstaluj katalog
Aktualne moduły VNDK current Zanim CODE_NAME CODE_NAME /system/apex/com.android.vndk.v CODE_NAME
Po SDK_VER SDK_VER /system/apex/com.android.vndk.v SDK_VER
Gotowe moduły migawek VNDK_VER
dla migawki
Przed lub po CODE_NAME
lub SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.v VNDK_VER
  • Wersja płytki ( BOARD_VNDK_VERSION ). Wersja VNDK, którą moduły dostawcy wymagają do zbudowania. Ustaw na current , jeśli moduły dostawcy mogą łączyć się z bieżącymi modułami systemu.
  • Wersja platformy ( PLATFORM_VNDK_VERSION ). Wersja VNDK, którą budują obecne moduły systemu. Zbudowany tylko wtedy, gdy BOARD_VNDK_VERSION jest równy bieżącemu.
  • Właściwość wersji ( ro.vndk.version ). Właściwość określająca wersję VNDK, której wymagają pliki binarne i biblioteki w pliku sprzedawca.img do uruchomienia. Przechowywane w vendor.img w /vendor/default.prop .