Prima del rilascio di Android 7.0, Android utilizzava GNU Make esclusivamente per descrivere ed eseguire le sue regole di compilazione. Il sistema di compilazione Make è supportato e utilizzato ampiamente, ma su larga scala di Android è diventato lento, soggetto a errori, non scalabile e difficile da testare. Il sistema di compilazione Soong offre la flessibilità necessaria per le build Android.
Per questo motivo, gli sviluppatori di piattaforme dovrebbero eseguire il passaggio da Make and Adotti Soong il prima possibile. Invia domande al gruppo Google android-building per ricevere assistenza.
Che cos'è Soong?
Il sistema di compilazione Soong è stato introdotto in Android 7.0 (Nougat) per sostituire Make. Sfrutta lo strumento di clonazione GNU Kati e il componente del sistema di compilazione Ninja per velocizzare le build di Android.
Consulta la descrizione del sistema di compilazione Android Make nell'Android Open Source Project (AOSP) per le istruzioni generali e per le modifiche al sistema di compilazione per gli autori di Android.mk per scoprire le modifiche necessarie per passare da Make a Soong.
Consulta le voci relative alla compilazione nel glosario per le definizioni dei termini chiave e i file di riferimento Soong per i dettagli completi.
Confronto tra Make e soong
Di seguito è riportato un confronto tra la configurazione di Make e quella di Soong per ottenere lo stesso risultato in un file di configurazione Soong (Blueprint o .bp
).
Fai un esempio
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)
Esempio di Soong
cc_library_shared {
name: "libxmlrpc++",
rtti: true,
cppflags: [
"-Wall",
"-Werror",
"-fexceptions",
],
export_include_dirs: ["src"],
srcs: ["src/**/*.cpp"],
target: {
darwin: {
enabled: false,
},
},
}
Per esempi di configurazione di soong specifici per il test, vedi Configurazione semplice della build.
Per una spiegazione dei campi in un file Android.bp, consulta la pagina relativa al formato file Android.bp.
Moduli speciali
Alcuni gruppi di moduli speciali hanno caratteristiche uniche.
Moduli predefiniti
Un modulo predefinito può essere utilizzato per ripetere le stesse proprietà in più moduli. Ad esempio:
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}
Moduli predefiniti
Alcuni tipi di moduli predefiniti consentono a un modulo di avere lo stesso nome delle sue controparti basate su origini. Ad esempio, può essere presente un elemento cc_prebuilt_binary
denominato foo
quando esiste già un elemento cc_binary
con lo stesso nome. Questo offre agli sviluppatori la flessibilità di scegliere quale versione includere nel prodotto finale. Se una configurazione di compilazione contiene entrambe le versioni, il valore del flag prefer
nella definizione del modulo predefinito indica quale versione ha la priorità.
Tieni presente che alcuni moduli predefiniti hanno nomi che non iniziano con prebuilt
, come android_app_import
.
Moduli dello spazio dei nomi
Finché Android non esegue completamente la conversione da Make a soong, la configurazione del prodotto
deve specificare un valore PRODUCT_SOONG_NAMESPACES
. Il suo valore deve essere un elenco di spazi dei nomi separati da spazi che Soong esporta in Make per essere compilato dal comando m
. Una volta completata la conversione di Android in Presto,
i dettagli dell'abilitazione degli spazi dei nomi potrebbero cambiare.
prestog offre ai moduli in directory diverse la possibilità di specificare lo stesso nome, purché ogni modulo venga dichiarato all'interno di uno spazio dei nomi separato. Uno spazio dei nomi può essere dichiarato in questo modo:
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
Tieni presente che uno spazio dei nomi non ha una proprietà name; il suo percorso viene assegnato automaticamente come nome.
A ogni modulo Takeg viene assegnato uno spazio dei nomi in base alla sua posizione nell'albero.
Ogni modulo Soong è considerato nello spazio dei nomi definito dal soong_namespace
trovato in un file Android.bp
nella directory corrente o nella directory principale più vicina. Se non viene trovato alcun modulo soong_namespace
di questo tipo, il modulo viene considerato nello spazio dei nomi radice implicito.
Ecco un esempio: Soong tenta di risolvere la dipendenza D dichiarata dal modulo M nello spazio dei nomi N che importa gli spazi dei nomi I1, I2, I3…
- Se D è un nome completo del tipo
//namespace:module
, viene eseguito una ricerca solo nell'ambito specificato per il nome del modulo specificato. - In caso contrario, Soong cerca prima un modulo denominato D dichiarato nello spazio dei nomi N.
- Se quel modulo non esiste, soong cerca un modulo denominato D negli spazi dei nomi I1, I2, I3...
- Infine, Soong cerca nello spazio dei nomi principale.