Utilisation avancée : Introduction détaillée à Aroma installer

Par jhowlett468 - Le 18/06/14 - Affichages : 16319
Bonsoir !!

Le but de ce topic est de comprendre le fonctionnement d'Aroma installer ( Amarullz Android ROM MAnifestation ), un programme lançable via recovery en flashant un zip, développé par un membre de XDA, @Amarullz.

Pré-requis pour comprendre ce topic :

Image

Photo du choix du recovery à installer sur un téléphone via un zip Aroma

Image originelle ( s4miniarchive.com ) ICI

Image

Cliquez sur l'image au-dessus pour aller sur le site d'Amarullz ;)

Mon but n'est pas de faire un tuto détaillé ( trop dense et trop pointu pour moi, comme je l'ai déjà dit, mes connaissances sont surtout empiriques ) mais de faire une présentation d'Aroma et de ses possibilités.

Pour aller plus loin avec Aroma, je vous conseille ces 2 topics :

Mais qu'est-ce qu'Aroma et à quoi çà sert ?

Amarullz a écrit:When you install Linux, Windows, Mac or applications on the PC
You can always customize your installation as you want.

WHY CAN'T WE DO THE SAME INSTALLING AN ANDROID ROM?

NOW AROMA Installer
GIVES YOU THIS POSSIBILITY!


En français :
"Quand vous installez Linux, WIndows, Mac OS ou des programmes sur votre ordinateur, vous pouvez personnaliser l'installation.
Pourquoi ne serait-il pas possible de faire de même en installant une ROM sous Android ?
Grâce à Aroma installer, celà est maintenant possible !!"

Les spécificités d'Aroma ? L'install est customisable ( pour chaque paramètre, on peut faire le choix que l'on veut, pour peu que le dev l'ait programmé ), l'interface est tactile ( pas besoin de bourriner les touches volume et power ;) ) et le zip est personnalisable ( pour peu que l'on ait compris son fonctionnement ). Quelques exemples de mods Aroma : les dernières versions de la ROM The Galaxy Project pour I9305 ( la ROM qui tourne sur mon tél ), la ROM Tomcat de @Kris92 ou les mods pour ROM Cyano de la GSTeam ( plus trop active malheureusement :( )

CE TOPIC EST ASSEZ LONG... ET DENSE. AVANT DE FAIRE UNE QUELCONQUE MANIP BASEE SUR CELUI-CI, MERCI DE LE LIRE EN ENTIER, AINSI QUE DANS LA MESURE DU POSSIBLE LES TOPICS CONNEXES.

NI MOI, NI AUCUN MEMBRE DU SITE NE POURRAIT ETRE TENU POUR RESPONSABLE DES DOMMAGES QUE VOUS POURRIEZ OCCASIONNER A VOTRE TELEPHONE EN CAS DE MAUVAISE MANIP' .


Exemple de screens sous Aroma ( crédit images XDA - topic d'origine des images ICI - ces images illustrent juste la partie "graphique", pour la partie prog, j'utiliserai un zip à moi) :

Image
Image

Screenshots et scripts extraits de mon mod Aroma pour ROM The Galaxy Project pour I9305 ( c'est moi qui l'ai fait :mrgreen: ).

Un zip Aroma se présente un peu comme un zip "normal" :

Image

Image

Cependant, en allant plus loin, on trouve quelques différences :

Image

Image

On trouve donc, contrairement à un zip "classique", dans le dossier \META-INF\com\google\android les éléments suivants :
  • un dossier aroma ( contenant diverses ressources comme des icônes comme celles qui s'affichent sur les screens au-dessus, des polices, un éventuel bootanim du zip, des images de démo des fichiers installables... )
  • un script "update-binary-installer" ( indispensable au fonctionnement de la partie tactile du mod... Et du mod tout court, notamment de l'extraction des fichiers vers leurs cibles )
  • un script "aroma-config" ( qui gère l'interface graphique et tactile du mod )

Explications d'origine ( en anglais ) ICI sur le site d'Amarullz.

Les scripts aroma-config et updater-script travaillent de concert via un système de fichiers temporaires pour faire fonctionner le mod, en effet, ils ne fonctionnent pas dans les mêmes processus, cf ces schémas :

Image

Image

Le script aroma-config écrit des fichiers dans un dossier temporaire puis l'updater-script lit ces fichiers et les compare aux règles qui sont écrites dans celui-ci.

Si l'un des deux est mal programmé ou que des ressources manquent dans le zip ( dans le dossier aroma ou dans le reste du zip ), le zip risque de bloquer avec un message d'erreur à un certain moment ou l'install ne se fera simplement pas.

Bien, maintenant, décortiquons ces deux fameux scripts afin de comprendre leur fonctionnement. Dans ce post, je me contenterai de mettre des "bouts" de script, les scripts entiers se trouvant dans le 2ème post ( si celà intéresse certains de les récupérer à des fins d'analyse ). J'utilise pour mon exemple mon mod pour ROM TGP dispo ICI

  1. Code: Select All Code
    ### LICENSE:
    #
    # Copyright (C) 2011 Ahmad Amarullah ( http://amarullz.com/ )
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #
    ### FILE INFO:
    #
    # AROMA Installer 2.51 - AROMA Installer Test Script Configuration
    #       (c) 2011-2012 by Ahmad Amarullah
    #           amarullz - xda-developers
    #           http://www.amarullz.com/
    #
    #       Binary Version  : 2.56
    #       Binary Codename : Edelweis
    #
    ### INFO:
    #
    # * AROMA Resource Dir  = META-INF/com/google/android/aroma
    #
    # * AROMA Temporary Dir = /tmp/aroma/
    #
    # * About Icon          = @alert - show <AROMA Resource Dir>/icons/alert.png
    #                         or if theme used it will find <themedir>/icon.alert.png
    #                         you can still access it via "icons/alert"
    #
    # * dp                  = Device Pixelate. WVGA/QHD = 3, HVGA = 2.
    #                         dp calculated with = round(min(width,height) / 160)
    #
    ###

    ##
    # Fix Colorspace Issue
    #
    # For device which have a problem with color ( not display the correct color )
    # try to set "force_colorspace" with ini_set. It may caused by wrong framebuffer
    # information that passed by kernel into framebuffer device.
    #
    # You can use one of following values:
    #   "rgba", "abgr", "argb", "bgra"
    #
    # NOTE: It must be in top most script, or you will got the color flicker
    #
    # ini_set("force_colorspace","rgba");
    #

    ##
    # Forcing Device Pixelate Size
    #  defaut: floor( min( width, height ) / 160 )
    #
    # Usefull for tablet device, if interface was too big, you can
    # force dp size for smaller UI size.
    #
    #-------- Uncomment one of this to use custom dp size:
    #
    # ini_set("dp","1"); #-- LDPI ( 240x320 / QVGA )
    # ini_set("dp","2"); #-- MDPI ( 340x480 / HVGA )
    # ini_set("dp","3"); #-- HDPI ( 480x800 / WVGA )
    # ini_set("dp","4");
    # ini_set("dp","5");
    #

    #### NOTE >> THIS VERSION DOESN'T NEED ANY CALIBRATION DATA :)

    ##[ DEPRECATED - WONT DO ANYTHING FOR THIS VERSION ]
    # Calibrate Touchscreen - MATRIX METHOD
    #
    # For other device, run the installer, then press "menu"
    # and select Calibrating Tools. Follow Instructions, and make
    # sure the touch screen has been valid in the testing step.
    #
    # In the end, there will be alert dialog with calibration data
    # ( green ), replace this calibrate_matrix() function with that data.
    #
    #-------- Change the value with your device calibration data:
    #
    # Current calibration was for HTC Sensation/XE/4G Devices:
    #
    #calibrate_matrix(
    #  "63052.50",  "840.00",     "-903390.00", "-1680.00",
    #  "125895.00", "-371670.00", "120021.25",  "0"
    #);

    ##[ DEPRECATED ]
    # Calibrate Touchscreen
    #  defaut: HTC Desire Touch Screen Calibrate Data [7.90,20,7.90,20]
    #
    # In the end, there will be alert dialog with calibration data
    # ( green ), replace this calibrate() function with that data.
    #
    #-------- Uncomment This to insert calibrating data:
    # calibrate("7.90","20","7.90","20");
    #


    ##
    # Custom Key Code - Usefull For Some Device which not used
    #                   Standard key code for up/down/select/back/menu
    #
    # You can capture the keycode in
    # recovery using "aroma-keycapture-flashable.zip" Available in
    # AROMA Installer Thread.
    #
    # Press some key when it run, it will return key code,
    # that key can override up/down/select/back/menu actions in
    # AROMA Installer, you can even set your home key for up, or
    # volume down for select item
    #
    #-------- Uncomment & Modify this Code:
    #
    # ini_set("customkeycode_up",     "115");
    # ini_set("customkeycode_down",   "114");
    # ini_set("customkeycode_select", "116");
    # ini_set("customkeycode_menu",   "229");
    # ini_set("customkeycode_back",   "158");
    #


    aroma-config : la-bla légal, changelog partiel et quelques lignes de config.

    Code: Select All Code
    run_program("/sbin/mount", "/cache");
    ui_print("");
    ui_print("********************************");
    ui_print("Merci a tous les membres de la GSTeam et de XDA qui ont rendu ce mod possible");
    ui_print("********************************");
    ui_print("");
    ui_print("");
    ui_print("");
    ui_print("");
    set_progress(0.1);
    unmount("/system");

    mount("ext4", "EMMC", "/dev/block/mmcblk0p12", "/cache");
    mount("ext4", "EMMC", "/dev/block/mmcblk0p13", "/system");
    mount("ext4", "EMMC", "/dev/block/mmcblk0p16", "/data");
    set_progress(0.3);


    updater-script : démarrage du mod et montage des partitions - rien de particulier par rapport à un mod classique
  2. Code: Select All Code
    # Initializing Rom Information
    #
    ini_set("rom_name",             "Mod Aroma Jhowlett I9305");
    ini_set("rom_version",          "Mod V8 for TGP V11.30");
    ini_set("rom_author",           "Jhowlett");
    ini_set("rom_device",           "Galaxy S3 4G I9305");
    ini_set("rom_date",             "15-12-13");


    aroma-config : affichage des infos du mod ( ou de la ROM ) dans l'interface graphique
  3. Code: Select All Code
    ##
    anisplash(
        1,
       "splash/cwm05", 500,
       "splash/cwm", 750,
       "splash/cwm04", 500,
       "splash/cwm", 750,
       "splash/cwm03", 500,
       "splash/cwm", 750,
       "splash/cwm02", 500,
       "splash/cwm", 750,
       "splash/cwm01", 500,
       "splash/cwm", 750,
       "splash/cwm00", 500,
       "splash/cwm", 750,
       "splash/cwmml", 500,
       "splash/cwm", 750,
       "splash/cwmml", 500,
       "splash/cwm", 750,
       "splash/cwmml", 500,
       "splash/cwm", 750,
       "splash/cwmml", 500,
       "splash/cwm", 750
    );

    theme("ics");

    loadlang("langs/fr.lang");
    fontresload( "0", "ttf/Roboto-Regular.ttf", "12" );
    fontresload( "1", "ttf/Roboto-Regular.ttf", "18" );

    ini_set("text_next", "Suivant >");
    ini_set("text_back", "< Retour");


    aroma-config : lancement d'un splashscreen au démarrage du mod ( utilise les png présents dans le dossier \META-INF\com\google\android\aroma\splash reconnu dans le code par le seul code "splash" ), chargment du thème ( présent dans le dossier \META-INF\com\google\android\aroma\themes reconnu dans le code par le seul code "theme" ), chargement du fichier langue ( présent dans le dossier \META-INF\com\google\android\aroma\langs reconnu dans le code par le seul code "langs" ), de la police ( présent dans le dossier \META-INF\com\google\android\aroma\fonts ) et attribution des textes aux touches retour et suivant de l'interface graphique.
  4. Code: Select All Code
    viewbox(
        "Bienvenue",
        "Vous allez installer le <b>"+
         ini_get("rom_name")+
       "</b> pour <b>"+ini_get("rom_device")+"</b>.\n\n"+
       "Informations sur le Mod:\n\n"+
          "  VERSION\t: <b><#selectbg_g>"+ini_get("rom_version")+"</#></b>\n"+
          "  UPDATED\t: <b><#selectbg_g>"+ini_get("rom_date")+"</#></b>\n\n\n"+
        "",
        "@welcome"
    );


    aroma-config : notes de version
  5. Code: Select All Code
    textbox(
      "Changelog",
      "<b>"+ini_get("rom_name")+"</b> changelog:",
      "@info",
      readfile_aroma("changelog.txt")
    );


    aroma-config : affichage du changelog ( fichier txt présent à la racine du dossier \META-INF\com\google\android\aroma )
  6. ( et là çà se complique :mrgreen: )
    Code: Select All Code
       selectbox(
             "Bootanimation",
             "Selectionnez la bootanimation",
             "@personalize",
             "anim.prop",

             "Aucun Changement","...",1,
             "Stock CM10","...",0,
             "GSTeam","...",0,
            "Mbokeh","...",0,
            "Rock Numbers","...",0,
            "Speedo","...",0,
            "Tauri","...",0
          );
     
     if prop("anim.prop","selected.0")=="2" then
       splash(4000, "stockcm10");
        if
         confirm(
              "Bootanimation",
              "Voulez vous garder cette Bootanimation ?",
              "@info"
          )=="no"
        then
          back("1");
        endif;
     endif;
     
      if prop("anim.prop","selected.0")=="3" then
       splash(4000, "gsteam");
        if
         confirm(
              "Bootanimation",
              "Voulez vous garder cette Bootanimation ?",
              "@info"
          )=="no"
        then
          back("1");
        endif;
     endif;

      if prop("anim.prop","selected.0")=="4" then
       splash(4000, "mbokeh");
        if
         confirm(
              "Bootanimation",
              "Voulez vous garder cette Bootanimation ?",
              "@info"
          )=="no"
        then
          back("1");
        endif;
     endif;

     if prop("anim.prop","selected.0")=="5" then
       splash(4000, "rocknumbers");
        if
         confirm(
              "Bootanimation",
              "Voulez vous garder cette Bootanimation ?",
              "@info"
          )=="no"
        then
          back("1");
        endif;
     endif;

     if prop("anim.prop","selected.0")=="6" then
       splash(4000, "speedo");
        if
         confirm(
              "Bootanimation",
              "Voulez vous garder cette Bootanimation ?",
              "@info"
          )=="no"
        then
          back("1");
        endif;
     endif;

     if prop("anim.prop","selected.0")=="7" then
       splash(4000, "tauri");
        if
         confirm(
              "Bootanimation",
              "Voulez vous garder cette Bootanimation ?",
              "@info"
          )=="no"
        then
          back("1");
        endif;
     endif;


    aroma-config : affichage d'une boîte de dialogue demandant de sélectionner la bootanim à installer ( bloc jusqu'au ";" ), les blocs à la suite donne le comportement en fonction du choix effectué : si on fait le 7ème choix ( l'anim "tauri" ), on a un splash de présentation du bootanim ( png à la base du dossier aroma ) et on a la phrase "Voulez vous garder cette Bootanimation ?" avec les choix "oui" ou "non". La ligne "anim.prop", sert à attacher ce menu au code correspondant dans l'updater-script ( et vice-versa ? ). Par défaut je choisis comme nom pour "x.prop" un nom proche du paramètre concerné ( anim.prop par exemple pour les bootanims )

    /!\ /!\ /!\

    Code: Select All Code
     selectbox(
             "Bootanimation",
             "Selectionnez la bootanimation",
             "@personalize",
             "anim.prop",

             "Aucun Changement","...",1,
             "Stock CM10","...",0,
             "GSTeam","...",0,
            "Mbokeh","...",0,
            "Rock Numbers","...",0,
            "Speedo","...",0,
            "Tauri","...",0


    'tite précision sur les "selectbox" ( les boîtes QCM où on fait ses choix comme celle en photo au tout début du topic ) : chaque ligne de choix ( style < "Aucun Changement","...",1, > ) se finit par une virgule SAUF la dernière où ne met rien après le zéro, ni virgule ni espace. La moindre erreur de syntaxe sur cette dernière ligne et votre mod bloquera.


    Code: Select All Code
    # Bootanimation
       if
        file_getprop("/tmp/aroma/anim.prop","selected.0") == "2"
       then
       ui_print("@  Installation Bootanimation CM10");
       package_extract_dir("update_files/bootanims/CM10", "/system/media");
       endif;
       if
        file_getprop("/tmp/aroma/anim.prop","selected.0") == "3"
       then
       ui_print("@  Installation Bootanimation GSTeam");
       package_extract_dir("update_files/bootanims/GSTeam", "/system/media");
       endif;
       if
        file_getprop("/tmp/aroma/anim.prop","selected.0") == "4"
       then
       ui_print("@  Installation Bootanimation Mbokeh");
       package_extract_dir("update_files/bootanims/Mbokeh", "/system/media");
       endif;
       if
        file_getprop("/tmp/aroma/anim.prop","selected.0") == "5"
       then
       ui_print("@  Installation Bootanimation RockNumbers");
       package_extract_dir("update_files/bootanims/RockNumbers", "/system/media");
       endif;
       if
        file_getprop("/tmp/aroma/anim.prop","selected.0") == "6"
       then
       ui_print("@  Installation Bootanimation Speedo");
       package_extract_dir("update_files/bootanims/Speedo", "/system/media");
       endif;
       if
        file_getprop("/tmp/aroma/anim.prop","selected.0") == "7"
       then
       ui_print("@  Installation Bootanimation Tauri");
       package_extract_dir("update_files/bootanims/Tauri", "/system/media");
       endif;


    updater-script : chaque possibilité de choix ( confirmée par oui ) dans l'interface graphique va déclencher l'action correspondante dans l'updater script. Si la bootanim tauri est sélectionnée, alors anim.prop=7 donc celà va déclencher l'extraction des fichiers contenus dans le dossier update_files/bootanims/Tauri vers /system/media ( cf diagramme explicatif d'Aroma au-dessus ou ICI et ICI).

Les mêmes schémas se répètent pour tous les paramètres sujets à des choix. La config "particulière" d'Aroma n'empêche pas l'exécution de commandes plus simples à l'intérieur de l'updater-script du style :

Code: Select All Code
package_extract_dir("/system", "/system");


Vu la config "multi-choix" du mod, impossible de respecter l'arborescence exacte de l'appareil-cible. Mon mod est rangé comme çà pour les bootanims par exemple :

Image

Image

Image

On ne conservera des arborescences identiques que pour des fichiers ne dépendant pas de choix. Cependant, pour des fichiers en batch, on peut respecter cette arborescence en jouant sur un rangement en sous-dossiers.

Petite précision sur la structure de mon zip :

Image

Image

Ces deux dossiers sont des dossiers permettant une install via vrtheme ( le 1er contient les scripts et pour des raisons techniques, j'ai créé un autre dossier, le 2ème, avec les ressources ).
Correctement programmé, Aroma est donc parfaitement compatible avec vrtheme, ce qui permet de flasher des fichiers directement DANS un apk, ce qui permet d'alléger le mod et d'éviter d'extraire et de modder des apk.

3 points sur lesquels je n'ai peut-être pas assez insisté ( merci à @Kris92fr ;) ) :
  • Aroma peut être utilisé pour customiser totalement l'install d'une ROM ( kernel, modem, thème, fichier build.prop... ). En ses temps où la personnalisation atteint des sommets, pourquoi ne pas avoir sa ROM "à soi" ?
  • malgré des variations par rapport à un update.zip "classique", un zip Aroma reste un zip flashable "lambda". Les ressources d'un zip Aroma sont donc aisément manipulables : les fichiers peuvent être ajoutés au zip ou extraits via n'importe quel logiciel de compression / décompression et les scripts sont éditables via par exemple Notepad++.
  • autre point TRES important, car source d'erreur ( merci encore à @Kris92fr, cf ce post, que je vais citer après quelques modifs à la suite ).

Voici donc une grosse source d'erreur à l'écriture ou la modification des scripts :

kris92fr a écrit:Au niveau des box (Select ou Check), il faut prendre en compte que le codage se fait sur 2 fichiers updater-script et aroma-config.


Comme je l'ai déjà dit, effectivement, bien qu'opérant dans des processus différents, ces 2 scripts interagissent entre eux.

kris92fr a écrit:Image

On voit sur l'image ci-dessus dans la partie aroma-config les deux lignes suivantes :

"Clavier Silver","Installer Clavier Silver",1, #-- selected.1 = 1
"Clavier Stock","Installer Clavier Stock",0 #-- selected.1 = 2

titre qui sera affiché dans la fenêtre Aroma
sous titre qui sera affiché dans la fenêtre Aroma
1 signifie que c'est coché 0 la case n'est pas coché par défaut
selected.1 = 1 est la référence qui sera renvoyé si la case est cochée

Dans l'image ci dessus on voit que le clavier Silver à la référence 1 et le clavier Stock la 2. Il faut que ceci soit identique dans le fichier updater-script.

En cas d'inversion dans les références, si la case du clavier Silver est cochée dans ce cas ce serait le clavier stock qui serait installé.

En revanche si les 2 ligne ont la même référence - 1 par exemple alors quelque soit le choix fait dans l'Aroma seul le clavier silver sera installé.
Scripts cités en exemple provenant de la ROM Tomcat de @Kris92 ( merci à lui pour ces précisions )


En conclusion zip Aroma n'est donc pas une version "mystique" ( de part sa structure légèrement différente ) et fermée ( il reste autant modifiable ) d'un update.zip classique : c'est juste une variante certes plus complexe mais tellement plus souple et pratique.

Les images sont pour la plupart des liens cliquables ouvrant le lien vers le site associé OU l'image source.
Crédits image : s4miniarchive.com, Amarullz.com, XDA et captures d'écran PC faites par moi-même.

35 réponse(s) -