Włącz VNDK

VNDK (Vendor Native Development Kit) wymaga wprowadzenia kilku zmian w bazie kodu, aby rozdzielić między dostawcą a systemem. Skorzystaj z tego przewodnika, aby włączyć VNDK u dostawcy/OEM bazy kodu.

Kompilowanie bibliotek systemowych

System kompilacji zawiera kilka typów obiektów, w tym biblioteki (udostępniane, statyczne lub nagłówek) i binarne.

Kompilowanie bibliotek systemowych

Rysunek 1. Kompilowanie bibliotek systemowych.

  • Biblioteki core są używane przez obraz systemu w tym obrazie. Te bibliotek vendor, vendor_available nie może używać vndk lub vndk-sp biblioteki.
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • Biblioteki vendor-only (lub proprietary) są używane przez na jego obrazie.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
    
  • Obraz dostawcy używany przez vendor_available biblioteki obraz (może zawierać duplikaty: core).
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
    
  • Obraz dostawcy w obrazie systemu używa bibliotek vndk.
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
    
  • Biblioteki vndk-sp są używane przez obraz dostawcy oraz przez obraz systemu pośrednio.
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
    
  • Biblioteki llndk są używane przez obrazy systemu i dostawców.
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }
    

Gdy lib jest oznaczony jako vendor_available:true, jest tworzony dwa razy:

  • Raz dla platformy (i tym samym zainstalowano ją w /system/lib)
  • Raz dla dostawcy (i tym samym zainstalowany w /vendor/lib lub VNDK APEX)

Wersje libs dostawców są tworzone za pomocą dodatku -D__ANDROID_VNDK__. Komponenty systemu prywatnego, które mogą się znacznie zmienić w przyszłych wersjach Android jest wyłączony z tą flagą. Dodatkowo różne biblioteki eksportują plik inny zestaw nagłówków (np. liblog). Opcje specyficzne dla wariant dostawcy środowiska docelowego można określić w pliku Android.bp w:

target: { vendor: { … } }

Włącz VNDK dla bazy kodu

Aby włączyć VNDK dla bazy kodu:

  1. Określ, czy się kwalifikujesz, obliczając wymagane rozmiary Partycje: vendor.img i system.img.
  2. Włącz BOARD_VNDK_VERSION=current. Możesz dodać do BoardConfig.mk lub bezpośrednio utwórz za jego pomocą komponenty (np. m -j BOARD_VNDK_VERSION=current MY-LIB).

Po włączeniu BOARD_VNDK_VERSION=current system kompilacji egzekwuje poniższe wymagania dotyczące zależności i nagłówka.

Zarządzaj zależnościami

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

  • Zależność można usunąć.
  • Jeśli komponent core należy do domeny vendor, może być oznaczony jako vendor_available lub vendor.
  • Zmiana powodująca, że podstawowy obiekt jest częścią obiektu vndk, do Google.

Ponadto, jeśli komponent core ma zależności od vendor, komponent vendor musi być utworzony w komponencie core lub zależność musi usunięte w inny sposób (na przykład przez usunięcie zależności lub przeniesienie w komponencie vendor).

Zarządzaj nagłówkami

Aby system kompilacji miał dostęp do informacji, musisz usunąć zależności globalnych nagłówków czy tworzyć nagłówki z elementem -D__ANDROID_VNDK__ czy bez niego. Na przykład nagłówki libutils, takie jak utils/StrongPointer.h, mogą są nadal dostępne za pomocą biblioteki nagłówków libutils_headers

Niektórych nagłówków (takich jak unistd.h) nie można już uwzględniać w trybie przejściowym ale mogą być uwzględniane lokalnie.

Na koniec część publiczna (private/android_filesystem_config.h) został przeniesiony do cutils/android_filesystem_config.h. Do zarządzania wykonaj jedną z następujących czynności:

  • Usuń zależność do private/android_filesystem_config.h, zastępując wszystkie Makra AID_* z getgrnam/ getpwnam połączeń, 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: private/android_filesystem_config.h
  • W przypadku AIS zakodowanego na stałe dołącz cutils/android_filesystem_config.h