Présentation de la version 13
La version 13 de l’application Messaging de GrapheneOS remplace l’interface héritée par une implémentation entièrement refondue en Jetpack Compose et Material 3. Cette mise à jour s’accompagne d’une hausse du niveau d’API : le minSdk passe à 36, le targetSdk et le compileSdk à 37, tandis que l’Android Gradle Plugin est mis à 9.3.2. Le projet utilise Kotlin 2.4.10, Gradle 9.7.1, Glide 5.0.9, Guava 33.7.1 et libphonenumber 9.0.38, ainsi que le nouveau Compose BOM 2026.08.00.
Ces changements de dépendances indiquent une volonté d’aligner l’application sur les dernières bibliothèques Android, ce qui améliore la compatibilité avec les nouvelles versions du système tout en imposant une contrainte de mise à jour pour les appareils ne supportant pas l’API 36.
Architecture et refonte UI avec Jetpack Compose
Chaque écran a été reconstruit en Compose, ce qui permet de déclarer l’interface de façon réactive. Le nouveau design adopte le système Material 3 avec des formes expressives et un icône adaptatif incluant une variante monochrome. Sur les tablettes et les écrans larges, la conversation s’affiche en deux panneaux, grâce à la prise en charge native du layout adaptatif de Compose.
La liste des conversations intègre des actions de glissement pour archiver ou désarchiver, ainsi que des indicateurs visuels pour les conversations épinglées, en veille, ou bloquées. Les fonctions de « pin », de « snooze » (1, 8 ou 24 heures, ou indéfiniment) et de marquage comme non lu sont désormais accessibles depuis le menu ou le geste de glissement, ce qui réduit le nombre d’étapes nécessaires pour gérer les discussions.
Le sélecteur de destinataires a été repensé avec des sections alphabétiques, la prise en charge d’adresses e‑mail et la possibilité d’associer plusieurs numéros à un même contact, améliorant la précision du routage des SMS/MMS.
Sécurité et gestion des ressources
Le code introduit plusieurs garde-fous de sécurité : les PendingIntent utilisent désormais le drapeau FLAG_IMMUTABLE lorsqu’ils ne nécessitent pas de mutabilité, limitant les vecteurs d’attaque par injection. Les récepteurs de widget ne sont plus exportés et les intents du widget sont restreints à l’application, ce qui empêche les appels externes non autorisés.
Des limites d’allocation ont été ajoutées aux parsers EXIF APP1, MMS PDU et aux types de contenu MMS, réduisant le risque de dépassement de mémoire lors du traitement d’images ou de pièces jointes volumineuses. La validation du contenu partagé rejette les URI de type file: et les fichiers privés, tout en vérifiant les permissions des URI de contenu.
Des correctifs spécifiques ciblent des vulnérabilités connues : correction d’une dérférence nulle dans les GIF, vérifications de dimensions avant la transcodification native, et prévention de la corruption de couleur liée aux caractères signés. Le parseur vCard d’AOSP a été mis à jour avec les correctifs upstream, et les listes de personnes dans les notifications sont maintenant bornées, éliminant un plantage signalé précédemment.
Implications pratiques et limites
Les améliorations de stabilité se traduisent par la suppression de plusieurs plantages, notamment dans le widget, les insertions de base de données SMS et les réponses rapides aux appels refusés. Les notifications non lues survivent aux redémarrages, et les messages de classe 0 affichent correctement le délai d’expiration.
Le support multi‑utilisateur a été renforcé : les notifications secondaires affichent le contenu du message avec des identifiants uniques, et les conversations de profil professionnel sont clairement étiquetées. L’accessibilité bénéficie d’étiquettes pour les lecteurs d’écran, d’annonces de dates complètes et d’actions de copie des détails de message.
En contrepartie, le passage à minSdk 36 exclut les appareils fonctionnant sous Android 12 ou antérieur, ce qui peut réduire la base d’utilisateurs potentiels. De plus, l’adoption de Compose, bien que moderne, impose un coût de calcul supplémentaire lors du rendu initial, ce qui peut impacter les performances sur les appareils aux ressources limitées.