VNDK wymaga kilku zmian w bazie kodu, aby oddzielić problemy między dostawcą a systemem. Skorzystaj z poniższego przewodnika, aby włączyć VNDK w bazie kodu dostawcy/OEM.
Twórz biblioteki systemowe
System kompilacji zawiera kilka typów obiektów, w tym biblioteki (współdzielone, statyczne lub nagłówkowe) i pliki binarne.
- Biblioteki
core
są używane przez obraz systemu w obrazie systemu. Biblioteki te nie mogą być używane przez bibliotekivendor
,vendor_available
,vndk
anivndk-sp
.cc_library { name: "libThatIsCore", ... }
- Biblioteki
vendor-only
(lubproprietary
) są używane przez obraz dostawcy w obrazie dostawcy.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- Biblioteki
vendor_available
są używane przez obraz dostawcy na obrazie dostawcy (mogą zawierać duplikatycore
).cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... }
- Biblioteki
vndk
są używane przez obraz dostawcy w obrazie systemu.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- Biblioteki
vndk-sp
są używane przez obraz dostawcy, a także pośrednio przez obraz systemu.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
- Biblioteki
llndk
są używane zarówno w obrazach systemu, jak i dostawców.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
Kiedy biblioteka jest oznaczona jako vendor_available:true
, jest budowana dwukrotnie:
- Raz dla platformy (i tym samym zainstalowany w
/system/lib
) - Raz dla dostawcy (i tym samym zainstalowany w
/vendor/lib
lub VNDK APEX)
Wersje bibliotek dostawców są zbudowane z -D__ANDROID_VNDK__
. Ta flaga wyłącza prywatne komponenty systemu, które mogą znacząco ulec zmianie w przyszłych wersjach Androida. Ponadto różne biblioteki eksportują inny zestaw nagłówków (np. liblog
). Opcje specyficzne dla wariantu dostawcy celu można określić w pliku Android.bp
w:
target: { vendor: { … } }
Włączanie VNDK dla bazy kodu
Aby włączyć VNDK dla bazy kodu:
- Określ kwalifikowalność, obliczając wymagane rozmiary partycji
vendor.img
isystem.img
. - Włącz
BOARD_VNDK_VERSION=current
. Możesz dodać doBoardConfig.mk
lub bezpośrednio za jego pomocą zbudować komponenty (na przykładm -j BOARD_VNDK_VERSION=current MY-LIB
).
Po włączeniu BOARD_VNDK_VERSION=current
system kompilacji wymusza następujące wymagania dotyczące zależności i nagłówków.
Zarządzanie zależnościami
Obiekt vendor
zależny od core
komponentu, który nie istnieje w vndk
lub jako obiekt vendor
, musi zostać rozwiązany przy użyciu jednej z następujących opcji:
- Zależność można usunąć.
- Jeżeli
core
komponent jest własnościąvendor
, można go oznaczyć jakovendor_available
lubvendor
. - Zmiana powodująca, że główny obiekt stanie się częścią
vndk
, może zostać przesłana do Google.
Ponadto, jeśli core
komponent ma zależności od komponentu vendor
, komponent vendor
musi zostać przekształcony w komponent core
lub zależność musi zostać usunięta w inny sposób (na przykład poprzez usunięcie zależności lub przeniesienie zależności do komponentu vendor
).
Zarządzanie nagłówkami
Należy usunąć globalne zależności nagłówków, aby system kompilacji wiedział, czy zbudować nagłówki z -D__ANDROID_VNDK__
czy bez. Na przykład do nagłówków libutils, takich jak utils/StrongPointer.h
nadal można uzyskać dostęp za pomocą biblioteki nagłówków libutils_headers
.
Niektórych nagłówków (takich jak unistd.h
) nie można już dołączać przechodnio, ale można je uwzględnić lokalnie.
Wreszcie publiczna część private/android_filesystem_config.h
została przeniesiona do cutils/android_filesystem_config.h
. Aby zarządzać tymi nagłówkami, wykonaj jedną z następujących czynności:
- Usuń zależność od
private/android_filesystem_config.h
, zastępując wszystkie makraAID_*
wywołaniamigetgrnam
/getpwnam
, jeśli to możliwe. Na przykład:-
(uid_t)AID_WIFI
zmienia się nagetpwnam("wifi")->pw_uid
. -
(gid_t)AID_SDCARD_R
zmienia się nagetgrnam("sdcard_r")->gr_gid
.
private/android_filesystem_config.h
. -
- W przypadku zakodowanego na stałe AIS dołącz
cutils/android_filesystem_config.h
.