Utilisez les informations de cette page pour créer les fichiers de compilation de votre appareil et de votre produit.
Chaque nouveau module Android doit disposer d'un fichier de configuration pour diriger le système de compilation avec les métadonnées du module, les dépendances au moment de la compilation et les instructions de packaging. Android utilise le système de compilation Soong. Pour en savoir plus sur le système de compilation Android, consultez Créer Android.
Comprendre les couches de compilation
La hiérarchie de compilation inclut les couches d'abstraction qui correspondent à la composition physique d'un appareil. Ces calques sont décrits dans le tableau ci-dessous. Chaque couche est liée à celle qui la précède dans une relation de type un à plusieurs. Par exemple, une architecture peut comporter plusieurs cartes, et chaque carte peut comporter plusieurs produits. Vous pouvez définir un élément d'une couche donnée comme une spécialisation d'un élément de la même couche, ce qui élimine la copie et simplifie la maintenance.
Couche | Exemple | Description |
---|---|---|
Produit | myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk | La couche produit définit les spécifications des fonctionnalités d'un produit de distribution, comme les modules à compiler, les paramètres régionaux compatibles et la configuration pour différents paramètres régionaux. En d'autres termes, il s'agit du nom du produit global. Les variables spécifiques au produit sont définies dans les fichiers de compilation de définition du produit. Un produit peut hériter d'autres définitions de produits, ce qui simplifie la maintenance. Une méthode courante consiste à créer un produit de base contenant des fonctionnalités qui s'appliquent à tous les produits, puis à créer des variantes de produits basées sur ce produit de base. Par exemple, deux produits qui ne diffèrent que par leurs radios (CDMA par rapport à GSM) peuvent hériter du même produit de base qui ne définit pas de radio. |
Carte/appareil | marlin, blueline, corail | La couche carte/appareil représente la couche physique de plastique sur l'appareil (c'est-à-dire la conception industrielle de l'appareil). Cette couche représente également les schémas bruts d'un produit. Il s'agit des périphériques de la carte et de leur configuration. Les noms utilisés ne sont que des codes pour différentes configurations de carte/d'appareil. |
Arc | arm, x86, arm64, x86_64 | La couche d'architecture décrit la configuration du processeur et l'interface binaire d'application (ABI) exécutée sur la carte. |
Utiliser des variantes de compilation
Lorsque vous créez un build pour un produit particulier, il est utile d'avoir des variations mineures sur la version finale. Dans une définition de module, le module peut spécifier des balises avec LOCAL_MODULE_TAGS
, qui peut être une ou plusieurs valeurs de optional
(par défaut), debug
et eng
.
Si un module ne spécifie pas de balise (par LOCAL_MODULE_TAGS
), sa balise est définie par défaut sur optional
. Un module facultatif n'est installé que s'il est requis par la configuration du produit avec PRODUCT_PACKAGES
.
Voici les variantes de compilation actuellement définies.
Variant | Description |
---|---|
eng
|
Il s'agit de la saveur par défaut.
|
user
|
Variante destinée à être les bits de la version finale.
|
userdebug
|
Même chose que pour user , à l'exception des éléments suivants :
|
Consignes concernant userdebug
L'exécution de builds userdebug lors des tests aide les développeurs d'appareils à comprendre les performances et la puissance des versions en cours de développement. Pour assurer la cohérence entre les builds user et userdebug, et pour obtenir des métriques fiables dans les builds utilisés pour le débogage, les développeurs d'appareils doivent suivre ces consignes:
- userdebug est défini comme un build utilisateur avec l'accès racine activé, sauf :
- Applications userdebug uniquement exécutées à la demande par l'utilisateur
- Opérations qui ne s'exécutent que pendant la maintenance inactive (sur le chargeur/complètement chargée), par exemple en utilisant
dex2oatd
au lieu dedex2oat
pour les compilations en arrière-plan
- N'incluez pas de fonctionnalités activées/désactivées par défaut en fonction du type de compilation. Les développeurs sont invités à ne pas utiliser de forme de journalisation qui affecte l'autonomie de la batterie, comme la journalisation de débogage ou le vidage de tas.
- Toutes les fonctionnalités de débogage activées par défaut dans userdebug doivent être clairement définies et partagées avec tous les développeurs travaillant sur le projet. Vous ne devez activer les fonctionnalités de débogage que pendant une durée limitée, jusqu'à ce que le problème que vous essayez de déboguer soit résolu.
Personnaliser le build avec des superpositions de ressources
Le système de compilation Android utilise des superpositions de ressources pour personnaliser un produit au moment de la compilation. Les superpositions de ressources spécifient les fichiers de ressources appliqués en plus des valeurs par défaut. Pour utiliser des superpositions de ressources, modifiez le fichier de compilation du projet pour définir PRODUCT_PACKAGE_OVERLAYS
sur un chemin relatif à votre répertoire racine. Ce chemin devient une racine fantôme recherchée avec la racine actuelle lorsque le système de compilation recherche des ressources.
Les paramètres les plus couramment personnalisés se trouvent dans le fichier frameworks/base/core/res/res/values/config.xml.
Pour configurer une superposition de ressources sur ce fichier, ajoutez le répertoire de superposition au fichier de compilation du projet à l'aide de l'une des méthodes suivantes:
PRODUCT_PACKAGE_OVERLAYS := device/device-implementer/device-name/overlay
ou
PRODUCT_PACKAGE_OVERLAYS := vendor/vendor-name/overlay
Ajoutez ensuite un fichier de superposition au répertoire, par exemple:
vendor/foobar/overlay/frameworks/base/core/res/res/values/config.xml
Toutes les chaînes ou les tableaux de chaînes trouvés dans le fichier config.xml
de superposition remplacent celles trouvées dans le fichier d'origine.
Créer un produit
Vous pouvez organiser les fichiers sources de votre appareil de différentes manières. Voici une brève description d'une façon d'organiser une implémentation de Pixel.
Pixel est implémenté avec une configuration d'appareil principale appelée marlin
. À partir de cette configuration de l'appareil, un produit est créé avec un fichier de compilation de définition de produit qui déclare des informations spécifiques au produit sur l'appareil, telles que le nom et le modèle. Vous pouvez consulter le répertoire device/google/marlin
pour voir comment tout cela est configuré.
Écrire des fichiers de compilation de produits
Les étapes suivantes décrivent comment configurer les fichiers de compilation de produits de manière semblable à celle de la gamme de produits Pixel:
- Créez un répertoire
device/<company-name>/<device-name>
pour votre produit. Par exemple,device/google/marlin
. Ce répertoire contiendra le code source de votre appareil, ainsi que les fichiers de compilation permettant de le compiler. - Créez un fichier makefile
device.mk
qui déclare les fichiers et les modules nécessaires à l'appareil. Pour obtenir un exemple, consultezdevice/google/marlin/device-marlin.mk
. - Créez un fichier makefile de définition de produit pour créer un produit spécifique en fonction de l'appareil. Le fichier makefile suivant est extrait de
device/google/marlin/aosp_marlin.mk
à titre d'exemple. Notez que le produit hérite des fichiersdevice/google/marlin/device-marlin.mk
etvendor/google/marlin/device-vendor-marlin.mk
via le fichier de compilation, tout en déclarant les informations spécifiques au produit, telles que le nom, la marque et le modèle.# Inherit from the common Open Source product configuration $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk) PRODUCT_NAME := aosp_marlin PRODUCT_DEVICE := marlin PRODUCT_BRAND := Android PRODUCT_MODEL := AOSP on msm8996 PRODUCT_MANUFACTURER := Google PRODUCT_RESTRICT_VENDOR_FILES := true PRODUCT_COPY_FILES += device/google/marlin/fstab.common:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.marlin $(call inherit-product, device/google/marlin/device-marlin.mk) $(call inherit-product-if-exists, vendor/google_devices/marlin/device-vendor-marlin.mk) PRODUCT_PACKAGES += \ Launcher3QuickStep \ WallpaperPicker
Pour en savoir plus sur les variables spécifiques aux produits que vous pouvez ajouter à vos fichiers de compilation, consultez Définir des variables de définition de produit.
- Créez un fichier
AndroidProducts.mk
qui pointe vers les fichiers make du produit. Dans cet exemple, seul le fichier makefile de définition du produit est nécessaire. L'exemple ci-dessous provient dedevice/google/marlin/AndroidProducts.mk
(qui contient à la fois marlin, le Pixel, et sailfish, le Pixel XL, qui partageait la plupart des configurations):PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/aosp_marlin.mk \ $(LOCAL_DIR)/aosp_sailfish.mk COMMON_LUNCH_CHOICES := \ aosp_marlin-userdebug \ aosp_sailfish-userdebug
- Créez un fichier makefile
BoardConfig.mk
contenant des configurations spécifiques à la carte. Pour obtenir un exemple, consultezdevice/google/marlin/BoardConfig.mk
. - Pour Android 9 et versions antérieures uniquement, créez un fichier
vendorsetup.sh
pour ajouter votre produit (un "combo repas") à la compilation, ainsi qu'une variante de compilation séparée par un tiret. Exemple :add_lunch_combo <product-name>-userdebug
- À ce stade, vous pouvez créer d'autres variantes de produits basées sur le même appareil.
Définir des variables de définition des produits
Les variables spécifiques au produit sont définies dans le fichier make du produit. Le tableau présente certaines des variables gérées dans un fichier de définition de produit.
Variable | Description | Exemple |
---|---|---|
PRODUCT_AAPT_CONFIG
|
Configurations aapt à utiliser lors de la création de packages.
|
|
PRODUCT_BRAND
|
Marque (par exemple, opérateur) pour laquelle le logiciel est personnalisé. | |
PRODUCT_CHARACTERISTICS
|
Caractéristiques aapt pour permettre d'ajouter des ressources spécifiques à une variante à un package.
|
tablet , nosdcard
|
PRODUCT_COPY_FILES
|
Liste de mots comme source_path:destination_path . Le fichier situé dans le chemin d'accès source doit être copié dans le chemin d'accès de destination lors de la compilation de ce produit. Les règles des étapes de copie sont définies dans config/makefile .
|
|
PRODUCT_DEVICE
|
Nom de la conception industrielle. Il s'agit également du nom de la carte, et le système de compilation l'utilise pour localiser BoardConfig.mk .
|
tuna
|
PRODUCT_LOCALES
|
Liste de paires de codes de langue et de pays à deux lettres, séparés par des espaces, qui décrivent plusieurs paramètres pour l'utilisateur, tels que la langue de l'interface utilisateur, l'heure, la date et le format de la devise. Le premier paramètre régional listé dans PRODUCT_LOCALES est utilisé comme paramètre régional par défaut du produit.
|
en_GB , de_DE , es_ES , fr_CA
|
PRODUCT_MANUFACTURER
|
Nom du fabricant. |
acme
|
PRODUCT_MODEL
|
Nom visible par l'utilisateur final du produit final. | |
PRODUCT_NAME
|
Nom visible par l'utilisateur final pour le produit global. S'affiche sur l'écran Paramètres > À propos. | |
PRODUCT_OTA_PUBLIC_KEYS
|
Liste des clés publiques OTA du produit. | |
PRODUCT_PACKAGES
|
Liste des APK et des modules à installer. | Contacts de l'agenda |
PRODUCT_PACKAGE_OVERLAYS
|
Indique si vous devez utiliser des ressources par défaut ou ajouter des superpositions spécifiques aux produits. |
vendor/acme/overlay
|
PRODUCT_SYSTEM_PROPERTIES
|
Liste des attributions de propriétés système au format "key=value" pour la partition système. Les propriétés système des autres partitions peuvent être définies via PRODUCT_<PARTITION>_PROPERTIES , comme dans PRODUCT_VENDOR_PROPERTIES pour la partition du fournisseur. Noms de partition acceptés: SYSTEM , VENDOR , ODM , SYSTEM_EXT et PRODUCT .
|
Configurer la langue et le filtre de paramètres régionaux par défaut du système
Utilisez ces informations pour configurer la langue par défaut et le filtre de paramètres régionaux système, puis activez le filtre de paramètres régionaux pour un nouveau type d'appareil.
Propriétés
Configurez à la fois la langue par défaut et le filtre de paramètres régionaux système à l'aide de propriétés système dédiées:
ro.product.locale
: pour définir les paramètres régionaux par défaut. Cette valeur est initialement définie sur la première locale de la variablePRODUCT_LOCALES
. Vous pouvez remplacer cette valeur. (Pour en savoir plus, consultez le tableau Définir des variables de définition des produits.)ro.localization.locale_filter
: pour définir un filtre de paramètres régionaux, à l'aide d'une expression régulière appliquée aux noms de paramètres régionaux. Par exemple :- Filtre inclusif :
^(de-AT|de-DE|en|uk).*
: n'autorise que l'allemand (variantes de l'Allemagne et de l'Autriche), toutes les variantes de l'anglais et l'ukrainien - Filtre exclusif :
^(?!de-IT|es).*
: exclut l'allemand (variante Italie) et toutes les variantes de l'espagnol.
- Filtre inclusif :
Activer le filtre de paramètres régionaux
Pour activer le filtre, définissez la valeur de la chaîne de la propriété système ro.localization.locale_filter
.
En définissant la valeur de la propriété de filtre et la langue par défaut via oem/oem.prop
lors du calibrage en usine, vous pouvez configurer des restrictions sans intégrer le filtre à l'image système.
Pour vous assurer que ces propriétés sont récupérées à partir de la partition OEM, ajoutez-les à la variable PRODUCT_OEM_PROPERTIES
, comme indiqué ci-dessous:
# Delegation for OEM customization
PRODUCT_OEM_PROPERTIES += \
ro.product.locale \
ro.localization.locale_filter
En production, les valeurs réelles sont écrites dans oem/oem.prop
pour refléter les exigences cibles. Avec cette approche, les valeurs par défaut sont conservées lors du rétablissement de la configuration d'usine. Les paramètres initiaux ressemblent donc exactement à une première configuration pour l'utilisateur.
Définir ADB_VENDOR_KEYS pour se connecter via USB
La variable d'environnement ADB_VENDOR_KEYS
permet aux fabricants d'appareils d'accéder aux builds débogables (-userdebug et -eng, mais pas -user) via adb sans autorisation manuelle.
Normalement, adb génère une clé d'authentification RSA unique pour chaque ordinateur client, qu'il envoie à tous les appareils connectés. Il s'agit de la clé RSA affichée dans la boîte de dialogue d'autorisation adb. Vous pouvez également créer des clés connues dans l'image système et les partager avec le client adb.
Cela est utile pour le développement d'OS et surtout pour les tests, car cela évite d'interagir manuellement avec la boîte de dialogue d'autorisation adb.
Pour créer des clés de fournisseur, une personne (généralement un responsable de la publication) doit:
- Générez une paire de clés à l'aide de
adb keygen
. Pour les appareils Google, Google génère une nouvelle paire de clés pour chaque nouvelle version d'OS. - Vérifiez les paires de clés dans l'arborescence source. Google les stocke dans
vendor/google/security/adb/
, par exemple. - Définissez la variable de compilation
PRODUCT_ADB_KEYS
pour qu'elle pointe vers votre répertoire de clés. Pour ce faire, Google ajoute un fichierAndroid.mk
dans le répertoire de clés avec la valeurPRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub
, ce qui permet de s'assurer de générer une nouvelle paire de clés pour chaque version d'OS.
Voici le fichier makefile que Google utilise dans le répertoire où nous stockons nos paires de clés enregistrées pour chaque version:
PRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub ifeq ($(wildcard $(PRODUCT_ADB_KEYS)),) $(warning ========================) $(warning The adb key for this release) $(warning ) $(warning $(PRODUCT_ADB_KEYS)) $(warning ) $(warning does not exist. Most likely PLATFORM_VERSION in build/core/version_defaults.mk) $(warning has changed and a new adb key needs to be generated.) $(warning ) $(warning Please run the following commands to create a new key:) $(warning ) $(warning make -j8 adb) $(warning LOGNAME=android-eng HOSTNAME=google.com adb keygen $(patsubst %.pub,%,$(PRODUCT_ADB_KEYS))) $(warning ) $(warning and upload/review/submit the changes) $(warning ========================) $(error done) endif
Pour utiliser ces clés de fournisseur, un ingénieur n'a qu'à définir la variable d'environnement ADB_VENDOR_KEYS
pour qu'elle pointe vers le répertoire dans lequel les paires de clés sont stockées.
Cela indique à adb
d'essayer d'abord ces clés canoniques, avant de revenir à la clé hôte générée qui nécessite une autorisation manuelle. Lorsque adb
ne parvient pas à se connecter à un appareil non autorisé, le message d'erreur vous suggère de définir ADB_VENDOR_KEYS
s'il n'est pas déjà défini.