Pakiet Vendor Native Development Kit (VNDK) wymaga wprowadzenia kilku zmian w bazie kodu, aby oddzielić od siebie kwestie związane z dostawcą i systemem. Aby włączyć VNDK w bazie kodu dostawcy lub producenta OEM, skorzystaj z tego przewodnika.
Biblioteki systemu kompilacji
System kompilacji zawiera kilka typów obiektów, w tym biblioteki (współdzielone, statyczne lub nagłówkowe) i pliki binarne.
Rysunek 1. Biblioteki systemu kompilacji.
- Biblioteki
coresą używane przez obraz systemu. Bibliotek tych nie można używać w bibliotekachvendor,vendor_available,vndkanivndk-sp.cc_library { name: "libThatIsCore", ... }
- Biblioteki
vendor-only(lubproprietary) są używane przez obraz dostawcy.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- Biblioteki
vendor_availablesą używane przez obraz dostawcy (mogą zawierać duplikaty bibliotekcore).cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... }
- Biblioteki
vndksą używane przez obraz dostawcy w obrazie systemu.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- Biblioteki
vndk-spsą 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
llndksą używane zarówno przez obraz systemu, jak i obraz dostawcy.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
Gdy biblioteka jest oznaczona jako vendor_available:true, jest kompilowana 2 razy:
- raz dla platformy (i dlatego jest instalowana w katalogu
/system/lib), - raz dla dostawcy (i dlatego jest instalowana w katalogu
/vendor/liblub VNDK APEX).
Wersje bibliotek dostawcy są kompilowane za pomocą flagi -D__ANDROID_VNDK__.
Ta flaga wyłącza prywatne komponenty systemu, które mogą się znacznie zmienić w przyszłych wersjach Androida. Ponadto różne biblioteki eksportują inny zestaw nagłówków (np. liblog). Opcje specyficzne dla wariantu docelowego dostawcy można określić w pliku Android.bp w:
target: { vendor: { … } }Włączanie VNDK w bazie kodu
Aby włączyć VNDK w bazie kodu:
- Określ, czy jest to możliwe, obliczając wymagane rozmiary partycji
vendor.imgisystem.img. - Włącz
BOARD_VNDK_VERSION=current. Możesz dodać tę opcję doBoardConfig.mklub bezpośrednio kompilować komponenty (np.m -j BOARD_VNDK_VERSION=current MY-LIB).
Po włączeniu opcji BOARD_VNDK_VERSION=current system kompilacji wymusza spełnienie tych wymagań dotyczących zależności i nagłówków.
Zarządzanie zależnościami
Obiekt vendor, który zależy od komponentu core nieistniejącego w vndk lub jako obiekt vendor, musi zostać rozwiązany za pomocą jednej z tych opcji:
- Zależność można usunąć.
- Jeśli komponent
corenależy dovendor, można go oznaczyć jakovendor_availablelubvendor. - Zmianę, która sprawia, że obiekt core staje się częścią
vndk, można przesłać do Google.
Ponadto, jeśli komponent core 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 (np. przez usunięcie zależności lub przeniesienie jej do komponentu vendor).
Zarządzanie nagłówkami
Aby system kompilacji mógł określić, czy kompilować nagłówki z flagą -D__ANDROID_VNDK__, czy bez niej, należy usunąć globalne zależności nagłówków.
Na przykład nagłówki libutils, takie jak utils/StrongPointer.h, nadal są dostępne za pomocą biblioteki nagłówkowej
libutils_headers.
Niektórych nagłówków (np. unistd.h) nie można już uwzględniać przechodnio, ale można je uwzględniać lokalnie.
Na koniec publiczna część pliku private/android_filesystem_config.h została przeniesiona do pliku cutils/android_filesystem_config.h. Aby zarządzać tymi nagłówkami, wykonaj jedną z tych czynności:
- Usuń zależność od pliku
private/android_filesystem_config.h, zastępując wszystkie makraAID_*wywołaniamigetgrnam/getpwnam, jeśli to możliwe. Na przykład:(uid_t)AID_WIFIstaje sięgetpwnam("wifi")->pw_uid.(gid_t)AID_SDCARD_Rstaje sięgetgrnam("sdcard_r")->gr_gid.
private/android_filesystem_config.h. - W przypadku zakodowanych na stałe identyfikatorów AID uwzględnij plik
cutils/android_filesystem_config.h.