Generowanie zrzutów dostawców

Android 11 obsługuje artefakty kompilacji zrzutów VNDK i zrzuty dostawców, których możesz używać do kompilowania vendor.img niezależnie od wersji Androida w drzewie źródłowym. Umożliwia to używanie mieszanych wersji obrazów, np. starszego obrazu dostawcy i nowszego obrazu systemu.

Mieszane wersje obrazów nie są obsługiwane w tych przypadkach:

  • Android.mk. Ponieważ zrzut dostawcy jest generowany przez Soong, moduły zdefiniowane w Android.mk nie są przechwytywane jako zrzut dostawcy (nie ma też gwarancji, że moduły zastrzeżone dla SoC w Android.mk będą działać).

  • Sanitizer. Zrzuty dostawców i VNDK nie obsługują narzędzia Sanitizer, ponieważ jego warianty trzeba kompilować osobno.

Informacje o zrzutach dostawców

Zrzut dostawcy jest zrzutem należącym do producenta OEM. Jest to zestaw wstępnie skompilowanych modułów C++ zainstalowanych w katalogu /vendor, ale utrzymywanych w AOSP. Jeśli nie przechwycisz zrzutu dostawcy z poprzedniej wersji Androida, przejście na nową wersję może spowodować uszkodzenie partycji dostawcy, ponieważ moduły zrzutu dostawcy można usunąć lub zmienić bez zachowania zgodności z interfejsem API lub ABI.

Zrzut dostawcy zawiera te moduły w AOSP:

  • biblioteki udostępnione, statyczne i nagłówkowe z ustawieniem vendor: true lub vendor_available: true;
  • statyczne biblioteki VNDK z ustawieniem vendor_available: true;
  • pliki wykonywalne i obiekty z ustawieniem vendor: true lub vendor_available: true.

Moduły w tych katalogach są traktowane jako kod sprzętowy należący do SoC i są ignorowane:

  • device/
  • vendor/
  • hardware/, z wyjątkiem
    • hardware/interfaces
    • hardware/libhardware
    • hardware/libhardware_legacy

Kody sprzętowe należące do SoC mogą też znajdować się w innych katalogach. Obecnie zrzuty dostawców nie obsługują takich konfiguracji.

Kompilowanie zrzutów dostawców

Aby skompilować zrzut dostawcy, użyj tych poleceń:

. build/envsetup.sh
lunch target
m dist vendor-snapshot

Te polecenia tworzą plik vendor-$(TARGET_DEVICE).zip w katalogu $DIST_DIR. Ten przykład pokazuje plik ZIP zrzutu dostawcy:

vendor-$(TARGET_DEVICE).zip
├── arch-arm64-armv8-a
│   ├── binary         -> binary files, *.json files
│   ├── header         -> *.json files
│   ├── object         -> *.o files, *.json files
│   ├── shared         -> *.so files, *.json files
│   └── static         -> *.a files, *.json files
├── arch-arm-armv8-a   -> (arch-arm64-armv8-a)
├── configs            -> *.rc files, *.xml files
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files
  • Pliki JSON zawierają flagi takie jak nazwa modułu, eksportowane katalogi, pliki init_rc i pliki vintf_fragments.
  • Katalog configs zawiera pliki .rc i .xml z flag init_rc i vintf_fragments.

Instalowanie zrzutów dostawców

Aby zainstalować zrzut dostawcy, przejdź do katalogu docelowego i użyj tych poleceń:

python3 development/vendor_snapshot/update.py --local $DIST_DIR --install-dir \
    vendor/vendor name/vendor_snapshot VER

To polecenie generuje plik /vendor/vendor name/vendor_snapshot/vVER/$(TARGET_ARCH)/Android.bp. Ten przykład pokazuje strukturę katalogów zrzutu dostawcy:

vendor/vendor name/vendor_snapshot/
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a
│   │   │   ├── binary         -> (prebuilt libs)
│   │   │   ├── object         -> (prebuilt libs)
│   │   │   ├── shared         -> (prebuilt libs)
│   │   │   └── static         -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (same as above)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (snapshot modules)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   └── x86                    -> (same as above)
└── (other vendor versions)    -> (same as above)

Kompilowanie obrazów dostawców

Korzystając z artefaktów kompilacji zrzutów VNDK i zrzutu dostawcy, możesz skompilować vendor.img niezależnie od wersji Androida w drzewie źródłowym, co umożliwia tworzenie mieszanych wersji obrazów. Po zainstalowaniu zrzutu VNDK i zrzutu dostawcy ustaw BOARD_VNDK_VERSION na wersję dostawcy. Przykład:

# BoardConfig.mk
BOARD_VNDK_VERSION := 29

Gdy BOARD_VNDK_VERSION jest ustawiona na wartość inną niż current, system kompilacji:

  • włącza moduły zrzutu VNDK i moduły zrzutu dostawcy w wersji BOARD_VNDK_VERSION; każdy moduł zrzutu zastępuje moduł źródłowy C++ o tej samej nazwie;
  • ustawia ro.vndk.version na BOARD_VNDK_VERSION;
  • instaluje moduły zrzutu VNDK w wersji BOARD_VNDK_VERSION w katalogu system_ext.