← Journal technique
EduQate·frontend

Deux gyroscopes et un crash pour mémoire insuffisante

Two decorative components each called useAnimatedSensor independently, leaking until the Fabric renderer threw java.lang.OutOfMemoryError failing a 16-byte allocation.

Visible seulement en s'en servant

Invisible à la relecture du code. Trouvé en étant le vrai utilisateur, sur un vrai appareil, à une vraie largeur.

Reçu un java.lang.OutOfMemoryError en direct de l'application en fonctionnement — moteur de rendu Fabric, incapable d'allouer 16 octets sur un tas presque plein. Une petite allocation qui échoue signifie généralement que quelque chose fuit depuis un moment plutôt qu'une grosse allocation qui fait sauter le budget.

GeometryField et InteractiveGeometry, deux composants décoratifs, appelaient chacun indépendamment useAnimatedSensor(SensorType.ROTATION, ...) — un vrai abonnement natif. Ils sont utilisés ensemble constamment (authentification, tableau de bord, organisations, programmes, candidatures, documents, conversations, messages), donc jusqu'à deux écouteurs natifs vivants par écran à deux intervalles de sondage tant que l'écran restait monté. useAnimatedSensor a aussi un antécédent sur plusieurs versions de Reanimated de ne pas démonter proprement son écouteur au fast refresh, et j'avais hot-reloadé un de ces écrans à répétition juste avant le crash.

Remplacé par un contexte partagé qui appelle useAnimatedSensor une fois à la racine de l'application. Un composant décoratif peut détenir une vraie ressource native, et le coût n'apparaît jamais avant que tu n'itères sur l'arbre exact où il vit. Deux composants qui vont indépendamment chercher la même capacité de plateforme méritent qu'on le remarque même quand chacun a l'air bien seul — le même instinct que le pooling de connexions.