Système de compilation Soong

Avant la version 7.0 d'Android, Android utilisait GNU Make exclusivement pour décrire et exécuter ses règles de compilation. Le système de compilation Make est largement pris en charge et utilisé, mais à l'échelle d'Android est devenu lent, sujet aux erreurs, et difficiles à tester. La Système de compilation Soong offre la flexibilité requise pour les builds Android.

Pour cette raison, les développeurs de plates-formes doivent abandonner Soong aussi vite que possible. Envoyez vos questions au construction-android Google Groupes pour bénéficier d'une assistance.

Qu'est-ce que Soong ?

Le système de compilation Soong a été introduit dans Android 7.0 (Nougat) pour remplacer Make. Il exploite le Kati GNU Créer un outil de clonage et un système de compilation Ninja pour accélérer les compilations d'Android.

Consultez le Système de compilation Android Make dans le projet Android Open Source (AOSP) instructions et Compiler les modifications système pour les rédacteurs Android.mk pour en savoir plus sur les modifications nécessaires pour passer de Make à Soong.

Consultez les entrées relatives à la compilation dans le glossaire pour obtenir la définition des termes clés Fichiers de référence Soong pour obtenir des informations complètes

Comparaison de Make et Soong

Voici une comparaison de "Make configuration" avec Soong qui fonctionne de la même manière dans un fichier de configuration Soong (plan ou .bp).

Créer un exemple

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)

Exemple de Soong

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

Pour obtenir des exemples de configuration Soong spécifiques aux tests, consultez Configuration de compilation simple.

Pour une explication des champs dans un fichier Android.bp, consultez Format de fichier Android.bp.

Modules spéciaux

Certains groupes de modules spéciaux présentent des caractéristiques uniques.

Modules par défaut

Un module par défaut peut être utilisé pour répéter les mêmes propriétés dans plusieurs modules. Exemple :

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

Modules prédéfinis

Certains types de modules prédéfinis permettent à un module d'avoir le même nom que son basés sur la source. Par exemple, il peut y avoir un cc_prebuilt_binary foo lorsqu'il existe déjà un élément cc_binary du même nom. Cela vous donne aux développeurs la flexibilité de choisir la version à inclure dans leur produit. Si une configuration de compilation contient les deux versions, l'option prefer dans la définition du module prédéfini détermine la version prioritaire. Notez que le nom de certains modules prédéfinis ne commence pas par prebuilt, comme android_app_import.

Modules d'espaces de noms

Jusqu'à ce qu'Android soit complètement converti de Make en Soong, la configuration du produit Make doit spécifier une valeur PRODUCT_SOONG_NAMESPACES. Son doit être une liste d'espaces de noms séparés par un espace que Soong exporte vers Make à compiler par la commande m. Une fois la conversion d'Android en Soong terminée, les détails de l'activation des espaces de noms peuvent changer.

Soong permet aux modules de différents répertoires de spécifier même nom, à condition que chaque module soit déclaré dans un espace de noms distinct. A peut être déclaré comme suit:

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

Notez qu'un espace de noms ne possède pas de propriété "name". son chemin est automatiquement lui a été attribué comme nom.

Chaque module Soong se voit attribuer un espace de noms en fonction de son emplacement dans l'arborescence. Chaque module Soong est considéré comme appartenant à l'espace de noms défini par le soong_namespace trouvé dans un fichier Android.bp du répertoire actuel ; ou l'ancêtre le plus proche. Si aucun module soong_namespace de ce type n'est trouvé, le module est considéré comme se trouvant dans l'espace de noms racine implicite.

Voici un exemple: Soong tente de résoudre la dépendance D déclarée par le module M. dans l'espace de noms N qui importe les espaces de noms I1, I2, I3...

  1. Ensuite, si D est un nom complet au format //namespace:module, seulement l'espace de noms spécifié est recherché pour le nom de module spécifié.
  2. Sinon, Soong recherche d'abord un module nommé D déclaré dans l'espace de noms Amérique du Nord
  3. Si ce module n'existe pas, Soong recherche un module nommé D dans espaces de noms I1, I2, I3...
  4. Enfin, Soong examine l'espace de noms racine.