Vor der Veröffentlichung von Android 7.0 wurde ausschließlich GNU Make verwendet, um die Build-Regeln zu beschreiben und auszuführen. Das Make-Buildsystem wird weithin unterstützt und verwendet, war aber aufgrund der Größe von Android langsam, fehleranfällig, nicht skalierbar und schwer zu testen. Das Soong-Buildsystem bietet die für Android-Builds erforderliche Flexibilität.
Aus diesem Grund sollten Plattformentwickler so bald wie möglich von Make zu Soong wechseln. Senden Sie Fragen an die Android-Entwicklung Google-Gruppe, um Support zu erhalten.
Was ist Soong?
Das Soong-Build-System wurde in Android 7.0 (Nougat) als Ersatz für Make eingeführt. Es nutzt das GNU-Klontool Kati und die Build-Systemkomponente Ninja, um Android-Builds zu beschleunigen.
Eine allgemeine Anleitung und Informationen zu den Änderungen, die für die Umstellung von Make auf Soong erforderlich sind, finden Sie in der Beschreibung des Android Make-Build-Systems im Android Open Source Project (AOSP).
Siehe die build-bezogenen Einträge in der Glossar mit Definitionen wichtiger Begriffe und Detaillierte Informationen findest du in den Titel-Referenzdateien.
Vergleich zwischen Make-and-Song
Hier sehen Sie einen Vergleich der Make-Konfiguration mit der Soong-Konfiguration in einer Soong-Konfigurationsdatei (Blueprint oder .bp
).
Beispiel erstellen
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)
Soong-Beispiel
cc_library_shared {
name: "libxmlrpc++",
rtti: true,
cppflags: [
"-Wall",
"-Werror",
"-fexceptions",
],
export_include_dirs: ["src"],
srcs: ["src/**/*.cpp"],
target: {
darwin: {
enabled: false,
},
},
}
Beispiele für testspezifische Soong-Konfigurationen finden Sie unter Einfache Build-Konfiguration.
Eine Erläuterung der Felder in einer Android.bp-Datei finden Sie unter Android.bp-Dateiformat.
Spezielle Module
Einige spezielle Modulgruppen haben einzigartige Merkmale.
Standardmodule
Mit einem Standardmodul können dieselben Eigenschaften in mehreren Modulen wiederholt werden. Beispiel:
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}
Vordefinierte Module
Bei einigen vordefinierten Modultypen kann ein Modul denselben Namen wie sein
quellenbasierte Gegenstücke. So kann es beispielsweise eine cc_prebuilt_binary
mit dem Namen foo
geben, wenn bereits eine cc_binary
mit demselben Namen vorhanden ist. Dadurch erhalten Sie
können Entwickelnde flexibel wählen, welche Version sie in ihre
Produkt. Wenn eine Build-Konfiguration beide Versionen enthält, gibt der Flag-Wert prefer
in der Definition des vorgefertigten Moduls an, welche Version Vorrang hat.
Einige vorgefertigte Module haben Namen, die nicht mit prebuilt
beginnen.
z. B. android_app_import
.
Namespace-Module
Bis Android vollständig von Make-up zu Soong konvertiert wird, ist die Make-Produktkonfiguration
muss einen PRODUCT_SOONG_NAMESPACES
-Wert angeben. Das
Der Wert sollte eine durch Leerzeichen getrennte Liste von Namespaces sein, die Soong in den Tab "Make" exportiert.
wird mit dem Befehl m
erstellt. Nach Abschluss der Umstellung von Android auf Soong können sich die Details zur Aktivierung von Namespaces ändern.
Soong ermöglicht es, für Module in verschiedenen Verzeichnissen denselben Namen anzugeben, sofern jedes Modul in einem separaten Namespace deklariert ist. Ein Namespace kann so deklariert werden:
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
Hinweis: Ein Namespace hat keine Name-Eigenschaft. Sein Pfad wird automatisch als Name zugewiesen.
Jedem Soong-Modul wird basierend auf seiner Position in der Baumstruktur ein Namespace zugewiesen.
Es wird davon ausgegangen, dass sich jedes Soong-Modul in dem Namespace befindet, der durch das
soong_namespace
in einer Android.bp
-Datei im aktuellen Verzeichnis gefunden oder
dem nächstgelegenen Ancestor-Verzeichnis. Wenn kein solches soong_namespace
-Modul gefunden wird, wird davon ausgegangen, dass sich das Modul im impliziten Stamm-Namespace befindet.
Beispiel: Soong versucht, die Abhängigkeit D aufzulösen, die vom Modul M im Namespace N deklariert wurde und die Namespaces I1, I2 und I3 importiert.
- Wenn D dann ein voll qualifizierter Name der Form
//namespace:module
ist, Der angegebene Namespace wird nach dem angegebenen Modulnamen durchsucht. - Andernfalls sucht Soong zuerst nach einem Modul namens D, das im Namespace N deklariert ist.
- Wenn dieses Modul nicht vorhanden ist, sucht Soong in den Namespaces I1, I2, I3 usw. nach einem Modul mit dem Namen „D“.
- Zuletzt sucht Soong im Stamm-Namespace.