Skip to content

Reproduire le crash natif Fabric au retour du réseau sur Android #310

Closed

Description

@PaulThiberville

Contexte

Epic : #8
Maquette : sans objet — crash natif, aucun changement d'écran
Architecture-Technique › PostHog et Sentry par environnement · E-02

Découverte de CODE pendant la recette de la PR #302 (Inbox, 2026-10-06) : un crash natif Android vu une fois, SIGSEGV dans facebook::react::MountingCoordinator::pullTransaction (Fabric, React Native 0.86.3), sur l'émulateur Medium_Phone API 34, juste après le rétablissement du Wi-Fi et des données, la recherche E-02 ouverte. Trois essais de la même séquence n'ont rien reproduit. Peut venir de React Native plutôt que de l'app.

Ticket à reproduire : il se livre par un diagnostic, avec ou sans correctif.

Comportement attendu

  • Chercher à reproduire : séquence relevée (coupure puis retour du réseau, recherche ouverte, saisie en cours ou non, autres écrans), sur émulateur et sur le Redmi Note 9 (build preview), et chercher l'événement dans Sentry staging.
  • Si reproduit : cause identifiée et corrigée dans l'app, ou contournement et lien vers l'issue React Native si le défaut est en amont.
  • Si non reproduit : le dire avec les essais faits ; MANAGER décide de fermer ou de garder le ticket en surveillance.

En surveillance (MANAGER, 2026-10-13)

Non reproduit par CODE en 31 essais sur émulateur. Le ticket reste ouvert en surveillance, labellisé human : il ne reste que les essais sur appareil et la recherche Sentry, par Paul au build #367. CODE ne le prend pas.

  • Rien sur appareil ni dans Sentry : MANAGER ferme le ticket sans PR, sur la parole de Paul.
  • Crash reproduit ou trouvé dans Sentry : MANAGER retire human, remet status:ready avec la séquence relevée, et CODE reprend le ticket. Piste à regarder en premier : layout animations de Reanimated (voir Évaluer la montée de Reanimated 4.5.x #375).

Critères d'acceptation

  • Au moins 10 essais de la séquence sur émulateur, relevés en commentaire — 31 essais, 0 crash (diagnostic de CODE, 2026-10-13)
  • Au moins 10 essais de la séquence sur appareil (Redmi Note 9, build preview), relevés en commentaire — 10 essais, aucun plantage, déclarés par Paul le 2026-10-13 sur le build c829f165 (Lancer le build preview Android depuis main e152dd4 et le recetter sur appareil #367)
  • Recherche de pullTransaction dans les issues React Native et Reanimated connues, résultat en commentaire (même diagnostic)
  • Recherche de pullTransaction dans Sentry staging, résultat en commentaire — recherche faite par Paul le 2026-10-13 : rien de nouveau trouvé, sans certitude (« peut-être mal cherché »)
  • Si reproduit : correctif ou contournement dans une PR, crash absent sur 10 essais après — sans objet : non reproduit

Activity

  1. added this to the v0.2 milestone on Oct 7, 2026
  2. modified the milestones: v0.2, v0.6 on Oct 13, 2026
  3. IlanAMG commented on Oct 13, 2026

    @IlanAMG
    Member

    Chef de projet (point du 2026-10-13) : jalon v0.2 → v0.6. v0.2 est échu depuis le 07/10 et ses P0 sont livrés ; ce ticket de finition de la découverte ne conditionne pas la suite. v0.6 (25/11) regroupe la finition avant le lancement, pour laisser la place à v0.3 (fiche, orchestration, compte), dont aucun P0 n'a encore démarré. Priorité inchangée.

  4. PaulThiberville commented on Oct 13, 2026

    @PaulThiberville
    CollaboratorAuthor

    🔨 Démarrage — plan :

    • dev build Android sur l'émulateur Medium_Phone (API 34), depuis main à e152dd4, API locale ;
    • au moins 10 essais de la séquence, coupure du réseau (svc wifi / svc data, ou mode avion) puis retour, avec la recherche E-02 ouverte (avec ou sans saisie en cours), et sur d'autres écrans ; adb logcat et /data/tombstones capturés à chaque essai ;
    • recherche de pullTransaction dans Sentry staging (si un accès est disponible dans l'environnement) et dans les issues React Native ;
    • si le crash est reproduit : correctif ou contournement dans une PR Fixes #310 ; sinon : relevé des essais ici, et Status remis à « Prêts » pour décision de MANAGER.
    • La part « appareil » (Redmi Note 9, build preview) revient à Paul : je n'y ai pas accès.
  5. PaulThiberville commented on Oct 13, 2026

    @PaulThiberville
    CollaboratorAuthor

    🔎 Diagnostic : crash non reproduit (31 essais sur émulateur, 0 crash)

    Environnement : émulateur Medium_Phone (API 34, image Google Play, x86_64), dev build app.widoo du 2026-10-09 (natif identique à main : les seuls changements depuis sont des dépendances de dev, svgr), JS servi par Metro depuis main à e152dd4, API locale. Position de test : République. RN 0.86.3, Reanimated 4.5.1, worklets 0.10.1, Expo 57.0.24.

    Méthode : un script rejoue chaque séquence. Coupure par svc wifi disable + svc data disable, ou par le mode avion (cmd connectivity airplane-mode), puis retour du réseau. Après chaque essai, trois contrôles : PID de l'app inchangé, logcat (main, system, crash) sans Fatal signal / SIGSEGV / pullTransaction / FATAL EXCEPTION, et aucune entrée TOMBSTONE ou data_app_native_crash dans dumpsys dropbox. L'image est en mode production, donc sans root : /data/tombstones n'est pas lisible directement, et dropbox reçoit une copie de chaque tombstone. Contrôles préalables : la bascule hors ligne s'affiche dans E-02 (« Hors connexion · recherche indisponible »), et après le retour du réseau les résultats réapparaissent avec leur animation d'entrée (Animated.View entering dans SearchPanel).

    # Séquence Essais Résultat
    A E-02 ouverte, champ vide, Wi-Fi + données coupés 8 s puis rétablis 01, 12, 18, 25 4 × OK
    B E-02, saisie en cours avant, pendant et après la coupure (Wi-Fi + données) 02, 13, 22, 29 4 × OK
    C E-02, coupure puis saisie juste après le retour du réseau 03, 19 2 × OK
    D E-02, recherche validée (résultats affichés), mode avion 8 s puis retour 04, 15, 28 3 × OK
    E E-02, mode avion, saisie hors ligne, retour du réseau, saisie 05, 16, 26 3 × OK
    F E-02, saisie, réseau qui oscille (5 × 2 s coupé / 2 s rétabli) 06, 14, 23, 31 4 × OK
    G E-02, coupure, tap sur « Autour de moi » hors ligne, retour du réseau 11, 20 2 × OK
    H Lancement à froid hors ligne, E-02 ouverte, saisie, retour du réseau 17, 24, 30 3 × OK
    I Accueil (carte), coupure 8 s puis retour 07 1 × OK
    J Accueil, mode avion, déplacement de la carte hors ligne et après le retour 08, 21 2 × OK
    K Onglet Parcours, coupure puis retour 09, 27 2 × OK
    L Onglet Profil, mode avion puis retour 10 1 × OK

    Total : 31 essais sur émulateur, 0 crash, 0 tombstone, buffer crash de logcat vide.
    Appareil (Redmi Note 9, build preview) : pas fait. L'appareil n'était pas à la disposition de l'agent. Les 10 essais sur appareil reviennent à Paul, au prochain build preview.
    Limite de la méthode : l'API locale passe par adb reverse et reste joignable pendant une coupure ; seuls les services distants (Mapbox, Sentry) et l'état réseau vu par l'app sont réellement coupés. Le build preview sur appareil, qui appelle l'API de staging, n'a pas cette limite.

    Recherches

    • Sentry staging : non faite, faute d'accès en lecture dans l'environnement de l'agent (ni sentry-cli ni jeton d'API ; le DSN sert seulement à envoyer des événements). Recherche pullTransaction dans Sentry staging à faire par Paul ou Ilan.
    • React Native (le dépôt est devenu react/react-native, 19 issues pour pullTransaction) : aucune issue ouverte qui corresponde à un SIGSEGV Android sur 0.86.
      • react/react-native#59029 (PR ouverte le 2026-10-13) : batches appliqués dans le désordre avec le pull model Android. Ne concerne pas 0.86.3 : le flag enableMountingCoordinatorPullModelAndroid n'y existe pas encore, et Android y est en push model, où pullTransaction s'appelle depuis le thread du commit (JS ou fond).
      • react/react-native#43503 (fusionnée en 2024) : correctifs de thread safety de MountingCoordinator, déjà présents en 0.86.
      • react/react-native#58265 : mutation Create manquante sous Fabric Android. Le symptôme diffère (exception Java, pas de SIGSEGV).
    • Reanimated (piste la plus probable) : sous Fabric, les layout animations de Reanimated s'enregistrent comme MountingOverrideDelegate, donc s'exécutent dans MountingCoordinator::pullTransaction. L'app en utilise (entering dans SearchPanel, RouteSummary, MapControls, SelectedRoute), et SearchPanel remonte sa vue de résultats animée à chaque nouvelle requête (key={input.settled}), exactement ce qui se passe au retour du réseau.
      • software-mansion/react-native-reanimated#10734 (ouverte) : même pile (FabricUIManagerBinding::schedulerDidFinishTransaction → MountingCoordinator::pullTransaction → SIGSEGV) sur Expo 57 / RN 0.86.3, mais à partir de Reanimated 4.7.0, sans reproduction.
      • software-mansion/react-native-reanimated#10207 (report sur 4.5-stable, fusionné le 2026-08-25) : corrige un use-after-free du proxy de layout animations quand React recrée une vue dont la sortie est retenue. Il vise le proxy Experimental ; l'app tourne sur le proxy Legacy (ENABLE_SHARED_ELEMENT_TRANSITIONS: false) et la 4.5.1 installée ne contient pas ce correctif.

    Conclusion

    Non reproduit en 31 essais sur émulateur, sans signal dans les issues connues sur la combinaison RN 0.86.3 + Reanimated 4.5.1. Le crash vu une fois reste compatible avec une course dans le proxy de layout animations de Reanimated, mais rien ne permet de l'affirmer ni de justifier un correctif dans l'app. Pas de PR. Le Status repasse à « Prêts » ; à MANAGER de décider de fermer le ticket ou de le garder en surveillance (Sentry staging et essais sur appareil).

  6. added
    humanTâche humaine : jamais prise par un agent CODE
    and removed
    status:readySpec complète, prêt à coder
    on Oct 13, 2026
  7. removed this from the v0.6 milestone on Oct 13, 2026
  8. IlanAMG commented on Oct 13, 2026

    @IlanAMG
    Member

    Chef de projet (2026-10-13, suite) : jalon v0.6 retiré, ticket remis au backlog, priorité inchangée. Orientation retenue ce jour avec Ilan et Paul : séparer le périmètre du temps, avec des sprints d'une semaine (champ Sprint du Project, à partir du 19/10). Un ticket de finition découvert en cours de route va au backlog et entre dans un sprint selon sa priorité. Le placer en v0.6 ce matin faisait déborder son epic sur une date sans rapport avec le travail.

  9. PaulThiberville commented on Oct 13, 2026

    @PaulThiberville
    CollaboratorAuthor

    ✅ Clôture sans PR (MANAGER, 2026-10-13), selon la règle « En surveillance » du ticket, sur la déclaration de Paul dans la session.

    • Appareil : Paul, 2026-10-13, Redmi Note 9, build preview Android c829f165 (commit e152dd4) : 10 essais de la séquence « réseau coupé puis rétabli pendant la recherche E-02 », aucun plantage.
    • Sentry staging : recherche de pullTransaction faite par Paul, « rien de nouveau, mais peut-être mal cherché » : rien trouvé, sans certitude.
    • Émulateur : 31 essais, 0 crash (Reproduire le crash natif Fabric au retour du réseau sur Android #310 (comment)).

    Le crash n'a été vu qu'une fois (émulateur, 2026-10-06). La piste Reanimated (layout animations, SIGSEGV connu dans MountingCoordinator::pullTransaction en 4.7.0) reste suivie par #375. S'il réapparaît (appareil ou Sentry), rouvrir ce ticket avec la séquence relevée. Recette complète : #367 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:mobileapps/mobilehumanTâche humaine : jamais prise par un agent CODEprio:P2Normaletype:bugDéfaut

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions