Przed wydaniem Androida 7.0 system Android używał wyłącznie GNU Make do opisania i wykonania swoich reguł kompilacji. System kompilacji Make jest szeroko obsługiwany i używany, ale w przypadku Androida stał się powolny, podatny na błędy, nierozwijalny i trudny do przetestowania. System kompilacji Song zapewnia elastyczność wymaganą w przypadku kompilacji na Androida.
Z tego powodu oczekuje się, że deweloperzy platform jak najszybciej odejdą od tworzenia i wdrażania funkcji. Aby uzyskać pomoc, prześlij pytania do grupy Google android-building.
Co to jest Soong?
System kompilacji Soong został wprowadzony w Androidzie 7.0 (Nougat), aby zastąpić Markę. Używa ona narzędzia do klonowania Kati GNU Make i komponentu systemu kompilacji Ninja, aby przyspieszyć kompilację 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 w artykule o kompilacji w glosariuszu, a pełne informacje – w plikach referencyjnych Songa.
Porównanie Make i Soong
Oto porównanie konfiguracji tworzenia z narzędziem Soong, które daje taki sam efekt w pliku konfiguracji Soong (planu lub .bp
).
Tworzenie przykładu
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 Soong
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.
Objaśnienia pól w pliku Android.bp znajdziesz w sekcji Format pliku Android.bp.
Moduły specjalne
Niektóre grupy modułów specjalnych mają unikalne cechy.
Moduły domyślne
Moduł domyślny może służyć do powtarzania tych samych właściwości w różnych 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
, na przykład 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ść powinna być rozdzieloną spacjami listą przestrzeni nazw, które Soong eksportuje do Make, aby zostały skompilowane przez polecenie m
. Po zakończeniu konwersji Androida na Soong szczegóły włączania przestrzeni nazw mogą ulec zmianie.
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 jest uważany za znajdujący się w przestrzeni nazw zdefiniowanej przez soong_namespace
znaleziony w pliku Android.bp
w bieżącym katalogu lub w 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 itd.
- Jeśli D jest pełną nazwą w formie
//namespace:module
, tylko w określonym zakresie nazw szuka się określonego modułu. - W przeciwnym razie Soong najpierw szuka modułu o nazwie D zadeklarowanego w przestrzeni nazw N.
- Jeśli moduł nie istnieje, Soong szuka modułu o nazwie D w przestrzeniach nazw I1, I2, I3 itd.
- Soong sprawdza się w głównej przestrzeni nazw.