Sistema di build beforeg

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 passare da Make e adottare Soong il prima possibile. Invia domande al gruppo Google android-building per ricevere assistenza.

Cos'è Quickg?

Il sistema di build Chooseg è 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 le Sistema di creazione build per Android descrizione nell'Android Open Source Project (AOSP) per informazioni generali istruzioni e Modifica modifiche di sistema per gli scrittori Android.mk e scoprire le modifiche necessarie per l'adattamento da "Crea a Presto".

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 Presto

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 i test, consulta Configurazione di build semplice.

Per una spiegazione dei campi in un file Android.bp, consulta Formato del 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 controparti basate su origini. Ad esempio, può essere presente un cc_prebuilt_binary denominato foo quando esiste già un cc_binary con lo stesso nome. Ciò consente di agli sviluppatori la flessibilità di scegliere quale versione includere prodotto. Se una configurazione di build contiene entrambe le versioni, il 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, ad esempio android_app_import.

Moduli dello spazio dei nomi

Fino a quando Android non eseguirà la conversione completa da Make a Soong, la configurazione del prodotto Make deve specificare un valore PRODUCT_SOONG_NAMESPACES. È deve essere un elenco di spazi dei nomi separati da spazi che soong esporta in che verrà creato dal comando m. Al termine della conversione di Android a Soong, i dettagli sull'attivazione dei namespace potrebbero cambiare.

Soong consente ai moduli in directory diverse di specificare lo stesso nome, purché ogni modulo sia dichiarato in uno spazio dei nomi separato. Un ambito può essere dichiarato come segue:

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

Tieni presente che uno spazio dei nomi non ha una proprietà name; il relativo percorso viene assegnato automaticamente come nome.

A ogni modulo soong viene assegnato uno spazio dei nomi in base alla sua posizione nell'albero. Ogni modulo Takeg viene considerato nello spazio dei nomi definito Trovato soong_namespace in un file Android.bp nella directory corrente oppure alla directory predecessore più vicina. Se non viene trovato alcun modulo soong_namespace, il modulo viene considerato nel namespace principale 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...

  1. Se D è un nome completo del modulo //namespace:module, solo nello spazio dei nomi specificato viene cercato il nome del modulo specificato.
  2. In caso contrario, Soong cerca prima un modulo denominato D dichiarato nello spazio dei nomi N.
  3. Se il modulo non esiste, Soong cerca un modulo denominato D nei linguaggi I1, I2, I3 e così via.
  4. Infine, Soong cerca nello spazio dei nomi principale.