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...
- Następnie, jeśli D jest pełną i jednoznaczną nazwą formularza
//namespace:module
, tylko przeszukana jest przestrzeń nazw o podanej nazwie modułu. - W przeciwnym razie Soong najpierw szuka modułu o nazwie D zadeklarowanego w przestrzeni nazw. N.
- Jeśli taki moduł nie istnieje, Soong wyszukuje moduł o nazwie D w przestrzenie nazw I1, I2, I3...
- Soong sprawdza się w głównej przestrzeni nazw.