System kompilacji Soong

Przed wydaniem Androida 7.0 system Android używał wyłącznie GNU Make do opisania i wykonania swoich reguł kompilacji. System kompilacji jest powszechnie obsługiwany i używany, ale na Androida system stał się powolny, podatny na błędy, nieskalowalny i trudny do testowania. System kompilacji Soong zapewnia elastyczność niezbędną do tworzenia kompilacji na Androida.

Z tego powodu oczekuje się, że deweloperzy platform jak najszybciej odejdą od tworzenia i wdrażania funkcji. Aby uzyskać pomoc, wyślij pytania do grupy dyskusyjnej Google android-building.

Co to jest Soong?

System kompilacji Soong został wprowadzony w Androidzie 7.0 (Nougat), aby zastąpić Markę. Wykorzystuje narzędzie Kati GNU Make clone i komponent systemu kompilacji Ninja, by przyspieszyć kompilacje Androida.

Zapoznaj się z opisem Android Make Build System w projekcie Android Open Source Project (AOSP) zawierającym ogólne instrukcje i artykuł na temat tworzenia zmian w systemie Android.mk Writers, aby dowiedzieć się więcej o zmianach, które trzeba wprowadzić, aby przejść z programu Make do Soong.

Definicje kluczowych terminów znajdziesz we wpisach dotyczących kompilacji w słowniku, a szczegółowe informacje znajdziesz w plikach referencyjnych Soong.

Porównanie tworzenia i piosenek

Oto porównanie konfiguracji tworzenia z narzędziem Soong, które daje taki sam efekt w pliku konfiguracji Soong (planu lub .bp).

Przykład

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

Przykład utworu

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

Przykłady konfiguracji Soong w przypadku testów znajdziesz w sekcji Prosta konfiguracja kompilacji.

Omówienie pól w pliku Android.bp znajdziesz w artykule o formacie pliku Android.bp.

Moduły specjalne

Niektóre grupy modułów specjalnych mają unikalne cechy.

Moduły domyślne

Moduł domyślnych pozwala powtarzać te same właściwości w wielu modułach. Na przykład:

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

Gotowe moduły

Niektóre gotowe typy modułów mogą mieć taką samą nazwę jak jego odpowiedniki oparte na źródle. Na przykład może istnieć element cc_prebuilt_binary o nazwie foo, gdy istnieje już obiekt cc_binary o tej samej nazwie. Zapewnia to deweloperom swobodę wyboru wersji, która ma zostać użyta w produkcie. Jeśli konfiguracja kompilacji zawiera obie wersje, wartość flagi prefer w definicji gotowego modułu wskazuje, która wersja ma priorytet. Pamiętaj, że niektóre gotowe moduły mają nazwy, które nie zaczynają się od prebuilt, np. android_app_import.

Moduły przestrzeni nazw

Dopóki Android nie dokona pełnej konwersji z Maker na Soong, konfiguracja tworzenia produktu musi określać wartość PRODUCT_SOONG_NAMESPACES. Jego wartością powinna być rozdzielona spacjami lista przestrzeni nazw, które Soong eksportuje do tworzenia w celu utworzenia za pomocą polecenia m. Po zakończeniu konwersji Androida na Soong szczegóły włączania przestrzeni nazw mogą się zmienić.

Soong umożliwia modułom znajdującym się w różnych katalogach określenie tej samej nazwy, o ile każdy moduł jest zadeklarowany w osobnej przestrzeni nazw. Przestrzeń nazw może być zadeklarowana w ten sposób:

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

Zwróć uwagę, że przestrzeń nazw nie ma właściwości „name”, a jej ścieżka jest automatycznie przypisywana jako nazwa.

Każdy moduł Soong ma przypisaną przestrzeń nazw na podstawie swojej lokalizacji w drzewie. Każdy moduł Soong znajduje się w przestrzeni nazw zdefiniowanej przez obiekt soong_namespace znajdujący się w pliku Android.bp w bieżącym lub najbliższym katalogu nadrzędnym. W przypadku braku takiego modułu soong_namespace jest on uważany za znajdujący się w niejawnej głównej przestrzeni nazw.

Oto przykład: Soong próbuje rozwiązać zależność D zadeklarowaną przez moduł M w przestrzeni nazw N, która importuje przestrzenie nazw I1, I2, I3...

  1. Jeśli wtedy D jest pełną nazwą formularza //namespace:module, dla określonej nazwy modułu wyszukiwana jest tylko określona przestrzeń nazw.
  2. W przeciwnym razie Soong najpierw szuka modułu o nazwie D zadeklarowanego w przestrzeni nazw N.
  3. Jeśli taki moduł nie istnieje, Soong szuka modułu o nazwie D w przestrzeniach nazw I1, I2, I3...
  4. Soong sprawdza się w głównej przestrzeni nazw.