Projekt zrzutów VNDK

Obrazy systemowe mogą używać zrzutów VNDK, aby udostępniać obrazom dostawcy prawidłowe biblioteki VNDK, nawet jeśli obrazy systemu i obrazu dostawcy są kompilowane z różnych wersji Androida. Tworzenie zrzutu VNDK wymaga przechwycenia bibliotek VNDK jako zrzutu i oznaczenia ich numerem wersji. Obraz dostawcy może być powiązany z konkretną wersją VNDK, która zapewnia wymagane ABI dla modułów w obrazie dostawcy. W ramach tej samej wersji VNDK biblioteki VNDK muszą być stabilne pod względem ABI.

Projekt zrzutu VNDK obejmuje metody generowania wstępnie skompilowanych zrzutów VNDK na podstawie bieżącego obrazu systemu oraz instalowania tych wstępnie skompilowanych bibliotek na partycji systemowej nowszej wersji Androida.

Informacje o bibliotekach VNDK

Interfejsy HAL HIDL, wprowadzone w Androidzie 8.0, umożliwiają oddzielne uaktualnienia dla partycji systemowej i partycji dostawcy. VNDK definiuje zestawy bibliotek (VNDK-core, VNDK-SP i LL-NDK), z którymi można powiązać kod dostawcy, oraz uniemożliwia dostawcom używanie bibliotek, które nie należą do żadnego z tych zestawów. W rezultacie obraz dostawcy można skompilować i uruchomić, jeśli obraz dostawcy zawiera odpowiednie zestawy VNDK.

VNDK-core

Zestaw bibliotek VNDK-core jest instalowany w /system/lib[64]/vndk-${VER} i jest dostępny tylko dla procesów dostawcy z poziomem interfejsu API ${VER}. Procesy systemowe nie mogą używać tych bibliotek i zamiast tego muszą używać bibliotek zainstalowanych w /system/lib[64]. Ze względu na ścisłe ograniczenie przestrzeni nazw dla każdego procesu biblioteki VNDK-core są chronione przed podwójnym wczytywaniem.

Aby uwzględnić bibliotekę w VNDK-core, dodaj do pliku Android.bp następujące informacje:

vendor_available: true,
vndk: {
    enabled: true,
},

VNDK-SP

Biblioteki VNDK-SP są instalowane w /system/lib[64]/vndk-sp-${VER}i są dostępne dla procesów dostawcy oraz procesów systemowych (poprzez biblioteki SP-HAL zainstalowane w partycji dostawcy). Biblioteki VNDK-SP mogą być ładowane podwójnie.

Aby uwzględnić bibliotekę w VNDK-SP, dodaj do pliku Android.bp następujące informacje:

vendor_available: true,
vndk: {
    enabled: true,
    support_system_process: true,
},

LL-NDK

Biblioteki LL-NDK są instalowane w /system/lib[64]. Moduł dostawcy może używać bibliotek podkładów LL-NDK, aby uzyskać dostęp do wybranych symboli bibliotek LL-NDK. Biblioteki LL-NDK muszą być zgodne wstecz i stabilne pod względem ABI, aby umożliwić starszym wersjom modułów dostawcy korzystanie z nowych wersji bibliotek LL-NDK. Ze względu na stabilność ABI bibliotek LL-NDK snapshot VNDK nie musi zawierać bibliotek LL-NDK dla starych obrazów dostawcy.

Informacje o zrzutach VNDK

Android 8.1 zawiera biblioteki VNDK utworzone na podstawie kodu źródłowego. W przypadku nowszych wersji Androida każda wersja VNDK musi zostać przechwycona jako migawka i udostępniona jako wersja wstępna, aby umożliwić połączenie z starszym obrazem dostawcy.

Począwszy od Androida 9 nowe wersje Androida będą zawierać co najmniej 1 migawkę katalogów VNDK-core i VNDK-SP dla starszych wersji w źródełne Androida. W momencie kompilacji wymagane migawki zostaną zainstalowane w katalogach /system/lib[64]/vndk-${VER}/system/lib[64]/vndk-sp-${VER} (które mogą być używane przez partycję producenta), gdzie ${VER} to zmienna ciągu reprezentująca nazwę wersji migawki VNDK.

Biblioteki zrzutu VNDK mogą się różnić w zależności od wersji VNDK, dlatego zrzut VNDK zawiera też konfiguracje przestrzeni nazw linkera zainstalowane jako etc/ld.config.${VER}.txt, /etc/llndk.libraries.${VER}.txt/etc/vndksp.libraries.${VER}.txt.

Przykład: obrazy z systemem i dostawcą

Nie wymaga zrzutu; kompilacja bez dodatkowych konfiguracji zrzutów VNDK.

Przykład: uaktualnij tylko obraz systemu

Musi zawierać pliki konfiguracji przestrzeni nazw linkera i migawki VNDK dla obrazu dostawcy w pliku obrazu systemu. Pliki konfiguracji przestrzeni nazw linkera są automatycznie skonfigurowane tak, aby wyszukiwać biblioteki VNDK w katalogach /system/lib[64]/vndk-${VER}/system/lib[64]/vndk-sp-${VER}.

Rysunek 1. Aktualizacja tylko systemu

Przykład: uaktualnienie obrazu systemu, drobna zmiana obrazu dostawcy

Tworzenie obrazu dostawcy na podstawie zrzutu VNDK nie jest jeszcze obsługiwane, więc musisz utworzyć obraz dostawcy osobno z oryginalnym kodem źródłowym, a następnie uaktualnić obraz systemu zgodnie z poprzednim przykładem.

Architektura zrzutu VNDK

Aby obraz systemu Android 9 był zgodny z obrazem dostawcy Androida 8.1, obraz systemu Android 9 musi zawierać zrzut VNDK zgodny z obrazem dostawcy Androida 8.1, jak pokazano poniżej:

Rysunek 2. Architektura zrzutu VNDK

Projekt migawki VNDK obejmuje te metody:

  • Generowanie zrzutu dla bibliotek VNDK-core i VNDK-SP. Android 9 zawiera skrypt, którego możesz użyć do utworzenia zrzutu bieżącej kompilacji VNDK. Ten skrypt zawiera wszystkie biblioteki w /system/lib[64]/vndk-28/system/lib[64]/vndk-sp-28, które zostały skompilowane z bieżącego źródła jako snapshot VNDK, gdzie 28 to wersja VNDK Androida 9. Zrzut zawiera też pliki konfiguracji linkera /etc/ld.config.28.txt, /etc/llndk.libraries.28.txt i /etc/vndksp.libraries.28.txt. Wygenerowany zrzut zostanie użyty w przypadku nowszych wersji Androida (starszych niż 9).
  • Instalowanie gotowych bibliotek VNDK-core i VNDK-SP ze zrzutu dysku. W Androidzie 9 zrzut VNDK zawiera zestaw wstępnie utworzonych bibliotek VNDK-core i zbiór bibliotek VNDK-SP, a także pliki konfiguracji przestrzeni nazw linkera. Gdy podasz listę wersji snapshotów VNDK, które mają zostać zainstalowane, w momencie kompilacji obraz systemu zainstaluje biblioteki snapshotów VNDK w katalogach /system/lib[64]/vndk-${VER}/system/lib[64]/vndk-sp-${VER} oraz pliki konfiguracji przestrzeni nazw linkera dla tych snapshotów VNDK w katalogu /etc.

Wersje VNDK

Każda wersja Androida ma tylko 1 migawkę VNDK, a wersja pakietu SDK jest używana jako wersja VNDK (co oznacza, że wersja VNDK ma liczbę całkowitą, np. 27 dla Androida 8.1). Wersja VNDK jest ustalona, gdy zostanie opublikowana wersja na Androida. Wersja VNDK używana przez partycję dostawcy jest przechowywana automatycznie w właściwości ro.vndk.version, która może być odczytana w czasie wykonywania. Ta wersja jest następnie używana do identyfikowania wersji VNDK dostawcy w przypadku niektórych bibliotek oraz do identyfikowania wersji snapshotu VNDK w przypadku konfiguracji przestrzeni nazw.

Tworzenie bibliotek VNDK

Polecenie make vndk tworzy biblioteki, które mają vndk: { enabled: true, … }, w tym pliki konfiguracji zależności i przestrzeni nazw. Jeśli ustawiona jest opcja BOARD_VNDK_VERSION := current, te biblioteki są tworzone za pomocą polecenia make.

Ponieważ ta kompilacja nie instaluje bibliotek VNDK ze snapshotu, zainstalowane biblioteki VNDK nie są stabilne pod względem ABI. Jednak po wydaniu wersji Androida ABI bieżącej wersji VNDK jest ustalona. W tej chwili każde naruszenie ABI jest błędem kompilacji, więc łaty do wersji na Androida nie mogą zmieniać ABI bibliotek VNDK.