Cyril Mottier

“It’s the little details that are vital. Little things make big things happen.” – John Wooden

Astuce #4 : Minimiser l'Utilisation Des Vues, Le Retour !

J'avais déjà donné une astuce lors d'un précédent article expliquant la nécessité de minimiser l'utilisation des vues. Cela permet d'une part de minimiser la mémoire consommée et de sauver du temps CPU lors de la passe de mesure par exemple. Les lecteurs auront probablement remarqué que l'article était plus rédigé sous forme de “à faire/à ne pas faire” plutôt que sous forme “d'astuce”.

Pour résumer succinctement, la conclusion de l'astuce de mon précédent article était : “Réfléchissez à ce que vous faites, ne faites pas de choses inutiles”. L'objectif était bien sûr de vous faire comprendre les problèmes engendrés par l'utilisation abusives de vues. J'espère sincèrement qu'à la lecture de l'astuce #1 vous avez réétudié l'ensemble de vos interfaces et que le nombre de View et de ViewGroup utilisés a été revu à la baisse. Maintenant que vous maitrisez tous le sujet, je pense qu'il est temps de vous faire part d'une nouvelle astuce qui vous permettra d'optimiser votre hiérarchie de vues (ou plus précisément de vérifier la minimalité de l'arbre des vues) : l'outil layoutopt.

L'outil layoutopt est disponible dans le SDK Android (sous le dossier tools) et s'utilise très simplement :

layoutopt <dossier/fichiers à analyser>

Prenons l'example d'un fichier XML non minimal tel que le suivant (fichier nommé bad.xml) :

bad.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Minimisez l'utilisation des vues !" />
    </RelativeLayout>

</FrameLayout>

En utilisant un peu nos méninges, on se rend facilement compte que le FrameLayout est inutile. L'arbre optimal devrait normalement être de la forme suivante (fichier nommé good.xml) :

good.xml
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Minimisez l&apos;utilisation des vues !" />

</RelativeLayout>

L'utilisation de layoutopt sur les deux fichiers précédents affiche la sortie suivante :

MacBook-Pro-de-Cyril-Mottier:tools cyrilmottier$ ./layoutopt /Users/cyrilmottier/Desktop/testfolder/
/Users/cyrilmottier/Desktop/testfolder/bad.xml
    5:20 The root-level <FrameLayout/> can be replaced with <merge/>
    10:18 This RelativeLayout layout or its FrameLayout parent is useless
/Users/cyrilmottier/Desktop/testfolder/good.xml

La sortie donnée par layoutopt sur bad.xml est assez explicite et mentionne que FrameLayout ou RelativeLayout est inutile. Le fichier good.xml est considéré comme minimal. Super non? Vous pensez maintenant que vos méninges sont inutiles? Malheureusement non … Android a beau fournir de superbes outils, il ne peut pas réfléchir pour vous. Si le seul et unique but de votre UI est d'afficher un texte au centre de l'écran, il est encore possible de minimiser l'interface précédente :

really_good.xml
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:text="Minimisez l'utilisation des vues !" />

A vous de jouer. Minimisez bien !