Session 5: Android Build System LO52 - Automne 2014 Fabien BRISSET 2 mai 2014 fabien.brisset@utbm.fr www.utbm.fr
Droits de reproduction Copyright 2013-2014, Fabien Brisset, Copyright 2004-2014, Free Electrons (Maxime Ripard) License : Creative Commons Attribution - Share Alike 3.0 http://creativecommons.org/licenses/by-sa/3.0/fr Document original : Android System Development Vous êtes libre de : Partager : reproduire, distribuer et communiquer l oeuvre Remixer : adapter l oeuvre D utiliser cette oeuvre à des fins commerciales Selon les conditions suivantes : Attribution : vous devez attribuer l oeuvre de la manière indiquée par l auteur de l oeuvre ou le titulaire des droits. Partage dans les mêmes conditions : si vous modifiez, transformez ou adaptez cette oeuvre, vous n avez le droit de distribuer votre création que sous une licence identique ou similaire à celle-ci. N importe laquelle de ces conditions peut être levée si vous avez l autorisation du titulaire des droits. Votre utilisation équitable et autres droits ne sont en aucune manière affectés par ce qui a été cité ci-dessus. 2/39 www.utbm.fr
Sommaire 1 Présentation du système de production d Android 2 Première compilation 3 L ajout d un nouveau composant, produit 4 Questions? 3/39 www.utbm.fr
Sommaire 1 Présentation du système de production d Android 2 Première compilation 3 L ajout d un nouveau composant, produit 4 Questions? 4/39 www.utbm.fr
Build System Un build system permet : D aggréger un ensemble de composants logiciels dans une image fonctionnelle d un système De permettre la production de cette même image la plus aisée possible Le build system utilisé pour les composants est celui couramment utilisé pour le système complet Exemples : OpenEmbedded/Yocto Buildroot... 5/39 www.utbm.fr
Android Build System Android Build System : Utilise son propre build system indépendant basé sur GNU/Make Build system unique et harmonisé pour tous les composants et simple à utiliser Point négatif : Intégration d un composant nécessite la reécriture du (des) Makefile(s) pour être intégré dans Android 6/39 www.utbm.fr
Sommaire 1 Présentation du système de production d Android 2 Première compilation 3 L ajout d un nouveau composant, produit 4 Questions? 7/39 www.utbm.fr
Première compilation Android $ source build/envsetup.sh including device/moto/stingray/vendorsetup.sh including device/moto/wingray/vendorsetup.sh including device/samsung/crespo/vendorsetup.sh including device/samsung/crespo4g/vendorsetup.sh including device/samsung/maguro/vendorsetup.sh including device/samsung/toro/vendorsetup.sh including device/samsung/torospr/vendorsetup.sh including device/samsung/tuna/vendorsetup.sh including device/ti/panda/vendorsetup.sh including sdk/bash_completion/adb.bash 8/39 www.utbm.fr
Première compilation Android (2) $ lunch You re building on Linux Lunch menu... pick a combo: 1. full-eng 2. full_x86-eng 3. vbox_x86-eng... 12. full_panda-userdebug Which would you like? [full-eng] 12 ============================================ 9/39 www.utbm.fr
Première compilation Android (3) ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.0.4 TARGET_PRODUCT=full_panda TARGET_BUILD_VARIANT=userdebug TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=XXXXXXX ============================================ $ make [-jx] 10/39 www.utbm.fr
Sortie de compilation Code généré par la production + images système sous répertoire out à la racine de l AOSP Deux répertoires dans out : host pour les outils de debug, les tests CTS, les binaires pour Android target qui contient : Les fichiers compilés L arborescence de l image système Les images système 11/39 www.utbm.fr
Nettoyer une production make clean = rm -rf out/ make clobber qui efface les fichiers générés make installclean : efface seulement les parties de code qui ont besoin d être recompilé lors d un changement de configuration 12/39 www.utbm.fr
Variables d environnement Script à sourcer avant toute production (à faire dans chaque Shell utilisé) build/envsetup.sh Il va faire 2 choses : Création et configuration de plusieurs variables d environnement Parcours et analyse des fichiers vendorsetup.sh (liste des cibles possibles) Quelques exemples de variables d environnement : ANDROID EABI TOOLCHAIN/ANDROID TOOLCHAIN : chemin vers la toolchain précompilée ANDROID BUILD PATHS : un équivalent de la variable PATH mais pour les outils Android utilisés pour la production JAVA HOME/ANDROID JAVA TOOLCHAIN/ANDROID PRE BUILD PATHS : chemin vers les outils Java OUT/ANDROID PRODUCT OUT : chemin vers les fichiers générés lors de la compilation 13/39 www.utbm.fr
Variables d environnement (2) vendorsetup.sh : définit la liste des cibles qui peuvent être produites Exemple : $ cat device/ti/panda/vendorsetup.sh #... # add_lunch_combo full_panda-userdebug 14/39 www.utbm.fr
Les commandes à connaître Commandes définies par le script : lunch : permet de définir la target à produire croot : permet de revenir à la racine des sources de l AOSP m : alias à make pour exécuter la compilation complète mm : produit les modules définis dans le répertoire courant mmm : idem à mm mais en spécifiant le répertoire cgrep : exécute un grep dans les fichiers C/C++ jgrep : exécute un grep dans les fichiers Java resgrep : exécute un grep dans les fichiers ressources godir : aller dans le répertoire où se trouve le fichier donné en argument 15/39 www.utbm.fr
Configuration du Build System Build System d Android est assez figé et peu customisable Certains paramètres comme les CFLAGS ou bien la sortie de la production peuvent être personnalisés Deux possibilités pour customiser : A travers la commande lunch et le nouveau type de plateforme ajouté Créer/modifier le fichier buildspec.mk en se basant sur build/buildspec.mk.default 16/39 www.utbm.fr
La commande lunch Ajoutée par l appel à build/envsetup.sh Permet de configurer le système de build : Soit en passant le nom de cible en paramètre Soit en choisissant une option dans la liste affichée Possible d ajouter une nouvelle config via add lunch combo Présent dans les fichiers vendorsetup.sh 17/39 www.utbm.fr
La commande lunch (2) Configure aussi des variables d environnement spécifiques : TARGET PRODUCT : produit à builder TARGET BUILD VARIANT : type de production parmi : user : production finale qui se retrouve sur le produit. Aucun symbole de debug ou assertion incluse userdebug : inclut le user + quelques symboles ou librairies supplémentaires pour le debug eng : inclut toutes les informations de debug possible TARGET SIMULATOR : indique si la production est un simulateur ou non TARGET BUILD TYPE : release ou debug 18/39 www.utbm.fr
Sommaire 1 Présentation du système de production d Android 2 Première compilation 3 L ajout d un nouveau composant, produit 4 Questions? 19/39 www.utbm.fr
Ajouter un nouveau composant On retrouve dans Android : Des librairies natives Des librairies tierces-parties compilées pour Android Des binaires Des applications Java Android Ces différents éléments ont une dénomination commune : composant Le mécanisme de Makefile spécifique d Android permet de définir ces composants et leurs types 20/39 www.utbm.fr
Ajouter un nouveau composant (2) Exemple de fichier.mk pour le composant tinyxml # C o p y r i g h t 2005 The Android Open Source P r o j e c t # # Android. mk f o r TinyXml. # # Add DTIXML USE STL to CFLAGS to use STL. # commonsources := \ t i n y x m l. cpp \ t i n y x m l p a r s e r. cpp \ t i n y x m l e r r o r. cpp \ t i n y s t r. cpp 21/39 www.utbm.fr
Ajouter un nouveau composant (3) # For t h e h o s t # ===================================================== LOCAL PATH:= $ ( c a l l my d i r ) i n c l u d e $ (CLEAR VARS) LOCAL SRC FILES:= \ $ ( commonsources ) LOCAL MODULE:= l i b t i n y x m l LOCAL CFLAGS+= $ (TOOL CFLAGS) LOCAL LDFLAGS:= $ (TOOL LDFLAGS) l s t d c++ l c i n c l u d e $ ( BUILD HOST STATIC LIBRARY ) 22/39 www.utbm.fr
Ajouter un nouveau composant (4) # For t h e d e v i c e # ===================================================== i n c l u d e $ (CLEAR VARS) LOCAL SRC FILES:= \ $ ( commonsources ) LOCAL MODULE:= l i b t i n y x m l LOCAL MODULE TAGS:= o p t i o n a l i n c l u d e $ ( BUILD SHARED LIBRARY ) 23/39 www.utbm.fr
Ajouter un nouveau composant (5) Toute variable est préfixée LOCAL include $(CLEAR VARS) permet de nettoyer les variables précedemment positionnées include $(BUILD XXX) permet de définir ce que l on doit produire au final Différentes variables LOCAL : LOCAL SRC FILES : permet de définir les sources à compiler LOCAL CFLAGS, LOCAL LDFLAGS : permet de définir des flags particuliers pour la compilation et le link LOCAL MODULE : permet de définir le nom du module (l extension sera ajoutée automatiquement dans le cadre d une librairie) LOCAL PACKAGE NAME : nom du package (dans le cadre de la production de composants de type APK) LOCAL SHARED LIBRARIES : permet de spécifier les dépendances du module à certaines librairies 24/39 www.utbm.fr
Ajouter un nouveau composant (6) LOCAL MODULE TAGS : permet de définir dans quel variante de build ce composant sera produit. La valeur optional est une valeur en plus de eng, user et userdebug permettant de spécifier la non-intégration du composant au build final Quelques exemples de types de composants : BUILD EXECUTABLE : binaire BUILD JAVA LIBRARY : un fichier jar. Utilisé pour les extensions du framework Android BUILD SHARED LIBRARY : une librairie partagée BUILD STATIC LIBRARY : une librairie statique BUILD PREBUILT : pour les composants pré-compilés qu il suffit d inclure au build existant 25/39 www.utbm.fr
Ajouter un nouveau composant (7) Il existe d autres variantes pour les outils host ou autres types de composants Quelques macros utiles utilisées par le système de build Android : my-dir : répertoire courant all-makefiles-under : permet dans le cadre de composants complexes constitués de plusieurs éléments d appeler make de manière récursive Liste complète de ces macros peut se trouver dans build/core/definitions.mk Production d un composant : commande : make <nom composant>/make clean - <nom composant> les fichiers générés sont sous out/target/product/<nom produit>/obj/<type de composant>/<nom du composant> intermediates Cependant, cela ne fait que produire le composant mais ne l intègre pas à l image finale Pour cela, spécifier dans la définition du produit l ajout du composant à travers la variable PRODUCT PACKAGES dans laquelle est spécifié le nom du composant 26/39 www.utbm.fr
Ajouter un nouveau produit Android supporte aujourd hui un certain nombre de produits Un produit est une configuration particulière pour une carte d un vendeur donné Il est possible pour un développeur de définir son propre produit : soit en héritant d un produit existant en utilisant les mécanismes d héritage mis à disposition pour les fichiers mk soit en repartant de zéro Un produit est défini au niveau de l aosp sous device/<vendeur>/<produit> 27/39 www.utbm.fr
Ajouter un nouveau produit (2) Exemple d arborescence pour la pandaboard (non exhaustive pour se concentrer sur l essentiel) : $ ls device/ti/panda/ Android.mk AndroidProducts.mk BoardConfig.mk CleanSpec.mk device.mk full_panda.mk init.omap4.rc init.omap4.usb.rc overlay ueventd.omap4.rc vendorsetup.sh 28/39 www.utbm.fr
Ajouter un nouveau produit (3) vendorsetup.sh : Permet d ajouter des cibles à produire au menu de la commande lunch add lunch combo <nom de la cible à produire>-<variante> Va appeler le fichier mk portant le nom de la cible à produire CleanSpec.mk : fichier pour les directives de make clean. Toujours le même : $(call add-clean-step, rm -f $(PRODUCT OUT)/system/build.prop) (x2) Un fichier Android.mk peut être nécessaire en cas de composants tiers qui seraient sous le projet device init.<nom carte>.rc / init.<nom carte>.usb.rc / ueventd.<nom carte>.rc Le nom de la carte se retrouve dans /proc/cpuinfo Hardware : OMAP4 Panda Board : init.omap4pandaboard.rc Directives de démarrage sous forme d une syntaxe particulière à Android 29/39 www.utbm.fr
Ajouter un nouveau produit (4) overlay répertoire contenant les ressources que l on cherche à surcharger (fond d écran, configuration XML,... ) la structure de ce répertoire doit respecter celle du source Android la variable DEVICE PACKAGE OVERLAYS doit être positionnée dans le fichier <nom de la cible à produire>.mk AndroidProducts.mk : fichier spécifiant le mk pour la production Généralement cela correspond à <nom de la cible à produire>.mk Exemple de contenu : PRODUCT MAKEFILES := $(LOCAL DIR)/full panda.mk BoardConfig.mk : description du produit mais plus liée au hardware Ensemble de variables définissant le jeu d instructions de la CPU, si la carte possède du bluetooth, la taille de l image à produire... Très peu documenté. En cas de portage d une nouvelle carte, besoin de creuser dans le code du projet build 30/39 www.utbm.fr
Ajouter un nouveau produit (5) Exemple de BoardConfig.mk pour une Pandaboard : BOARD USES GENERIC AUDIO := USE CAMERA STUB := t r u e f a l s e # Use t h e non open s o u r c e p a r t s, i f t h e y r e p r e s e n t i n c l u d e vendor / t i / panda / BoardConfigVendor. mk TARGET CPU ABI := armeabi v7a TARGET CPU ABI2 := armeabi TARGET CPU SMP := t r u e TARGET ARCH VARIANT := armv7 a neon ARCH ARM HAVE TLS REGISTER := t r u e BOARD HAVE BLUETOOTH := t r u e TARGET NO BOOTLOADER := t r u e # TARGET NO KERNEL := t r u e 31/39 www.utbm.fr
Ajouter un nouveau produit (6) BOARD KERNEL BASE := 0 x80000000 #BOARD KERNEL CMDLINE := TARGET NO RADIOIMAGE := t r u e TARGET BOARD PLATFORM := omap4 TARGET BOOTLOADER BOARD NAME := panda # R e covery TARGET RECOVERY PIXEL FORMAT := BGRA 8888 TARGET RECOVERY UI LIB := l i b r e c o v e r y u i p a n d a # d e v i c e s p e c i f i c e x t e n s i o n s to t h e u p d a t e r b i n a r y TARGET RELEASETOOLS EXTENSIONS := d e v i c e / t i / panda BOARD EGL CFG := d e v i c e / t i / panda / e g l. c f g #BOARD USES HGL := t r u e #BOARD USES OVERLAY := t r u e USE OPENGL RENDERER := t r u e BOARD USES PANDA GRAPHICS := t r u e 32/39 www.utbm.fr
Ajouter un nouveau produit (7) TARGET USERIMAGES USE EXT4 := t r u e BOARD SYSTEMIMAGE PARTITION SIZE := 268435456 #BOARD SYSTEMIMAGE PARTITION SIZE := 16777216 BOARD USERDATAIMAGE PARTITION SIZE := 536870912 BOARD CACHEIMAGE PARTITION SIZE := 268435456 BOARD CACHEIMAGE FILE SYSTEM TYPE := e x t 4 BOARD FLASH BLOCK SIZE := 4096 BOARD WPA SUPPLICANT DRIVER := NL80211 WPA SUPPLICANT VERSION := VER 0 8 X BOARD WPA SUPPLICANT PRIVATE LIB := l i b d r i v e r c m d w l 1 2 x x BOARD WLAN DEVICE := wl12xx mac80211 #TARGET PROVIDES INIT RC := t r u e #TARGET USERIMAGES SPARSE EXT DISABLED := t r u e 33/39 www.utbm.fr
Ajouter un nouveau produit (8) full panda.mk / device.mk : Fichier(s) définissant le produit et sa production On y trouve différentes directives permettant de spécifier des copies de fichiers, des packages ou un nom de produit Il est possible d utiliser un mécanisme d héritage dans ce fichier afin d éviter des redondances de définition Exemple pour la pandaboard : PRODUCT PACKAGES += \ L i v e W a l l p a p e r s \ L i v e W a l l p a p e r s P i c k e r \ MagicSmokeWallpapers \ V i s u a l i z a t i o n W a l l p a p e r s \ l i b r s j n i 34/39 www.utbm.fr
Ajouter un nouveau produit (9) PRODUCT PROPERTY OVERRIDES := \ n e t. dns1 = 8. 8. 8. 8 \ n e t. dns2 = 8. 8. 4. 4 # I n h e r i t from t h o s e p r o d u c t s. Most s p e c i f i c f i r s t. $ ( c a l l i n h e r i t product, $ ( SRC TARGET DIR ) / p r o d u c t / f u l l b a s e. mk) $ ( c a l l i n h e r i t product, $ ( SRC TARGET DIR ) / p r o d u c t / f u l l b a s e t e l e p h o n y. mk) $ ( c a l l i n h e r i t product, d e v i c e / t i / panda / d e v i c e. mk) $ ( c a l l i n h e r i t product i f e x i s t s, v e ndor / t i / p r o p r i e t a r y / omap4xxx / t i omap4 v endor. mk) PRODUCT NAME := f u l l p a n d a PRODUCT DEVICE := panda PRODUCT BRAND := Android PRODUCT MODEL := Panda PRODUCT MANUFACTURER := T e x a s I n s t r u m e n t s I n c 35/39 www.utbm.fr
Ajouter un nouveau produit (10) PRODUCT PACKAGES permet de définir les composants supplémentaires à ajouter au build de base PRODUCT PROPERTY OVERRIDES permet de surcharger les propriétés par défaut du système Android call inherit-product et call inherit-product-if-exists permet d intégrer des fichiers mk supplémentaires pour avoir une meilleure granularité dans le build pour intégrer des composants tiers ne pouvant être compilés au sein de l AOSP 36/39 www.utbm.fr
Ajouter un nouveau produit (11) Deux autres options intéressantes : PRODUCT CHARACTERISTICS qui permet de définir des caractéristiques génériques à son produit PRODUCT CHARACTERISTICS := t a b l e t, n o s d c a r d PRODUCT COPY FILES qui permet d effectuer durant le build la copie et l intégration de fichiers à l image de l OS. PRODUCT COPY FILES += d e v i c e / t i / panda / r e q u i r e d h a r d w a r e. xml : system / e t c / p e r m i s s i o n s / r e q u i r e d h a r d w a r e. xml 37/39 www.utbm.fr
Sommaire 1 Présentation du système de production d Android 2 Première compilation 3 L ajout d un nouveau composant, produit 4 Questions? 38/39 www.utbm.fr
Références Android System Development Maxime Ripard (Free Electrons) Embedded Android Karim Yaghmour chez O Reilly A la découverte d Android série d articles écrits par Benjamin Zores pour GNU/Linux Magazine France Android Device Porting Walkthrough présentation de Benjamin Zores à l Android Builder Summit 2012 Dive Into Android Networking - présentation de Benjamin Zores à l Embedded Linux Conference Europe 2012 39/39 www.utbm.fr