System kompilacji Soong

Przed wersją 7.0 system Android używał GNU Make wyłącznie w celu opisania i wykonania jej reguł kompilacji. System tworzenia kompilacji były powszechnie obsługiwane i używane, ale na skalę Androida były wolne i podatne na błędy. nieskalowalne i trudne do przetestowania. System kompilacji Soong zapewnia elastyczność niezbędną do tworzenia aplikacji na Androida.

Z tego powodu oczekuje się od deweloperów platform Nagraj jak najwcześniej. Wyślij pytania do tworzenie Androida Grup dyskusyjnych Google, aby uzyskać pomoc.

Co to jest Soong?

System kompilacji Soong został wprowadzony w Androidzie 7.0 (Nougat), aby zastąpić Markę. Wykorzystuje Kati GNU Narzędzie do tworzenia klonów i system kompilacji Ninja w celu przyspieszenia kompilacji Androida.

Zobacz Android Marka Build System w Android Open Source Project (AOSP) dla ogólnego opisu instrukcje, oraz Tworzenie zmian systemowych dla programistów Android.mk w celu uzyskania informacji o modyfikacjach wymaganych do przejścia z trybu tworzenia na utwór.

Przejrzyj wpisy związane z kompilacją w glosariusz z definicjami kluczowych pojęć Szczegółowe informacje znajdziesz w plikach referencyjnych do utworów.

Porównanie tworzenia i piosenek

Oto porównanie konfiguracji tworzenia z narzędziem Soong, które osiągnęło taką samą skuteczność plik 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 wersji testowej znajdziesz tutaj Prosta konfiguracja kompilacji.

Objaśnienie pól w pliku Android.bp znajdziesz tutaj: Format 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ą nosić taką samą nazwę jak i analizy źródeł. Na przykład cc_prebuilt_binary o nazwie foo, jeśli istnieje już element cc_binary o tej samej nazwie. Dzięki temu pozwala deweloperom decydować, którą wersję umieścić usługi. Jeśli konfiguracja kompilacji zawiera obie wersje, flaga prefer w definicji gotowego modułu określa, która wersja ma priorytet. Zwróć uwagę, że niektóre gotowe moduły mają nazwy, które nie zaczynają się od prebuilt, na przykład android_app_import.

Moduły przestrzeni nazw

Dopóki Android nie przejdzie pełnej konwersji z Marki na Song, konfiguracja produktu musi określać wartość PRODUCT_SOONG_NAMESPACES. To powinna być rozdzielaną spacjami listą przestrzeni nazw, które Soong eksportuje do ma zostać stworzona za pomocą polecenia m. Po zakończeniu konwersji Androida na Soong szczegóły dotyczące włączania przestrzeni nazw mogą ulec zmianie.

Program Soong umożliwia modułom znajdującym się w różnych katalogach możliwość określenia o takiej samej nazwie, o ile każdy moduł jest zadeklarowany w oddzielnej przestrzeni nazw. O przestrzeń nazw może być zadeklarowana w ten sposób:

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

Pamiętaj, że przestrzeń nazw nie ma właściwości name; jego ścieżka jest automatycznie jako jego nazwę.

Każdy moduł Soong ma przypisaną przestrzeń nazw na podstawie swojej lokalizacji w drzewie. Każdy moduł Soong mieści się w przestrzeni nazw zdefiniowanej przez Plik soong_namespace został znaleziony w pliku Android.bp w bieżącym katalogu lub w katalogu nadrzędnym. Jeśli nie zostanie znaleziony taki moduł soong_namespace, moduł jest 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. Następnie, jeśli D jest pełną i jednoznaczną nazwą formularza //namespace:module, tylko przeszukana jest przestrzeń nazw o podanej nazwie modułu.
  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 wyszukuje moduł o nazwie D w przestrzenie nazw I1, I2, I3...
  4. Soong sprawdza się w głównej przestrzeni nazw.