Forcer les boutons virtuels sur Android Ice Cream Sandwich

La version Ice Cream Sandwich d'Android apporte les boutons virtuels (qui existaient dans Honeycomb) aux téléphones. Avec ces boutons virtuels, les fonctions de retour à l'écran précédent, de bond à l'écran parent ou d'affichage des tâches en attente n'ont plus besoin d'être déclenchées par des boutons physiquement sur l'appareil.

Conséquence : le dernier né de la gamme Nexus ne possède plus de bouton de navigation physique. Sans doute un avantage en termes de coût pour la production, mais également intéressant car on gagne un peu en espace d'écran (on peut voir les boutons virtuels s'éclipser dans certains cas, par exemple la lecture de vidéos).

J'ai toutefois découvert une autre utilité à ces boutons virtuels : pallier à des boutons physiques devenus défectueux.

Toutefois, par défaut, les images d'Android compilées pour des téléphones à touches physiques ne présentent pas les boutons virtuels. Voyons donc comment réactiver cet élément d'affichage. Quelle liberté !

Récupérons d'abord le fichier applicatif framework-res.apk qui se trouve dans /system/framework. Nous allons décompiler ce fichier applicatif, le modifier, le recompiler et le placer à nouveau dans le téléphone.

Pour le récupérer, connectons-nous via adb au téléphone :

adb pull /system/framework/framework-res.apk

Décompilons le fichier obtenu à l'aide des apktools : http://code.google.com/p/android-apktool/downloads/list Dans mon cas (ICS 4.0.4 via la ROM CyanogenMod 9 RC2 pour Samsung Galaxy S), il m'a fallu décompiler avec la version 1.4.2 et recompiler avec la version 1.4.3 des apktools :

java -jar apktool.jar d framework-res.apk

Le contenu du paquet est extrait dans un dossier ./framework-res.

On modifie alors le contenu du fichier ./framework-res/res/values/bools.xml et on transforme la ligne

<bool name="config_showNavigationBar">false</bool>

en

<bool name="config_showNavigationBar">true</bool>

On peut également désactiver le rétro-éclairage des boutons physiques en modifiant le fichier arrays.xml (dans le même répertoire) : 0 signifiant éteint et 1 allumé de manière assez intuitive.

<integer-array name="config_autoBrightnessButtonBacklightValues">
<item>0</item>
....
</integer-array>

Une fois les modifications effectuées, il est possible de recompiler l'ensemble :

java -jar apktool.jar b framework-res

et un nouveau paquet framework-res.apk est disponible. Comme nous n'avons modifié que les contenus des fichiers xml de ressources, alors on peut ouvrir le package nouvellement créé avec 7zip et en extraire le fichier resources.arc. On peut alors ouvrir le paquet original et verser le fichier resources.arc à l'intérieur (en remplacement de l'existant). On peut alors replacer l'apk hybride créé sur le téléphone :

adb push framework-res.apk /system/framework/framework-res.apk

On redémarre le téléphone et si tout a bien fonctionné, les boutons virtuels sont désormais affichés en bas du téléphone en remplacement des boutons physiques défectueux !