Włączanie VNDK

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.

Twórz biblioteki systemowe
Rysunek 1. Kompiluj biblioteki systemowe
  • Biblioteki core są używane przez obraz systemu w obrazie systemu. Biblioteki te nie mogą być używane przez biblioteki vendor , vendor_available , vndk ani vndk-sp .
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • Biblioteki vendor-only (lub proprietary ) 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ć duplikaty core ).
    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:

  1. Określ kwalifikowalność, obliczając wymagane rozmiary partycji vendor.img i system.img .
  2. Włącz BOARD_VNDK_VERSION=current . Możesz dodać do BoardConfig.mk lub bezpośrednio za jego pomocą zbudować komponenty (na przykład 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 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ć jako vendor_available lub vendor .
  • 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 makra AID_* wywołaniami getgrnam / getpwnam , jeśli to możliwe. Na przykład:
    • (uid_t)AID_WIFI zmienia się na getpwnam("wifi")->pw_uid .
    • (gid_t)AID_SDCARD_R zmienia się na getgrnam("sdcard_r")->gr_gid .
    Aby uzyskać szczegółowe informacje, zobacz private/android_filesystem_config.h .
  • W przypadku zakodowanego na stałe AIS dołącz cutils/android_filesystem_config.h .