Włączanie VNDK

Zestaw Vendor Native Development Kit (VNDK) wymaga wprowadzenia kilku zmian w bazie kodu, aby oddzielić kwestie związane z dostawcą od kwestii związanych z systemem. Aby włączyć VNDK w bazie kodu dostawcy/OEM, skorzystaj z tego przewodnika.

Tworzenie bibliotek systemowych

System kompilacji zawiera kilka typów obiektów, w tym biblioteki (wspólne, statyczne lub nagłówkowe) i pliki binarne.

Tworzenie bibliotek systemowych

Rysunek 1. Tworzenie bibliotek systemowych.

  • core biblioteki są używane przez obraz systemu na obrazie systemu. Tych bibliotek nie mogą używać biblioteki vendor, vendor_available, vndk ani vndk-sp.
    cc_library {
        name: "libThatIsCore",
        ...
    }
  • Biblioteki vendor-only (lub proprietary) są używane przez obraz dostawcy, na obrazie dostawcy.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
  • vendor_available biblioteki są używane przez obraz dostawcy, na obrazie dostawcy (mogą zawierać duplikaty core).
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
  • vndk są używane przez obraz dostawcy na 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 przez obrazy systemu, jak i obrazy dostawcy.
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }

Gdy biblioteka jest oznaczona jako vendor_available:true, jest kompilowana 2 razy:

  • Raz na platformę (a więc zainstalowana na /system/lib)
  • Raz dla dostawcy (i zainstalowany w /vendor/lib lub VNDK APEX)

Wersje bibliotek dostawców są tworzone za pomocą pakietu -D__ANDROID_VNDK__. Ta flaga wyłącza prywatne komponenty systemu, które mogą się znacznie zmienić w przyszłych wersjach Androida. Dodatkowo 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 przypadku bazy kodu:

  1. Sprawdź, czy kwalifikujesz się do programu, obliczając wymagane rozmiary partycji vendor.imgsystem.img.
  2. Włącz BOARD_VNDK_VERSION=current. Możesz dodać do BoardConfig.mk lub bezpośrednio tworzyć za jego pomocą komponenty (np. m -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 plików nagłówkowych.

Zarządzanie zależnościami

Obiekt vendor, który zależy od komponentu core, który nie istnieje w vndk ani jako obiekt vendor, musi zostać rozwiązany za pomocą jednej z tych opcji:

  • Zależność można usunąć.
  • Jeśli komponent core należy do vendor, można go oznaczyć jako vendor_available lub vendor.
  • Zmiana, która sprawia, że obiekt podstawowy staje się częścią vndk, może zostać przesłana do Google.

Jeśli komponent core jest zależny 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

Zależności nagłówka globalnego muszą zostać usunięte, aby system kompilacji mógł określić, czy kompilować nagłówki z użyciem -D__ANDROID_VNDK__, czy bez niego. 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 (np. unistd.h) nie można już uwzględniać przechodnio, ale można je uwzględniać lokalnie.

Na koniec 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 tych czynności:

  • Usuń zależność od private/android_filesystem_config.h, zastępując wszystkie makra AID_* wywołaniami getgrnam/getpwnam, jeśli to możliwe. Na przykład:
    • (uid_t)AID_WIFI zmienia się w getpwnam("wifi")->pw_uid.
    • (gid_t)AID_SDCARD_R zmienia się w getgrnam("sdcard_r")->gr_gid.
    Więcej informacji znajdziesz w sekcji private/android_filesystem_config.h.
  • W przypadku stałych numerów AIS podaj cutils/android_filesystem_config.h.